diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-06-21 00:59:22 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-06-21 01:19:16 +0200 |
commit | 14db632212189df4fb3081d1c7345ca70bd1f6a5 (patch) | |
tree | f6e276f6f7fe732d106aa080f7a764e8c16fa3ab | |
parent | b01b4ec70f3e4d4a4648207e414a8f9eef8073e9 (diff) | |
download | gcompat-14db632212189df4fb3081d1c7345ca70bd1f6a5.tar.gz gcompat-14db632212189df4fb3081d1c7345ca70bd1f6a5.tar.bz2 gcompat-14db632212189df4fb3081d1c7345ca70bd1f6a5.tar.xz gcompat-14db632212189df4fb3081d1c7345ca70bd1f6a5.zip |
string: add memfrob and strfry
-rw-r--r-- | CHANGELOG.rst | 2 | ||||
-rw-r--r-- | libgcompat/string.c | 34 |
2 files changed, 36 insertions, 0 deletions
diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3ad98fe..ee9851d 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -40,6 +40,8 @@ string ------ * Add __strcspn_c2. +* Add memfrob. +* Add strfry. malloc diff --git a/libgcompat/string.c b/libgcompat/string.c index 5a1e558..9f1704b 100644 --- a/libgcompat/string.c +++ b/libgcompat/string.c @@ -3,6 +3,9 @@ #include <stddef.h> /* NULL, size_t */ #include <stdint.h> /* SIZE_MAX */ #include <string.h> /* memcpy, strcpy, strncat, strndup */ +#include <stdlib.h> /* rand_r */ +#include <unistd.h> /* getpid */ +#include <time.h> /* time */ #include "alias.h" /* weak_alias */ @@ -262,3 +265,34 @@ char *__strtok_r(char *s, const char *delim, char **save_ptr) { return strtok_r(s, delim, save_ptr); } + +void *memfrob(void *s, size_t n) +{ + unsigned char *c = s; + + while (n--) + *c++ ^= 42; + + return s; +} + +char *strfry(char *s) +{ + static unsigned int seed; + size_t len = strlen(s), i, j; + char t; + + if (!len) + return s; + + seed += time(NULL) ^ getpid() ^ (uintptr_t)s; + + for (i = 0; i < len - 1; ++i) { + j = rand_r(&seed) % (len - i) + i; + t = s[i]; + s[i] = s[j]; + s[j] = t; + } + + return s; +} |