diff options
| author | Jakob Kaivo <jkk@ung.org> | 2024-01-31 13:24:56 -0500 |
|---|---|---|
| committer | Jakob Kaivo <jkk@ung.org> | 2024-01-31 13:24:56 -0500 |
| commit | 4b43b375b7abae22070cd86bfc26a8222233150e (patch) | |
| tree | 6ff165b17879e80300cb6d05b5537a65c82c2dc7 /src/stdlib | |
| parent | ab3c589cd14c2b7efd79c89fd75ea35edcf9edff (diff) | |
check for overlapping pointers
Diffstat (limited to 'src/stdlib')
| -rw-r--r-- | src/stdlib/bsearch.c | 1 | ||||
| -rw-r--r-- | src/stdlib/bsearch_s.c | 1 | ||||
| -rw-r--r-- | src/stdlib/getenv_s.c | 5 | ||||
| -rw-r--r-- | src/stdlib/mbstowcs.c | 1 | ||||
| -rw-r--r-- | src/stdlib/mbstowcs_s.c | 4 | ||||
| -rw-r--r-- | src/stdlib/mbtowc.c | 2 | ||||
| -rw-r--r-- | src/stdlib/qsort_s.c | 1 | ||||
| -rw-r--r-- | src/stdlib/strtod.c | 2 | ||||
| -rw-r--r-- | src/stdlib/strtof.c | 2 | ||||
| -rw-r--r-- | src/stdlib/strtol.c | 2 | ||||
| -rw-r--r-- | src/stdlib/strtold.c | 2 | ||||
| -rw-r--r-- | src/stdlib/strtoll.c | 2 | ||||
| -rw-r--r-- | src/stdlib/strtoul.c | 2 | ||||
| -rw-r--r-- | src/stdlib/strtoull.c | 2 | ||||
| -rw-r--r-- | src/stdlib/wcstombs.c | 2 | ||||
| -rw-r--r-- | src/stdlib/wcstombs_s.c | 4 | ||||
| -rw-r--r-- | src/stdlib/wctomb_s.c | 1 |
17 files changed, 36 insertions, 0 deletions
diff --git a/src/stdlib/bsearch.c b/src/stdlib/bsearch.c index a7531672..ae60783e 100644 --- a/src/stdlib/bsearch.c +++ b/src/stdlib/bsearch.c @@ -12,6 +12,7 @@ void * bsearch(const void * key, const void * base, size_t nmemb, size_t size, i const char *addr = base; SIGNAL_SAFE(0); + /* overlap can't be detected because the size of key can't be known */ while (ret == NULL) { int comp = compar(key, addr + (i * size)); diff --git a/src/stdlib/bsearch_s.c b/src/stdlib/bsearch_s.c index 706aa399..957dbaca 100644 --- a/src/stdlib/bsearch_s.c +++ b/src/stdlib/bsearch_s.c @@ -6,6 +6,7 @@ void *bsearch_s(const void * key, const void * base, rsize_t nmemb, rsize_t size, int (*compar)(const void *x, const void *y, void * context), void *context) { SIGNAL_SAFE(0); + /* Overlap can't be detected because the size of the key and context are unknowable */ /* TODO: testing */ (void)size; diff --git a/src/stdlib/getenv_s.c b/src/stdlib/getenv_s.c index 73e6131c..489bdeea 100644 --- a/src/stdlib/getenv_s.c +++ b/src/stdlib/getenv_s.c @@ -1,11 +1,16 @@ #include <string.h> #include <stdlib.h> +#include <string.h> #include "_stdlib.h" /** get an environment variable **/ errno_t getenv_s(size_t * restrict len, char * restrict value, rsize_t maxsize, const char * restrict name) { SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(len, sizeof(*len), value, maxsize); + ASSERT_NOOVERLAP(len, sizeof(*len), name, strlen(name)); + ASSERT_NOOVERLAP(value, maxsize, name, strlen(name)); + (void)len; (void)value; (void)maxsize; (void)name; return 0; } diff --git a/src/stdlib/mbstowcs.c b/src/stdlib/mbstowcs.c index c01f8201..61e83512 100644 --- a/src/stdlib/mbstowcs.c +++ b/src/stdlib/mbstowcs.c @@ -6,6 +6,7 @@ size_t mbstowcs(wchar_t * restrict pwcs, const char * restrict s, size_t n) { SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(pwcs, n * sizeof(*pwcs), s, n); /* FIXME: forward dependency on AMD1 */ #if 0 diff --git a/src/stdlib/mbstowcs_s.c b/src/stdlib/mbstowcs_s.c index 23426796..8270faf6 100644 --- a/src/stdlib/mbstowcs_s.c +++ b/src/stdlib/mbstowcs_s.c @@ -5,6 +5,10 @@ errno_t mbstowcs_s(size_t * restrict retval, wchar_t * restrict dst, rsize_t dstmax, const char * restrict src, rsize_t len) { SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(retval, sizeof(*retval), dst, dstmax); + ASSERT_NOOVERLAP(retval, sizeof(*retval), src, len); + ASSERT_NOOVERLAP(dst, dstmax, src, len); + (void)retval; (void)dst; (void)dstmax; (void)src; (void)len; return 0; } diff --git a/src/stdlib/mbtowc.c b/src/stdlib/mbtowc.c index 015a4505..c2780bf6 100644 --- a/src/stdlib/mbtowc.c +++ b/src/stdlib/mbtowc.c @@ -6,6 +6,8 @@ int mbtowc(wchar_t * restrict pwc, const char * restrict s, size_t n) { SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(pwc, sizeof(*pwc), s, n); + /* FIXME: forward dependency on AMD1 */ #if 0 static mbstate_t ps = 0; diff --git a/src/stdlib/qsort_s.c b/src/stdlib/qsort_s.c index 3586dad0..0b871f06 100644 --- a/src/stdlib/qsort_s.c +++ b/src/stdlib/qsort_s.c @@ -7,6 +7,7 @@ errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size, void * context) { SIGNAL_SAFE(0); + /* Overlap can't be detected because size of context is unknowable */ (void)base; (void)nmemb; (void)size; (void)compar; (void)context; return 0; } diff --git a/src/stdlib/strtod.c b/src/stdlib/strtod.c index b259f05c..af7ebbb7 100644 --- a/src/stdlib/strtod.c +++ b/src/stdlib/strtod.c @@ -3,6 +3,7 @@ #include <float.h> #include <math.h> #include <stdlib.h> +#include <string.h> #include "_stdlib.h" #ifndef INFINITY @@ -25,6 +26,7 @@ double strtod(const char * restrict nptr, char ** restrict endptr) double huge = HUGE_VAL; SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(nptr, strlen(nptr), endptr, sizeof(*endptr)); #include "_strtod.h" diff --git a/src/stdlib/strtof.c b/src/stdlib/strtof.c index 2dfb8183..cb53b064 100644 --- a/src/stdlib/strtof.c +++ b/src/stdlib/strtof.c @@ -3,6 +3,7 @@ #include <errno.h> #include <ctype.h> #include <math.h> +#include <string.h> #include "_stdlib.h" /** convert string to floating-point **/ @@ -17,6 +18,7 @@ float strtof(const char * restrict nptr, char ** restrict endptr) float nan = NAN; SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(nptr, strlen(nptr), endptr, sizeof(*endptr)); #include "_strtod.h" diff --git a/src/stdlib/strtol.c b/src/stdlib/strtol.c index dc2b9d87..525273d9 100644 --- a/src/stdlib/strtol.c +++ b/src/stdlib/strtol.c @@ -2,6 +2,7 @@ #include <errno.h> #include <limits.h> #include <stdlib.h> +#include <string.h> #include "_stdlib.h" /** convert string to long integer **/ @@ -13,6 +14,7 @@ long int strtol(const char * restrict nptr, char ** restrict endptr, int base) long int min = LONG_MIN; SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(nptr, strlen(nptr), endptr, sizeof(*endptr)); #include "_strtoi.h" diff --git a/src/stdlib/strtold.c b/src/stdlib/strtold.c index 43fc77bd..b658152b 100644 --- a/src/stdlib/strtold.c +++ b/src/stdlib/strtold.c @@ -3,6 +3,7 @@ #include <ctype.h> #include <errno.h> #include <math.h> +#include <string.h> #include "_stdlib.h" /** convert string to floating-point **/ @@ -17,6 +18,7 @@ long double strtold(const char * restrict nptr, char ** restrict endptr) long double nan = NAN; SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(nptr, strlen(nptr), endptr, sizeof(*endptr)); #include "_strtod.h" diff --git a/src/stdlib/strtoll.c b/src/stdlib/strtoll.c index 10f05209..ab5b3d9e 100644 --- a/src/stdlib/strtoll.c +++ b/src/stdlib/strtoll.c @@ -2,6 +2,7 @@ #include <ctype.h> #include <limits.h> #include <errno.h> +#include <string.h> #include "_stdlib.h" long long int strtoll(const char * restrict nptr, char ** restrict endptr, int base) @@ -11,6 +12,7 @@ long long int strtoll(const char * restrict nptr, char ** restrict endptr, int b long long int min = LLONG_MIN; SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(nptr, strlen(nptr), endptr, sizeof(*endptr)); #include "_strtoi.h" diff --git a/src/stdlib/strtoul.c b/src/stdlib/strtoul.c index 1270c92c..35c146c3 100644 --- a/src/stdlib/strtoul.c +++ b/src/stdlib/strtoul.c @@ -2,6 +2,7 @@ #include <ctype.h> #include <limits.h> #include <stdlib.h> +#include <string.h> #include "_stdlib.h" /** convert string to unsigned long integer **/ @@ -13,6 +14,7 @@ unsigned long int strtoul(const char * nptr, char ** endptr, int base) unsigned long int min = 0; SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(nptr, strlen(nptr), endptr, sizeof(*endptr)); #include "_strtoi.h" diff --git a/src/stdlib/strtoull.c b/src/stdlib/strtoull.c index 2a74df16..994eaba0 100644 --- a/src/stdlib/strtoull.c +++ b/src/stdlib/strtoull.c @@ -2,6 +2,7 @@ #include <ctype.h> #include <limits.h> #include <errno.h> +#include <string.h> #include "_stdlib.h" unsigned long long int strtoull(const char * restrict nptr, char ** restrict endptr, int base) @@ -11,6 +12,7 @@ unsigned long long int strtoull(const char * restrict nptr, char ** restrict end unsigned long long int min = 0; SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(nptr, strlen(nptr), endptr, sizeof(*endptr)); #include "_strtoi.h" diff --git a/src/stdlib/wcstombs.c b/src/stdlib/wcstombs.c index 1d9dd4eb..62524aa3 100644 --- a/src/stdlib/wcstombs.c +++ b/src/stdlib/wcstombs.c @@ -1,4 +1,5 @@ #include <stdlib.h> +#include <wchar.h> #include "_stdlib.h" /** convert wide character string to multibyte string **/ @@ -6,6 +7,7 @@ size_t wcstombs(char * restrict s, const wchar_t * restrict pwcs, size_t n) { SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(s, n, pwcs, wcslen(pwcs)); (void)s; (void)pwcs; (void)n; /* TODO */ diff --git a/src/stdlib/wcstombs_s.c b/src/stdlib/wcstombs_s.c index d5c830fa..eab4e027 100644 --- a/src/stdlib/wcstombs_s.c +++ b/src/stdlib/wcstombs_s.c @@ -5,6 +5,10 @@ errno_t wcstombs_s(size_t * restrict retval, char * restrict dst, rsize_t dstmax, const wchar_t * restrict src, rsize_t len) { SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(retval, sizeof(*retval), dst, dstmax); + ASSERT_NOOVERLAP(retval, sizeof(*retval), src, len); + ASSERT_NOOVERLAP(dst, dstmax, src, len); + (void)retval; (void)dst; (void)dstmax; (void)src; (void)len; /* TODO */ return 0; diff --git a/src/stdlib/wctomb_s.c b/src/stdlib/wctomb_s.c index 8027c59d..6303b21e 100644 --- a/src/stdlib/wctomb_s.c +++ b/src/stdlib/wctomb_s.c @@ -5,6 +5,7 @@ errno_t wctomb_s(int * restrict status, char * restrict s, rsize_t smax, wchar_t wc) { SIGNAL_SAFE(0); + ASSERT_NOOVERLAP(status, sizeof(*status), s, smax); (void)status; (void)s; (void)smax; (void)wc; /* TODO */ return 0; |
