Skip to content

Commit 630dfc9

Browse files
anoopkg6anoopkg6
andauthored
[dfsan] Fix Endianess issue (#162881)
Fix Endianess issue with getting shadow 4 bytes corresponding to the first origin pointer. --------- Co-authored-by: anoopkg6 <[email protected]>
1 parent cdbf243 commit 630dfc9

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// RUN: %clang_dfsan -gmlt -mllvm -dfsan-track-origins=1 %s -o %t && \
2+
// RUN: %run %t >%t.out 2>&1
3+
// RUN: FileCheck %s < %t.out
4+
//
5+
// Test origin tracking is accurate in terms of endianness.
6+
7+
#include <sanitizer/dfsan_interface.h>
8+
9+
typedef uint64_t FULL_TYPE;
10+
typedef uint32_t HALF_TYPE;
11+
12+
__attribute__((noinline)) FULL_TYPE foo(FULL_TYPE a, FULL_TYPE b) {
13+
return a + b;
14+
}
15+
16+
int main(int argc, char *argv[]) {
17+
FULL_TYPE a = 1;
18+
FULL_TYPE b = 10;
19+
dfsan_set_label(4, (HALF_TYPE *)&a, sizeof(HALF_TYPE));
20+
FULL_TYPE c = foo(a, b);
21+
dfsan_print_origin_trace(&c, NULL);
22+
dfsan_print_origin_trace((HALF_TYPE *)&c, NULL);
23+
}
24+
25+
// CHECK: Taint value 0x4 {{.*}} origin tracking ()
26+
// CHECK: Origin value: {{.*}}, Taint value was stored to memory at
27+
// CHECK: #0 {{.*}} in main {{.*}}origin_endianness.c:[[@LINE-7]]
28+
29+
// CHECK: Origin value: {{.*}}, Taint value was created at
30+
// CHECK: #0 {{.*}} in main {{.*}}origin_endianness.c:[[@LINE-11]]
31+
32+
// CHECK: Taint value 0x4 {{.*}} origin tracking ()
33+
// CHECK: Origin value: {{.*}}, Taint value was stored to memory at
34+
// CHECK: #0 {{.*}} in main {{.*}}origin_endianness.c:[[@LINE-14]]
35+
36+
// CHECK: Origin value: {{.*}}, Taint value was created at
37+
// CHECK: #0 {{.*}} in main {{.*}}origin_endianness.c:[[@LINE-18]]

llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2191,8 +2191,16 @@ std::pair<Value *, Value *> DFSanFunction::loadShadowFast(
21912191
// and then the entire shadow for the second origin pointer (which will be
21922192
// chosen by combineOrigins() iff the least-significant half of the wide
21932193
// shadow was empty but the other half was not).
2194-
Value *WideShadowLo = IRB.CreateShl(
2195-
WideShadow, ConstantInt::get(WideShadowTy, WideShadowBitWidth / 2));
2194+
Value *WideShadowLo =
2195+
F->getParent()->getDataLayout().isLittleEndian()
2196+
? IRB.CreateShl(
2197+
WideShadow,
2198+
ConstantInt::get(WideShadowTy, WideShadowBitWidth / 2))
2199+
: IRB.CreateAnd(
2200+
WideShadow,
2201+
ConstantInt::get(WideShadowTy,
2202+
(1 - (1 << (WideShadowBitWidth / 2)))
2203+
<< (WideShadowBitWidth / 2)));
21962204
Shadows.push_back(WideShadow);
21972205
Origins.push_back(DFS.loadNextOrigin(Pos, OriginAlign, &OriginAddr));
21982206

0 commit comments

Comments
 (0)