diff options
| author | jvoisin | 2024-10-21 15:04:50 +0200 |
|---|---|---|
| committer | jvoisin | 2024-10-21 15:04:50 +0200 |
| commit | dcdd2f1fb065b6e98d87ab7b367e8fb483f9b59c (patch) | |
| tree | f8902372c264e2e5d7f5540d6a57c78ec7277240 | |
| parent | e2cfd2879a15db00dfa9a42eeb1baaef6a930aff (diff) | |
Neuter an issue in strncat2.3.3
`strlen(src)` isn't guaranteed to be valid.
| -rw-r--r-- | include/string.h | 2 | ||||
| -rw-r--r-- | tests/test_strncat_dynamic_write.c | 2 | ||||
| -rw-r--r-- | tests/test_strncat_static_write.c | 7 |
3 files changed, 9 insertions, 2 deletions
diff --git a/include/string.h b/include/string.h index 89bf25e..2e2b29c 100644 --- a/include/string.h +++ b/include/string.h | |||
| @@ -287,6 +287,7 @@ _FORTIFY_FN(strncat) char *strncat(char * _FORTIFY_POS0 __d, const char *__s, | |||
| 287 | #if __has_builtin(__builtin___strncat_chk) && FORTIFY_USE_NATIVE_CHK | 287 | #if __has_builtin(__builtin___strncat_chk) && FORTIFY_USE_NATIVE_CHK |
| 288 | return __builtin___strncat_chk(__d, __s, __n, __fh_bos(__d, 0)); | 288 | return __builtin___strncat_chk(__d, __s, __n, __fh_bos(__d, 0)); |
| 289 | #else | 289 | #else |
| 290 | #if 0 // strlen(__s) isn't guaranteed to be valid. | ||
| 290 | __fh_size_t __b = __fh_bos(__d, 0); | 291 | __fh_size_t __b = __fh_bos(__d, 0); |
| 291 | 292 | ||
| 292 | if (__n > __b) { | 293 | if (__n > __b) { |
| @@ -297,6 +298,7 @@ _FORTIFY_FN(strncat) char *strncat(char * _FORTIFY_POS0 __d, const char *__s, | |||
| 297 | if (__sl + __dl + 1 > __b) | 298 | if (__sl + __dl + 1 > __b) |
| 298 | __builtin_trap(); | 299 | __builtin_trap(); |
| 299 | } | 300 | } |
| 301 | #endif | ||
| 300 | return __orig_strncat(__d, __s, __n); | 302 | return __orig_strncat(__d, __s, __n); |
| 301 | #endif | 303 | #endif |
| 302 | } | 304 | } |
diff --git a/tests/test_strncat_dynamic_write.c b/tests/test_strncat_dynamic_write.c index c538339..d5c5a94 100644 --- a/tests/test_strncat_dynamic_write.c +++ b/tests/test_strncat_dynamic_write.c | |||
| @@ -7,9 +7,11 @@ int main(int argc, char** argv) { | |||
| 7 | strncat(buffer, "1234567", 5); | 7 | strncat(buffer, "1234567", 5); |
| 8 | puts(buffer); | 8 | puts(buffer); |
| 9 | 9 | ||
| 10 | #if 0 | ||
| 10 | CHK_FAIL_START | 11 | CHK_FAIL_START |
| 11 | strncat(buffer, argv[1], argc); | 12 | strncat(buffer, argv[1], argc); |
| 12 | CHK_FAIL_END | 13 | CHK_FAIL_END |
| 14 | #endif | ||
| 13 | 15 | ||
| 14 | puts(buffer); | 16 | puts(buffer); |
| 15 | return ret; | 17 | return ret; |
diff --git a/tests/test_strncat_static_write.c b/tests/test_strncat_static_write.c index 9332adc..7fe89ff 100644 --- a/tests/test_strncat_static_write.c +++ b/tests/test_strncat_static_write.c | |||
| @@ -4,12 +4,15 @@ | |||
| 4 | 4 | ||
| 5 | int main(int argc, char** argv) { | 5 | int main(int argc, char** argv) { |
| 6 | char buffer[8] = {0}; | 6 | char buffer[8] = {0}; |
| 7 | strncat(buffer, "1234567", 5); | 7 | char src[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}; |
| 8 | strncat(buffer, src, 5); | ||
| 8 | puts(buffer); | 9 | puts(buffer); |
| 9 | 10 | ||
| 11 | #if 0 | ||
| 10 | CHK_FAIL_START | 12 | CHK_FAIL_START |
| 11 | strncat(buffer, "1234567890", 10); | 13 | strncat(buffer, src, 10); |
| 12 | CHK_FAIL_END | 14 | CHK_FAIL_END |
| 15 | #endif | ||
| 13 | 16 | ||
| 14 | puts(buffer); | 17 | puts(buffer); |
| 15 | return ret; | 18 | return ret; |
