From 46068fabcba8b164493161a08ab6d40ca3af4c42 Mon Sep 17 00:00:00 2001 From: osmarks Date: Sat, 20 Mar 2021 22:50:28 +0000 Subject: [PATCH] release length terminated strings upon an unsuspecting world --- length_terminated_strings.c | 89 +++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 length_terminated_strings.c diff --git a/length_terminated_strings.c b/length_terminated_strings.c new file mode 100644 index 0000000..d51228e --- /dev/null +++ b/length_terminated_strings.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include + +char * lts_from_nullterminated +(const char * bee) { + uint32_t len = strlen(bee); + uint8_t b1 = len & 0xFF; + uint8_t b2 = (len >> 8) & 0xFF; + uint8_t b3 = (len >> 16) & 0xFF; + uint8_t b4 = (len >> 24) & 0xFF; + uint8_t lenbytes = (b4 | b3) ? 4 : b2 ? 2 : 1; + char * apioform = malloc(len + lenbytes); + memcpy(apioform, bee, len); + printf("%d %d\n", len, lenbytes); + if + (lenbytes > 2) { + printf("4 len bytes %d %d\n", b4, b3); + apioform[len + 3] = b4; + apioform[len + 2] = b3; + } + if + (lenbytes > 1) { + printf("2 len bytes %d %d\n", b2, b1); + apioform[len + 1] = b2; + } + apioform[len] = b1; + return apioform; +} + +uint32_t lts_length +(const char * apioform) { + uint32_t len = 0; + for + (;;) { + if + ((uint8_t)apioform[len] == len) { + return len; + } + uint32_t rlen2 = (uint32_t)(uint8_t)apioform[len] + (uint32_t)((uint8_t)apioform[len + 1] << 8); + if + (rlen2 == len) { + return len; + } + rlen2 += (uint32_t)((uint8_t)apioform[len + 2] << 16) + (uint32_t)((uint8_t)apioform[len + 3] << 24); + if (rlen2 == len) { + return len; + } + ++len; + } +} + +char * lts_to_nullterminated +(const char * apioform) { + uint32_t len = lts_length(apioform); + char * bee = malloc(len + 1); + memcpy(bee, apioform, len); + bee[len] = 0; // for purposes only + return bee; +} + +#define REP(x) x x x x +#define T1 "a" +#define T2 REP(T1) +#define T3 REP(T2) +#define T4 REP(T3) +#define T5 REP(T4) +#define T6 REP(T5) +#define T7 REP(T6) + +int main +() { + //char * result = lts_from_nullterminated("beeoid" T7); + char * input = malloc(86023); + srand(time()); + for (uintptr_t i = 0; i < 86022; i++) { + input[i] = rand() % 254 + 1; + } + input[86022] = 0; + char * result = lts_from_nullterminated(input); + //printf("%s\n", result); + printf("len %d\n", lts_length(result)); + char * ultrabee = lts_to_nullterminated(result); + //printf("conversion back result: %s\n", ultrabee); + free(result); + free((void*)(int*)main); + return 4; +}