From: Tobias Brunner Date: Tue, 24 Jun 2014 12:52:42 +0000 (+0200) Subject: utils: Add wrappers for memcpy(3), memmove(3) and memset(3) X-Git-Tag: 5.2.0rc1~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d4654b9f91adf4effadebe0c7a4e5cfc91eb32b;p=thirdparty%2Fstrongswan.git utils: Add wrappers for memcpy(3), memmove(3) and memset(3) These wrappers guarantee that calls to these functions are noops if the number of bytes is 0, as calling them with NULL pointers is undefined according to the C standard, even if the number of bytes is 0 (most implementations probably ignore the pointers anyway in this case, but lets make sure). --- diff --git a/src/libstrongswan/utils/utils.h b/src/libstrongswan/utils/utils.h index 961ddb5835..3c1a203a16 100644 --- a/src/libstrongswan/utils/utils.h +++ b/src/libstrongswan/utils/utils.h @@ -166,6 +166,39 @@ static inline bool memeq(const void *x, const void *y, size_t len) return memcmp(x, y, len) == 0; } +/** + * Calling memcpy() with NULL pointers, even with n == 0, results in undefined + * behavior according to the C standard. This version is guaranteed to not + * access the pointers if n is 0. + */ +static inline void *memcpy_noop(void *dst, const void *src, size_t n) +{ + return n ? memcpy(dst, src, n) : dst; +} +#define memcpy(d,s,n) memcpy_noop(d,s,n) + +/** + * Calling memmove() with NULL pointers, even with n == 0, results in undefined + * behavior according to the C standard. This version is guaranteed to not + * access the pointers if n is 0. + */ +static inline void *memmove_noop(void *dst, const void *src, size_t n) +{ + return n ? memmove(dst, src, n) : dst; +} +#define memmove(d,s,n) memmove_noop(d,s,n) + +/** + * Calling memset() with a NULL pointer, even with n == 0, results in undefined + * behavior according to the C standard. This version is guaranteed to not + * access the pointer if n is 0. + */ +static inline void *memset_noop(void *s, int c, size_t n) +{ + return n ? memset(s, c, n) : s; +} +#define memset(s,c,n) memset_noop(s,c,n) + /** * Macro gives back larger of two values. */ @@ -174,7 +207,6 @@ static inline bool memeq(const void *x, const void *y, size_t len) typeof(y) _y = (y); \ _x > _y ? _x : _y; }) - /** * Macro gives back smaller of two values. */