util: move some raw memory functions from string-util.h → memory-util.h
This commit is contained in:
parent
cfb4a84942
commit
090a9c1eba
|
@ -37,3 +37,21 @@ bool memeqzero(const void *data, size_t length) {
|
||||||
/* Now we know first 16 bytes are NUL, memcmp with self. */
|
/* Now we know first 16 bytes are NUL, memcmp with self. */
|
||||||
return memcmp(data, p + i, length) == 0;
|
return memcmp(data, p + i, length) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !HAVE_EXPLICIT_BZERO
|
||||||
|
/*
|
||||||
|
* The pointer to memset() is volatile so that compiler must de-reference the pointer and can't assume that
|
||||||
|
* it points to any function in particular (such as memset(), which it then might further "optimize"). This
|
||||||
|
* approach is inspired by openssl's crypto/mem_clr.c.
|
||||||
|
*/
|
||||||
|
typedef void *(*memset_t)(void *,int,size_t);
|
||||||
|
|
||||||
|
static volatile memset_t memset_func = memset;
|
||||||
|
|
||||||
|
void* explicit_bzero_safe(void *p, size_t l) {
|
||||||
|
if (l > 0)
|
||||||
|
memset_func(p, '\0', l);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -51,3 +51,29 @@ static inline void *mempset(void *s, int c, size_t n) {
|
||||||
memset(s, c, n);
|
memset(s, c, n);
|
||||||
return (uint8_t*)s + n;
|
return (uint8_t*)s + n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Normal memmem() requires haystack to be nonnull, which is annoying for zero-length buffers */
|
||||||
|
static inline void *memmem_safe(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) {
|
||||||
|
|
||||||
|
if (needlelen <= 0)
|
||||||
|
return (void*) haystack;
|
||||||
|
|
||||||
|
if (haystacklen < needlelen)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
assert(haystack);
|
||||||
|
assert(needle);
|
||||||
|
|
||||||
|
return memmem(haystack, haystacklen, needle, needlelen);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if HAVE_EXPLICIT_BZERO
|
||||||
|
static inline void* explicit_bzero_safe(void *p, size_t l) {
|
||||||
|
if (l > 0)
|
||||||
|
explicit_bzero(p, l);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void *explicit_bzero_safe(void *p, size_t l);
|
||||||
|
#endif
|
||||||
|
|
|
@ -10,14 +10,15 @@
|
||||||
|
|
||||||
#include "alloc-util.h"
|
#include "alloc-util.h"
|
||||||
#include "escape.h"
|
#include "escape.h"
|
||||||
|
#include "fileio.h"
|
||||||
#include "gunicode.h"
|
#include "gunicode.h"
|
||||||
#include "locale-util.h"
|
#include "locale-util.h"
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
|
#include "memory-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "fileio.h"
|
|
||||||
|
|
||||||
int strcmp_ptr(const char *a, const char *b) {
|
int strcmp_ptr(const char *a, const char *b) {
|
||||||
|
|
||||||
|
@ -1048,25 +1049,6 @@ int free_and_strndup(char **p, const char *s, size_t l) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !HAVE_EXPLICIT_BZERO
|
|
||||||
/*
|
|
||||||
* Pointer to memset is volatile so that compiler must de-reference
|
|
||||||
* the pointer and can't assume that it points to any function in
|
|
||||||
* particular (such as memset, which it then might further "optimize")
|
|
||||||
* This approach is inspired by openssl's crypto/mem_clr.c.
|
|
||||||
*/
|
|
||||||
typedef void *(*memset_t)(void *,int,size_t);
|
|
||||||
|
|
||||||
static volatile memset_t memset_func = memset;
|
|
||||||
|
|
||||||
void* explicit_bzero_safe(void *p, size_t l) {
|
|
||||||
if (l > 0)
|
|
||||||
memset_func(p, '\0', l);
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char* string_erase(char *x) {
|
char* string_erase(char *x) {
|
||||||
if (!x)
|
if (!x)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -184,32 +184,6 @@ int split_pair(const char *s, const char *sep, char **l, char **r);
|
||||||
int free_and_strdup(char **p, const char *s);
|
int free_and_strdup(char **p, const char *s);
|
||||||
int free_and_strndup(char **p, const char *s, size_t l);
|
int free_and_strndup(char **p, const char *s, size_t l);
|
||||||
|
|
||||||
/* Normal memmem() requires haystack to be nonnull, which is annoying for zero-length buffers */
|
|
||||||
static inline void *memmem_safe(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) {
|
|
||||||
|
|
||||||
if (needlelen <= 0)
|
|
||||||
return (void*) haystack;
|
|
||||||
|
|
||||||
if (haystacklen < needlelen)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
assert(haystack);
|
|
||||||
assert(needle);
|
|
||||||
|
|
||||||
return memmem(haystack, haystacklen, needle, needlelen);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HAVE_EXPLICIT_BZERO
|
|
||||||
static inline void* explicit_bzero_safe(void *p, size_t l) {
|
|
||||||
if (l > 0)
|
|
||||||
explicit_bzero(p, l);
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
void *explicit_bzero_safe(void *p, size_t l);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
char *string_erase(char *x);
|
char *string_erase(char *x);
|
||||||
|
|
||||||
char *string_free_erase(char *s);
|
char *string_free_erase(char *s);
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
|
#include "memory-util.h"
|
||||||
#include "socket-util.h"
|
#include "socket-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
Loading…
Reference in a new issue