summaryrefslogtreecommitdiff
path: root/src/stdlib
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2024-01-31 13:24:56 -0500
committerJakob Kaivo <jkk@ung.org>2024-01-31 13:24:56 -0500
commit4b43b375b7abae22070cd86bfc26a8222233150e (patch)
tree6ff165b17879e80300cb6d05b5537a65c82c2dc7 /src/stdlib
parentab3c589cd14c2b7efd79c89fd75ea35edcf9edff (diff)
check for overlapping pointers
Diffstat (limited to 'src/stdlib')
-rw-r--r--src/stdlib/bsearch.c1
-rw-r--r--src/stdlib/bsearch_s.c1
-rw-r--r--src/stdlib/getenv_s.c5
-rw-r--r--src/stdlib/mbstowcs.c1
-rw-r--r--src/stdlib/mbstowcs_s.c4
-rw-r--r--src/stdlib/mbtowc.c2
-rw-r--r--src/stdlib/qsort_s.c1
-rw-r--r--src/stdlib/strtod.c2
-rw-r--r--src/stdlib/strtof.c2
-rw-r--r--src/stdlib/strtol.c2
-rw-r--r--src/stdlib/strtold.c2
-rw-r--r--src/stdlib/strtoll.c2
-rw-r--r--src/stdlib/strtoul.c2
-rw-r--r--src/stdlib/strtoull.c2
-rw-r--r--src/stdlib/wcstombs.c2
-rw-r--r--src/stdlib/wcstombs_s.c4
-rw-r--r--src/stdlib/wctomb_s.c1
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;