diff --git a/include/common/standard.h b/include/common/standard.h index d8bccbafb..6e1e840b7 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -1551,6 +1551,7 @@ static inline void *my_realloc2(void *ptr, size_t size) int parse_dotted_uints(const char *s, unsigned int **nums, size_t *sz); /* PRNG */ +void ha_generate_uuid(struct buffer *output); void ha_random_seed(const unsigned char *seed, size_t len); void ha_random_jump96(uint32_t dist); uint64_t ha_random64(); diff --git a/src/flt_spoe.c b/src/flt_spoe.c index bcdec08e7..df080d816 100644 --- a/src/flt_spoe.c +++ b/src/flt_spoe.c @@ -257,33 +257,8 @@ static const char *spoe_appctx_state_str[SPOE_APPCTX_ST_END+1] = { static char * generate_pseudo_uuid() { - char *uuid; - uint32_t rnd[4] = { 0, 0, 0, 0 }; - uint64_t last = 0; - int byte = 0; - uint8_t bits = 0; - unsigned int rand_max_bits = my_flsl(RAND_MAX); - - if ((uuid = calloc(1, 37)) == NULL) - return NULL; - - while (byte < 4) { - while (bits < 32) { - last |= (uint64_t)ha_random() << bits; - bits += rand_max_bits; - } - rnd[byte++] = last; - last >>= 32u; - bits -= 32; - } - snprintf(uuid, 37, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx", - rnd[0], - rnd[1] & 0xFFFF, - ((rnd[1] >> 16u) & 0xFFF) | 0x4000, // highest 4 bits indicate the uuid version - (rnd[2] & 0x3FFF) | 0x8000, // the highest 2 bits indicate the UUID variant (10), - (long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull - ); - return uuid; + ha_generate_uuid(&trash); + return trash.area; } diff --git a/src/sample.c b/src/sample.c index 088da418b..d602887b8 100644 --- a/src/sample.c +++ b/src/sample.c @@ -3328,30 +3328,7 @@ static int smp_check_uuid(struct arg *args, char **err) static int smp_fetch_uuid(const struct arg *args, struct sample *smp, const char *kw, void *private) { if (args[0].data.sint == 4 || !args[0].type) { - uint32_t rnd[4] = { 0, 0, 0, 0 }; - uint64_t last = 0; - int byte = 0; - uint8_t bits = 0; - unsigned int rand_max_bits = my_flsl(RAND_MAX); - - while (byte < 4) { - while (bits < 32) { - last |= (uint64_t)ha_random() << bits; - bits += rand_max_bits; - } - rnd[byte++] = last; - last >>= 32u; - bits -= 32; - } - - chunk_printf(&trash, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx", - rnd[0], - rnd[1] & 0xFFFF, - ((rnd[1] >> 16u) & 0xFFF) | 0x4000, // highest 4 bits indicate the uuid version - (rnd[2] & 0x3FFF) | 0x8000, // the highest 2 bits indicate the UUID variant (10), - (long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull - ); - + ha_generate_uuid(&trash); smp->data.type = SMP_T_STR; smp->flags = SMP_F_VOL_TEST | SMP_F_MAY_CHANGE; smp->data.u.str = trash; diff --git a/src/standard.c b/src/standard.c index 5ccf44776..e0ea8328e 100644 --- a/src/standard.c +++ b/src/standard.c @@ -4640,6 +4640,31 @@ void ha_random_jump96(uint32_t dist) } } +/* Generates an RFC4122 UUID into chunk which must be at least 37 + * bytes large. + */ +void ha_generate_uuid(struct buffer *output) +{ + uint32_t rnd[4]; + uint64_t last; + + last = ha_random64(); + rnd[0] = last; + rnd[1] = last >> 32; + + last = ha_random64(); + rnd[2] = last; + rnd[3] = last >> 32; + + chunk_printf(output, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx", + rnd[0], + rnd[1] & 0xFFFF, + ((rnd[1] >> 16u) & 0xFFF) | 0x4000, // highest 4 bits indicate the uuid version + (rnd[2] & 0x3FFF) | 0x8000, // the highest 2 bits indicate the UUID variant (10), + (long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull); +} + + /* * Local variables: * c-indent-level: 8