Skip to content

Commit 2da35fa

Browse files
author
git apple-llvm automerger
committed
Merge commit 'd9b3691166f1' from llvm.org/main into next
2 parents b6b7851 + d9b3691 commit 2da35fa

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed

compiler-rt/lib/dfsan/dfsan_custom.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,37 @@ SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strcat(
682682
return ret;
683683
}
684684

685+
SANITIZER_INTERFACE_ATTRIBUTE char *__dfsw_strncat(
686+
char *dest, const char *src, size_t num, dfsan_label dest_label,
687+
dfsan_label src_label, dfsan_label num_label, dfsan_label *ret_label) {
688+
size_t src_len = strlen(src);
689+
src_len = src_len < num ? src_len : num;
690+
size_t dest_len = strlen(dest);
691+
692+
char *ret = strncat(dest, src, num);
693+
dfsan_mem_shadow_transfer(dest + dest_len, src, src_len);
694+
*ret_label = dest_label;
695+
return ret;
696+
}
697+
698+
SANITIZER_INTERFACE_ATTRIBUTE char *__dfso_strncat(
699+
char *dest, const char *src, size_t num, dfsan_label dest_label,
700+
dfsan_label src_label, dfsan_label num_label, dfsan_label *ret_label,
701+
dfsan_origin dest_origin, dfsan_origin src_origin, dfsan_origin num_origin,
702+
dfsan_origin *ret_origin) {
703+
size_t src_len = strlen(src);
704+
src_len = src_len < num ? src_len : num;
705+
size_t dest_len = strlen(dest);
706+
707+
char *ret = strncat(dest, src, num);
708+
709+
dfsan_mem_origin_transfer(dest + dest_len, src, src_len);
710+
dfsan_mem_shadow_transfer(dest + dest_len, src, src_len);
711+
*ret_label = dest_label;
712+
*ret_origin = dest_origin;
713+
return ret;
714+
}
715+
685716
SANITIZER_INTERFACE_ATTRIBUTE char *
686717
__dfsw_strdup(const char *s, dfsan_label s_label, dfsan_label *ret_label) {
687718
size_t len = strlen(s);

compiler-rt/lib/dfsan/done_abilist.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ fun:strtoll=custom
268268
fun:strtoul=custom
269269
fun:strtoull=custom
270270
fun:strcat=custom
271+
fun:strncat=custom
271272

272273
# Functions that produce an output that is computed from the input, but is not
273274
# necessarily data dependent.

compiler-rt/test/dfsan/custom.cpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ void test_strcat() {
340340
dfsan_origin dst_o = dfsan_get_origin((long)dst[0]);
341341
(void)dst_o;
342342
char *ret = strcat(p, src);
343+
343344
ASSERT_LABEL(ret, k_label);
344345
ASSERT_EQ_ORIGIN(ret, p);
345346
assert(ret == dst);
@@ -367,6 +368,56 @@ void test_strcat() {
367368
ASSERT_LABEL(dst[11], j_label);
368369
}
369370

371+
void test_strncat(int n) {
372+
char src[] = "world";
373+
int volatile x = 0; // buffer to ensure src and dst do not share origins
374+
(void)x;
375+
char dst[] = "hello \0 ";
376+
int volatile y = 0; // buffer to ensure dst and p do not share origins
377+
(void)y;
378+
char *p = dst;
379+
dfsan_set_label(k_label, &p, sizeof(p));
380+
dfsan_set_label(i_label, src, sizeof(src));
381+
dfsan_set_label(j_label, dst, sizeof(dst));
382+
dfsan_origin dst_o = dfsan_get_origin((long)dst[0]);
383+
(void)dst_o;
384+
char *ret = strncat(p, src, n);
385+
386+
ASSERT_LABEL(ret, k_label);
387+
ASSERT_EQ_ORIGIN(ret, p);
388+
assert(ret == dst);
389+
assert(strncmp(src, dst + 6, n) == 0);
390+
// Origins are assigned for every 4 contiguous 4-aligned bytes. After
391+
// appending src to dst, origins of src can overwrite origins of dst if their
392+
// application adddresses are within [start_aligned_down, end_aligned_up).
393+
// Other origins are not changed.
394+
int pad = n % 4;
395+
if (pad)
396+
pad = 4 - pad;
397+
398+
char *start_aligned_down = (char *)(((size_t)(dst + 6)) & ~3UL);
399+
char *end_aligned_up = (char *)(((size_t)(dst + 6 + n + pad)) & ~3UL);
400+
401+
for (int i = 0; i < 12; ++i) {
402+
if (dst + i < start_aligned_down || dst + i >= end_aligned_up) {
403+
ASSERT_INIT_ORIGIN(&dst[i], dst_o);
404+
} else {
405+
ASSERT_INIT_ORIGIN_EQ_ORIGIN(&dst[i], src[0]);
406+
}
407+
}
408+
for (int i = 0; i < 6; ++i) {
409+
ASSERT_LABEL(dst[i], j_label);
410+
}
411+
for (int i = 6; i < 6 + n; ++i) {
412+
ASSERT_LABEL(dst[i], i_label);
413+
assert(dfsan_get_label(dst[i]) == dfsan_get_label(src[i - 6]));
414+
}
415+
for (int i = 6 + n; i < strlen(dst); ++i) {
416+
ASSERT_LABEL(dst[i], j_label);
417+
}
418+
ASSERT_LABEL(dst[11], j_label);
419+
}
420+
370421
void test_strlen() {
371422
char str1[] = "str1";
372423
dfsan_set_label(i_label, &str1[3], 1);
@@ -2110,6 +2161,8 @@ int main(void) {
21102161
test_strchr();
21112162
test_strcmp();
21122163
test_strcat();
2164+
test_strncat(5);
2165+
test_strncat(2);
21132166
test_strcpy();
21142167
test_strdup();
21152168
test_strlen();

0 commit comments

Comments
 (0)