From 6b43a6a6c1f238b5ddea05964e19de86fe2fcda1 Mon Sep 17 00:00:00 2001 From: "A. Wilcox" Date: Tue, 4 Oct 2016 05:25:26 -0500 Subject: Add some _chk interfaces --- stdio.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- stdlib.c | 6 ++++ string.c | 38 ++++++++++++++++++++- 3 files changed, 157 insertions(+), 2 deletions(-) diff --git a/stdio.c b/stdio.c index f26b69b..bef7ef8 100644 --- a/stdio.c +++ b/stdio.c @@ -1,3 +1,116 @@ +#include +#include #include +#include + +size_t __fread_chk(void *ptr, size_t size, size_t nmemb, FILE *stream) +{ + assert(ptr != NULL); + assert(stream != NULL); + return fread(ptr, size, nmemb, stream); +} + +int __printf_chk(int flag, const char *format, ...) +{ + va_list argp; + int result; + + if(flag > 0) + { + assert(format != NULL); + } + + va_start(argp, format); + result = vprintf(format, argp); + va_end(argp); + + return result; +} + +int __fprintf_chk(FILE *stream, int flag, const char *format, ...) +{ + va_list argp; + int result; + + if(flag > 0) + { + assert(stream != NULL); + assert(format != NULL); + } + + va_start(argp, format); + result = vfprintf(stream, format, argp); + va_end(argp); + + return result; +} + +int __snprintf_chk(char *str, size_t size, int flag, size_t strlen, const char *format, ...) +{ + va_list argp; + int result; + + if(flag > 0) + { + assert(str != NULL); + assert(format != NULL); + } + // must always be done per LFS + assert(size <= strlen); + + va_start(argp, format); + result = vsnprintf(str, size, format, argp); + va_end(argp); + + return result; +} + +int __swprintf_chk(wchar_t *wcs, size_t maxlen, int flag, size_t wcslen, const wchar_t *format, ...) +{ + va_list argp; + int result; + + if(flag > 0) + { + assert(wcs != NULL); + assert(format != NULL); + } + // must always be done per LFS + assert(maxlen <= wcslen); + + va_start(argp, format); + result = vswprintf(wcs, maxlen, format, argp); + va_end(argp); + + return result; +} + +int __vasprintf_chk(char **strp, const char *fmt, va_list ap) +{ + assert(strp != NULL); + assert(fmt != NULL); + return vasprintf(strp, fmt, ap); +} + +int __vfprintf_chk(FILE *stream, int flag, const char *format, va_list ap) +{ + if(flag > 0) + { + assert(stream != NULL); + assert(format != NULL); + } + return vfprintf(stream, format, ap); +} + +int __vsnprintf_chk(char *str, size_t size, int flag, size_t strlen, const char *format, va_list ap) +{ + if(flag > 0) + { + assert(str != NULL); + assert(format != NULL); + } + // must always be done per LFS + assert(size <= strlen); + return vsnprintf(str, size, format, ap); +} -asm(".equ __IO_2_1_stdout_, _stdout"); diff --git a/stdlib.c b/stdlib.c index b81eb91..30c904e 100644 --- a/stdlib.c +++ b/stdlib.c @@ -1,6 +1,12 @@ #include // assert #include // strtod +char *__realpath_chk(const char *path, char *resolved_path) +{ + assert(path != NULL); + return realpath(path, resolved_path); +} + double __strtod_internal(const char *__nptr, char **__endptr, int __group) { assert(__group == 0); diff --git a/string.c b/string.c index 5bbb1b3..e50716a 100644 --- a/string.c +++ b/string.c @@ -1,4 +1,40 @@ -#include /* strndup */ +#include /* assert */ +#include /* memcpy, strcpy, strncat, strndup */ + +/* "Checked" memcpy */ +void *__memcpy_chk(void *dest, const void *src, size_t len, size_t destlen) +{ + assert(dest != NULL); + assert(src != NULL); + assert(len <= destlen); + if(src < dest) + { + assert(!(src + len >= dest)); + } else { + assert(!(dest + len >= src)); + } + return memcpy(dest, src, len); +} + +/* "Checked" strncat */ +char *__strncat_chk(char *dest, const char *src, size_t n, size_t destlen) +{ + assert(dest != NULL); + assert(src != NULL); + assert(n <= destlen); + + return strncat(dest, src, n); +} + +/* "Checked" strcpy */ +char *__strcpy_chk(char *dest, const char *src, size_t destlen) +{ + assert(dest != NULL); + assert(src != NULL); + assert(strlen(src) < destlen); + + return strcpy(dest, src); +} /* Literally a useless __ alias. */ char *__strndup(const char *str, size_t count) -- cgit v1.2.3-70-g09d2