Index: compiler-rt/lib/dfsan/dfsan_custom.cpp =================================================================== --- compiler-rt/lib/dfsan/dfsan_custom.cpp +++ compiler-rt/lib/dfsan/dfsan_custom.cpp @@ -218,11 +218,10 @@ } if (flags().strict_data_dependencies) { - *ret_label = res ? s_label : 0; + *ret_label = res ? dfsan_read_label(base, sizeof(base)) : 0; } else { - size_t s_bytes_read = (res ? strlen(res) : strlen(base)) + 1; *ret_label = - dfsan_union(dfsan_read_label(base, s_bytes_read), + dfsan_union(dfsan_read_label(base, sizeof(base)), dfsan_union(dfsan_read_label(delim, strlen(delim) + 1), dfsan_union(s_label, delim_label))); } @@ -238,11 +237,10 @@ char *res = __dfsw_strsep(s, delim, s_label, delim_label, ret_label); if (flags().strict_data_dependencies) { if (res) - *ret_origin = s_origin; + *ret_origin = dfsan_read_origin_of_first_taint(base, strlen(base)); } else { if (*ret_label) { - size_t s_bytes_read = (res ? strlen(res) : strlen(base)) + 1; - dfsan_origin o = dfsan_read_origin_of_first_taint(base, s_bytes_read); + dfsan_origin o = dfsan_read_origin_of_first_taint(base, strlen(base)); if (o) { *ret_origin = o; } else { Index: compiler-rt/test/dfsan/custom.cpp =================================================================== --- compiler-rt/test/dfsan/custom.cpp +++ compiler-rt/test/dfsan/custom.cpp @@ -1636,80 +1636,38 @@ char *p_delim = delim; // taint delim bytes - dfsan_set_label(n_label, p_delim, strlen(p_delim)); + dfsan_set_label(i_label, p_delim, strlen(p_delim)); // taint delim pointer - dfsan_set_label(i_label, &p_delim, sizeof(&p_delim)); + dfsan_set_label(j_label, &p_delim, sizeof(&p_delim)); + // taint the string data bytes + dfsan_set_label(k_label, s, 5); + // taint the string pointer + dfsan_set_label(m_label, &p_s, sizeof(&p_s)); char *rv = strsep(&p_s, p_delim); assert(rv == &base[0]); #ifdef STRICT_DATA_DEPENDENCIES - ASSERT_ZERO_LABEL(rv); - ASSERT_READ_ZERO_LABEL(rv, strlen(rv)); + ASSERT_LABEL(rv, k_label); + ASSERT_READ_LABEL(rv, strlen(rv), k_label); #else - ASSERT_LABEL(rv, dfsan_union(i_label, n_label)); - ASSERT_INIT_ORIGIN_EQ_ORIGIN(&rv, *p_delim); + ASSERT_LABEL(rv, dfsan_union(dfsan_union(i_label, j_label), k_label)); + ASSERT_INIT_ORIGIN_EQ_ORIGIN(&rv, *s); #endif - // taint the remaining string's bytes - dfsan_set_label(m_label, p_s, strlen(p_s)); // taint the remaining string's pointer char **pp_s = &p_s; - dfsan_set_label(j_label, &pp_s, sizeof(&p_s)); + char **pp_s_base = pp_s; + dfsan_set_label(n_label, &pp_s, sizeof(&pp_s)); rv = strsep(pp_s, p_delim); assert(rv == &base[6]); -#ifdef STRICT_DATA_DEPENDENCIES - ASSERT_READ_LABEL(rv, strlen(rv), m_label); - ASSERT_LABEL(rv, j_label); - ASSERT_INIT_ORIGIN_EQ_ORIGIN(&rv, pp_s); -#else - ASSERT_LABEL( - rv, dfsan_union(j_label, - dfsan_union(i_label, dfsan_union(m_label, n_label)))); - ASSERT_INIT_ORIGIN_EQ_ORIGIN(&rv, base[6]); -#endif - - free(s); - s = strdup("Hello world/"); - base = s; - free(delim); - delim = strdup(" /"); - p_delim = delim; - - dfsan_set_label(j_label, &delim[0], 1); - - rv = strsep(&s, delim); - assert(rv == &base[0]); #ifdef STRICT_DATA_DEPENDENCIES ASSERT_ZERO_LABEL(rv); + ASSERT_ZERO_ORIGIN(rv); #else - ASSERT_LABEL(rv, j_label); - ASSERT_INIT_ORIGIN_EQ_ORIGIN(&rv, delim[1]); -#endif - - char *ps = s; - pp_s = &ps; - dfsan_set_label(i_label, &pp_s, sizeof(&pp_s)); - dfsan_set_label(i_label, ps, strlen(ps)); - dfsan_set_label(dfsan_union(j_label, dfsan_read_label(ps, strlen(ps))), ps, - strlen(ps)); - rv = strsep(pp_s, " /"); - assert(rv == &base[6]); -#ifdef STRICT_DATA_DEPENDENCIES - ASSERT_LABEL(rv, i_label); -#else - ASSERT_LABEL(rv, i_j_label); - ASSERT_INIT_ORIGIN_EQ_ORIGIN(&rv, base[6]); -#endif - rv = strsep(&ps, " /"); - assert(strlen(rv) == 0); -#ifdef STRICT_DATA_DEPENDENCIES - ASSERT_ZERO_LABEL(ps); -#else - ASSERT_ZERO_LABEL(rv); - ASSERT_INIT_ORIGIN_EQ_ORIGIN(&rv, 0); - + ASSERT_LABEL(rv, dfsan_union(i_label, dfsan_union(j_label, n_label))); + ASSERT_INIT_ORIGIN_EQ_ORIGIN(&rv, *p_delim); #endif }