Skip to content

Commit

Permalink
Randomize upb's map ordering
Browse files Browse the repository at this point in the history
We use the address of a variable as the seed for upb's hash function, and this
allows us to get some randomness from ASLR.

The randomness is not perfect, especially since it won't necessarily help when
ASLR is not enabled. However, it seems to be enough to prevent unit tests from
relying on a deterministic map ordering.

PiperOrigin-RevId: 721950394
  • Loading branch information
acozzette authored and copybara-github committed Feb 1, 2025
1 parent 9a228e1 commit 066531d
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions upb/hash/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,9 +402,14 @@ uint32_t _upb_Hash(const void* p, size_t n, uint64_t seed) {
return Wyhash(p, n, seed, kWyhashSalt);
}

// Returns a seed for upb's hash function. For now this is just a hard-coded
// constant, but we are going to randomize it soon.
static uint64_t _upb_Seed(void) { return 0x69835f69597ec1cc; }
static const void* const _upb_seed;

// Returns a random seed for upb's hash function. This does not provide
// high-quality randomness, but it should be enough to prevent unit tests from
// relying on a deterministic map ordering. By returning the address of a
// variable, we are able to get some randomness for free provided that ASLR is
// enabled.
static uint64_t _upb_Seed(void) { return (uint64_t)&_upb_seed; }

static uint32_t _upb_Hash_NoSeed(const char* p, size_t n) {
return _upb_Hash(p, n, _upb_Seed());
Expand Down

0 comments on commit 066531d

Please sign in to comment.