@@ -146,6 +146,15 @@ dfsan_union(dfsan_label l1, dfsan_label l2) {
146
146
return l1 | l2;
147
147
}
148
148
149
+ static const uptr kOriginAlign = sizeof (dfsan_origin);
150
+ static const uptr kOriginAlignMask = ~(kOriginAlign - 1UL );
151
+
152
+ static uptr OriginAlignUp (uptr u) {
153
+ return (u + kOriginAlign - 1 ) & kOriginAlignMask ;
154
+ }
155
+
156
+ static uptr OriginAlignDown (uptr u) { return u & kOriginAlignMask ; }
157
+
149
158
// Return the origin of the first taint byte in the size bytes from the address
150
159
// addr.
151
160
static dfsan_origin GetOriginIfTainted (uptr addr, uptr size) {
@@ -205,15 +214,6 @@ static u32 ChainOrigin(u32 id, StackTrace *stack, bool from_init = false) {
205
214
return chained.raw_id ();
206
215
}
207
216
208
- static const uptr kOriginAlign = sizeof (dfsan_origin);
209
- static const uptr kOriginAlignMask = ~(kOriginAlign - 1UL );
210
-
211
- static uptr AlignUp (uptr u) {
212
- return (u + kOriginAlign - 1 ) & kOriginAlignMask ;
213
- }
214
-
215
- static uptr AlignDown (uptr u) { return u & kOriginAlignMask ; }
216
-
217
217
static void ChainAndWriteOriginIfTainted (uptr src, uptr size, uptr dst,
218
218
StackTrace *stack) {
219
219
dfsan_origin o = GetOriginIfTainted (src, size);
@@ -231,14 +231,14 @@ static void ChainAndWriteOriginIfTainted(uptr src, uptr size, uptr dst,
231
231
static void CopyOrigin (const void *dst, const void *src, uptr size,
232
232
StackTrace *stack) {
233
233
uptr d = (uptr)dst;
234
- uptr beg = AlignDown (d);
234
+ uptr beg = OriginAlignDown (d);
235
235
// Copy left unaligned origin if that memory is tainted.
236
236
if (beg < d) {
237
237
ChainAndWriteOriginIfTainted ((uptr)src, beg + kOriginAlign - d, beg, stack);
238
238
beg += kOriginAlign ;
239
239
}
240
240
241
- uptr end = AlignDown (d + size);
241
+ uptr end = OriginAlignDown (d + size);
242
242
// If both ends fall into the same 4-byte slot, we are done.
243
243
if (end < beg)
244
244
return ;
@@ -252,11 +252,11 @@ static void CopyOrigin(const void *dst, const void *src, uptr size,
252
252
return ;
253
253
254
254
// Align src up.
255
- uptr s = AlignUp ((uptr)src);
256
- dfsan_origin *src_o = (dfsan_origin *) origin_for ((void *)s );
257
- u32 *src_s = (u32 *)shadow_for ((void *)s );
258
- dfsan_origin *src_end = (dfsan_origin *) origin_for ((void *)(s + (end - beg)));
259
- dfsan_origin *dst_o = (dfsan_origin *) origin_for ((void *)beg);
255
+ uptr src_a = OriginAlignUp ((uptr)src);
256
+ dfsan_origin *src_o = origin_for ((void *)src_a );
257
+ u32 *src_s = (u32 *)shadow_for ((void *)src_a );
258
+ dfsan_origin *src_end = origin_for ((void *)(src_a + (end - beg)));
259
+ dfsan_origin *dst_o = origin_for ((void *)beg);
260
260
dfsan_origin last_src_o = 0 ;
261
261
dfsan_origin last_dst_o = 0 ;
262
262
for (; src_o < src_end; ++src_o, ++src_s, ++dst_o) {
@@ -276,34 +276,33 @@ static void CopyOrigin(const void *dst, const void *src, uptr size,
276
276
static void ReverseCopyOrigin (const void *dst, const void *src, uptr size,
277
277
StackTrace *stack) {
278
278
uptr d = (uptr)dst;
279
- uptr end = AlignDown (d + size);
279
+ uptr end = OriginAlignDown (d + size);
280
280
281
281
// Copy right unaligned origin if that memory is tainted.
282
282
if (end < d + size)
283
283
ChainAndWriteOriginIfTainted ((uptr)src + (end - d), (d + size) - end, end,
284
284
stack);
285
285
286
- uptr beg = AlignDown (d);
286
+ uptr beg = OriginAlignDown (d);
287
287
288
288
if (beg + kOriginAlign < end) {
289
289
// Align src up.
290
- uptr s = AlignUp ((uptr)src);
291
- dfsan_origin *src =
292
- (dfsan_origin *)origin_for ((void *)(s + end - beg - kOriginAlign ));
293
- u32 *src_s = (u32 *)shadow_for ((void *)(s + end - beg - kOriginAlign ));
294
- dfsan_origin *src_begin = (dfsan_origin *)origin_for ((void *)s);
295
- dfsan_origin *dst =
296
- (dfsan_origin *)origin_for ((void *)(end - kOriginAlign ));
297
- dfsan_origin src_o = 0 ;
298
- dfsan_origin dst_o = 0 ;
299
- for (; src >= src_begin; --src, --src_s, --dst) {
300
- if (!*src_s)
290
+ uptr src_a = OriginAlignUp ((uptr)src);
291
+ void *src_end = (void *)(src_a + end - beg - kOriginAlign );
292
+ dfsan_origin *src_end_o = origin_for (src_end);
293
+ u32 *src_end_s = (u32 *)shadow_for (src_end);
294
+ dfsan_origin *src_begin_o = origin_for ((void *)src_a);
295
+ dfsan_origin *dst = origin_for ((void *)(end - kOriginAlign ));
296
+ dfsan_origin last_src_o = 0 ;
297
+ dfsan_origin last_dst_o = 0 ;
298
+ for (; src_end_o >= src_begin_o; --src_end_o, --src_end_s, --dst) {
299
+ if (!*src_end_s)
301
300
continue ;
302
- if (*src != src_o ) {
303
- src_o = *src ;
304
- dst_o = ChainOrigin (src_o , stack);
301
+ if (*src_end_o != last_src_o ) {
302
+ last_src_o = *src_end_o ;
303
+ last_dst_o = ChainOrigin (last_src_o , stack);
305
304
}
306
- *dst = dst_o ;
305
+ *dst = last_dst_o ;
307
306
}
308
307
}
309
308
@@ -345,8 +344,8 @@ static void SetOrigin(const void *dst, uptr size, u32 origin) {
345
344
// Here we extend the range such that its left and right bounds are both
346
345
// 4 byte aligned.
347
346
uptr x = unaligned_origin_for ((uptr)dst);
348
- uptr beg = AlignDown (x);
349
- uptr end = AlignUp (x + size); // align up.
347
+ uptr beg = OriginAlignDown (x);
348
+ uptr end = OriginAlignUp (x + size); // align up.
350
349
u64 origin64 = ((u64 )origin << 32 ) | origin;
351
350
// This is like memset, but the value is 32-bit. We unroll by 2 to write
352
351
// 64 bits at once. May want to unroll further to get 128-bit stores.
0 commit comments