fortify-headers/include/string.h

166 lines
3.5 KiB
C
Raw Normal View History

#ifndef _FORTIFY_STRING_H
#define _FORTIFY_STRING_H
2015-01-28 15:14:49 +00:00
#include_next <string.h>
#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
#include "fortify-headers.h"
2015-01-28 15:14:49 +00:00
2015-03-13 23:09:15 +00:00
#ifdef __cplusplus
extern "C" {
#endif
#undef memcpy
#undef memmove
#undef memset
#undef strcat
#undef strcpy
#undef strncat
#undef strncpy
2015-03-11 09:26:11 +00:00
fortify_fn(memcpy) void *memcpy(void *dst, const void *src, size_t n)
2015-01-28 15:14:49 +00:00
{
size_t bos_dst = __builtin_object_size(dst, 0);
size_t bos_src = __builtin_object_size(src, 0);
char *d = (char *)dst;
const char *s = (const char *)src;
2015-01-28 15:14:49 +00:00
/* trap if pointers are overlapping but not if dst == src.
* gcc seems to like to generate code that relies on dst == src */
if ((d < s && d + n > s) ||
(s < d && s + n > d))
__builtin_trap();
if (n > bos_dst || n > bos_src)
2015-01-28 15:36:44 +00:00
__builtin_trap();
return __orig_memcpy(dst, src, n);
2015-01-28 15:14:49 +00:00
}
fortify_fn(memmove) void *memmove(void *dst, const void *src, size_t n)
2015-01-28 15:14:49 +00:00
{
size_t bos_dst = __builtin_object_size(dst, 0);
size_t bos_src = __builtin_object_size(src, 0);
2015-01-28 15:14:49 +00:00
if (n > bos_dst || n > bos_src)
2015-01-28 15:36:44 +00:00
__builtin_trap();
return __orig_memmove(dst, src, n);
2015-01-28 15:14:49 +00:00
}
fortify_fn(memset) void *memset(void *dst, int c, size_t n)
2015-01-28 15:14:49 +00:00
{
size_t bos = __builtin_object_size(dst, 0);
2015-01-28 15:14:49 +00:00
if (n > bos)
2015-01-28 15:36:44 +00:00
__builtin_trap();
return __orig_memset(dst, c, n);
2015-01-28 15:14:49 +00:00
}
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
|| defined(_BSD_SOURCE)
#undef stpcpy
fortify_fn(stpcpy) char *stpcpy(char *dst, const char *src)
2015-01-28 16:16:23 +00:00
{
size_t bos = __builtin_object_size(dst, 0);
2015-01-28 16:16:23 +00:00
if (strlen(src) + 1 > bos)
__builtin_trap();
return __orig_stpcpy(dst, src);
2015-01-28 16:16:23 +00:00
}
#undef stpncpy
fortify_fn(stpncpy) char *stpncpy(char *dst, const char *src, size_t n)
2015-01-28 16:21:38 +00:00
{
size_t bos = __builtin_object_size(dst, 0);
2015-01-28 16:21:38 +00:00
if (n > bos)
2015-01-28 16:21:38 +00:00
__builtin_trap();
return __orig_stpncpy(dst, src, n);
2015-01-28 16:21:38 +00:00
}
#endif
2015-01-28 16:21:38 +00:00
fortify_fn(strcat) char *strcat(char *dst, const char *src)
2015-01-28 15:14:49 +00:00
{
size_t bos = __builtin_object_size(dst, 0);
2015-01-28 15:14:49 +00:00
if (strlen(src) + strlen(dst) + 1 > bos)
2015-01-28 15:36:44 +00:00
__builtin_trap();
return __orig_strcat(dst, src);
2015-01-28 15:14:49 +00:00
}
fortify_fn(strcpy) char *strcpy(char *dst, const char *src)
2015-01-28 15:14:49 +00:00
{
size_t bos = __builtin_object_size(dst, 0);
2015-01-28 15:14:49 +00:00
2015-01-28 15:36:44 +00:00
if (strlen(src) + 1 > bos)
__builtin_trap();
return __orig_strcpy(dst, src);
2015-01-28 15:14:49 +00:00
}
fortify_fn(strncat) char *strncat(char *dst, const char *src, size_t n)
2015-01-28 15:14:49 +00:00
{
size_t bos = __builtin_object_size(dst, 0);
2015-01-28 15:36:44 +00:00
size_t slen, dlen;
2015-01-28 15:14:49 +00:00
if (n > bos) {
2015-01-28 15:36:44 +00:00
slen = strlen(src);
dlen = strlen(dst);
2015-01-28 15:36:44 +00:00
if (slen > n)
slen = n;
if (slen + dlen + 1 > bos)
__builtin_trap();
}
return __orig_strncat(dst, src, n);
2015-01-28 15:14:49 +00:00
}
fortify_fn(strncpy) char *strncpy(char *dst, const char *src, size_t n)
2015-01-28 15:14:49 +00:00
{
size_t bos = __builtin_object_size(dst, 0);
2015-01-28 15:14:49 +00:00
if (n > bos)
2015-01-28 15:36:44 +00:00
__builtin_trap();
return __orig_strncpy(dst, src, n);
2015-01-28 15:14:49 +00:00
}
2015-01-28 17:47:08 +00:00
#ifdef _GNU_SOURCE
#undef mempcpy
fortify_fn(mempcpy) void *mempcpy(void *dst, const void *src, size_t n)
2015-01-28 17:44:38 +00:00
{
size_t bos_dst = __builtin_object_size(dst, 0);
size_t bos_src = __builtin_object_size(src, 0);
2015-01-28 17:44:38 +00:00
if (n > bos_dst || n > bos_src)
2015-01-28 17:44:38 +00:00
__builtin_trap();
return __orig_mempcpy(dst, src, n);
2015-01-28 17:44:38 +00:00
}
#endif
2015-01-28 15:14:49 +00:00
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
#undef strlcat
#undef strlcpy
fortify_fn(strlcat) size_t strlcat(char *dst, const char *src, size_t n)
2015-01-28 15:14:49 +00:00
{
size_t bos = __builtin_object_size(dst, 0);
2015-01-28 15:14:49 +00:00
if (n > bos)
2015-01-28 15:36:44 +00:00
__builtin_trap();
return __orig_strlcat(dst, src, n);
2015-01-28 15:14:49 +00:00
}
fortify_fn(strlcpy) size_t strlcpy(char *dst, const char *src, size_t n)
2015-01-28 15:14:49 +00:00
{
size_t bos = __builtin_object_size(dst, 0);
2015-01-28 15:14:49 +00:00
if (n > bos)
2015-01-28 15:36:44 +00:00
__builtin_trap();
return __orig_strlcpy(dst, src, n);
2015-01-28 15:14:49 +00:00
}
#endif
2015-03-13 23:09:15 +00:00
#ifdef __cplusplus
}
2015-03-11 09:26:11 +00:00
#endif
2015-01-28 15:14:49 +00:00
#endif
#endif