diff --git a/libc/include/bits/fortify/string.h b/libc/include/bits/fortify/string.h index 9be2b1a45..5fdbe2ae5 100644 --- a/libc/include/bits/fortify/string.h +++ b/libc/include/bits/fortify/string.h @@ -77,33 +77,34 @@ void* mempcpy(void* const dst __pass_object_size0, const void* src, size_t copy_ return __builtin___mempcpy_chk(dst, src, copy_amount, bos_dst); } #endif /* __ANDROID_API__ >= __ANDROID_API_R__ */ -#endif +#endif /* __USE_GNU */ -#if __ANDROID_API__ >= __ANDROID_API_L__ __BIONIC_FORTIFY_INLINE char* stpcpy(char* const dst __pass_object_size, const char* src) __overloadable __clang_error_if(__bos_unevaluated_le(__bos(dst), __builtin_strlen(src)), "'stpcpy' called with string bigger than buffer") { +#if __ANDROID_API__ >= __ANDROID_API_L__ size_t bos_dst = __bos(dst); - if (__bos_trivially_not_le(bos_dst, __builtin_strlen(src))) { - return __builtin_stpcpy(dst, src); + if (!__bos_trivially_gt(bos_dst, __builtin_strlen(src))) { + return __builtin___stpcpy_chk(dst, src, bos_dst); } - return __builtin___stpcpy_chk(dst, src, bos_dst); -} #endif /* __ANDROID_API__ >= __ANDROID_API_L__ */ + return __builtin_stpcpy(dst, src); +} -#if __ANDROID_API__ >= __ANDROID_API_J_MR1__ __BIONIC_FORTIFY_INLINE char* strcpy(char* const dst __pass_object_size, const char* src) __overloadable __clang_error_if(__bos_unevaluated_le(__bos(dst), __builtin_strlen(src)), "'strcpy' called with string bigger than buffer") { +#if __ANDROID_API__ >= __ANDROID_API_J_MR1__ size_t bos_dst = __bos(dst); - if (__bos_trivially_not_le(bos_dst, __builtin_strlen(src))) { - return __builtin_strcpy(dst, src); + if (!__bos_trivially_gt(bos_dst, __builtin_strlen(src))) { + return __builtin___strcpy_chk(dst, src, bos_dst); } - return __builtin___strcpy_chk(dst, src, bos_dst); +#endif /* __ANDROID_API__ >= __ANDROID_API_J_MR1__ */ + return __builtin_strcpy(dst, src); } __BIONIC_FORTIFY_INLINE @@ -111,27 +112,34 @@ char* strcat(char* const dst __pass_object_size, const char* src) __overloadable __clang_error_if(__bos_unevaluated_le(__bos(dst), __builtin_strlen(src)), "'strcat' called with string bigger than buffer") { +#if __ANDROID_API__ >= __ANDROID_API_J_MR1__ return __builtin___strcat_chk(dst, src, __bos(dst)); +#else + return __builtin_strcat(dst, src); +#endif /* __ANDROID_API__ >= __ANDROID_API_J_MR1__ */ } +#if __ANDROID_API__ >= __ANDROID_API_J_MR1__ /* No diag -- clang diagnoses misuses of this on its own. */ __BIONIC_FORTIFY_INLINE char* strncat(char* const dst __pass_object_size, const char* src, size_t n) __overloadable { return __builtin___strncat_chk(dst, src, n, __bos(dst)); } +#endif /* __ANDROID_API__ >= __ANDROID_API_J_MR1__ */ /* No diag -- clang diagnoses misuses of this on its own. */ __BIONIC_FORTIFY_INLINE void* memset(void* const s __pass_object_size0, int c, size_t n) __overloadable /* If you're a user who wants this warning to go away: use `(&memset)(foo, bar, baz)`. */ __clang_warning_if(c && !n, "'memset' will set 0 bytes; maybe the arguments got flipped?") { +#if __ANDROID_API__ >= __ANDROID_API_J_MR1__ size_t bos = __bos0(s); - if (__bos_trivially_not_lt(bos, n)) { - return __builtin_memset(s, c, n); + if (!__bos_trivially_ge(bos, n)) { + return __builtin___memset_chk(s, c, n, bos); } - return __builtin___memset_chk(s, c, n, bos); -} #endif /* __ANDROID_API__ >= __ANDROID_API_J_MR1__ */ + return __builtin_memset(s, c, n); +} #if __ANDROID_API__ >= __ANDROID_API_M__ __BIONIC_FORTIFY_INLINE @@ -189,19 +197,19 @@ char* strncpy(char* const dst __pass_object_size, const char* const src __pass_o } #endif /* __ANDROID_API__ >= __ANDROID_API_L__ */ -#if __ANDROID_API__ >= __ANDROID_API_J_MR1__ __BIONIC_FORTIFY_INLINE size_t strlcpy(char* const dst __pass_object_size, const char* src, size_t size) __overloadable __clang_error_if(__bos_unevaluated_lt(__bos(dst), size), "'strlcpy' called with size bigger than buffer") { +#if __ANDROID_API__ >= __ANDROID_API_J_MR1__ size_t bos = __bos(dst); - if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) { - return __call_bypassing_fortify(strlcpy)(dst, src, size); + if (bos != __BIONIC_FORTIFY_UNKNOWN_SIZE) { + return __strlcpy_chk(dst, src, size, bos); } - - return __strlcpy_chk(dst, src, size, bos); +#endif /* __ANDROID_API__ >= __ANDROID_API_J_MR1__ */ + return __call_bypassing_fortify(strlcpy)(dst, src, size); } __BIONIC_FORTIFY_INLINE @@ -209,50 +217,51 @@ size_t strlcat(char* const dst __pass_object_size, const char* src, size_t size) __overloadable __clang_error_if(__bos_unevaluated_lt(__bos(dst), size), "'strlcat' called with size bigger than buffer") { +#if __ANDROID_API__ >= __ANDROID_API_J_MR1__ size_t bos = __bos(dst); - if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) { - return __call_bypassing_fortify(strlcat)(dst, src, size); + if (bos != __BIONIC_FORTIFY_UNKNOWN_SIZE) { + return __strlcat_chk(dst, src, size, bos); } - - return __strlcat_chk(dst, src, size, bos); +#endif /* __ANDROID_API__ >= __ANDROID_API_J_MR1__ */ + return __call_bypassing_fortify(strlcat)(dst, src, size); } __BIONIC_FORTIFY_INLINE size_t strlen(const char* const s __pass_object_size0) __overloadable { size_t bos = __bos0(s); - if (__bos_trivially_gt(bos, __builtin_strlen(s))) { - return __builtin_strlen(s); +#if __ANDROID_API__ >= __ANDROID_API_J_MR1__ + if (!__bos_trivially_gt(bos, __builtin_strlen(s))) { + return __strlen_chk(s, bos); } - - return __strlen_chk(s, bos); -} #endif /* __ANDROID_API__ >= __ANDROID_API_J_MR1__ */ + return __builtin_strlen(s); +} -#if __ANDROID_API__ >= __ANDROID_API_J_MR2__ __BIONIC_FORTIFY_INLINE char* strchr(const char* const s __pass_object_size, int c) __overloadable { +#if __ANDROID_API__ >= __ANDROID_API_J_MR2__ size_t bos = __bos(s); - if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) { - return __builtin_strchr(s, c); + if (bos != __BIONIC_FORTIFY_UNKNOWN_SIZE) { + return __strchr_chk(s, c, bos); } - - return __strchr_chk(s, c, bos); +#endif /* __ANDROID_API__ >= __ANDROID_API_J_MR2__ */ + return __builtin_strchr(s, c); } __BIONIC_FORTIFY_INLINE char* strrchr(const char* const s __pass_object_size, int c) __overloadable { +#if __ANDROID_API__ >= __ANDROID_API_J_MR2__ size_t bos = __bos(s); - if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) { - return __builtin_strrchr(s, c); + if (bos != __BIONIC_FORTIFY_UNKNOWN_SIZE) { + return __strrchr_chk(s, c, bos); } - - return __strrchr_chk(s, c, bos); -} #endif /* __ANDROID_API__ >= __ANDROID_API_J_MR2__ */ + return __builtin_strrchr(s, c); +} #if __ANDROID_API__ >= __ANDROID_API_M__ #if defined(__cplusplus)