diff options
author | Dave Barach <dave@barachs.net> | 2019-10-09 12:57:13 -0400 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2019-10-11 12:30:58 +0000 |
commit | 7e2cea3d26701ff1d80fda7d8ca907890e3e7baa (patch) | |
tree | 49dfbace1a56e09ef46402573090f9880fa57f2f /src/plugins/unittest/util_test.c | |
parent | 8563cb389a7e8d6d4e042e146c0d94b8af98ca7a (diff) |
vppinfra: fix page boundary crossing bug in hash_memory64
Fix a day-1 bug, possibly dating back as far as 2002. The zap64() game
involves fetching 8 byte chunks, and clearing octets not to be
included in the key.
That's fine *unless* the 8-byte fetch happens to cross a page boundary
into unmapped or no-access space.
Type: fix
Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: I4607e9840032257c96ba7387f86c931c0921749d
Diffstat (limited to 'src/plugins/unittest/util_test.c')
-rw-r--r-- | src/plugins/unittest/util_test.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/plugins/unittest/util_test.c b/src/plugins/unittest/util_test.c index d2f2715d763..67fe0093ab8 100644 --- a/src/plugins/unittest/util_test.c +++ b/src/plugins/unittest/util_test.c @@ -14,6 +14,7 @@ */ #include <vlib/vlib.h> +#include <sys/mman.h> static clib_error_t * test_crash_command_fn (vlib_main_t * vm, @@ -45,6 +46,67 @@ VLIB_CLI_COMMAND (test_crash_command, static) = }; /* *INDENT-ON* */ +static clib_error_t * +test_hash_command_fn (vlib_main_t * vm, + unformat_input_t * input, vlib_cli_command_t * cmd) +{ + uword hash1, hash2; + u8 *baseaddr; + u8 *key_loc; + + baseaddr = mmap (NULL, 8192, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 /* offset */ ); + + if (baseaddr == 0) + { + clib_unix_warning ("mmap"); + return 0; + } + + if (mprotect (baseaddr + (4 << 10), (4 << 10), PROT_NONE) < 0) + { + clib_unix_warning ("mprotect"); + return 0; + } + + key_loc = baseaddr + (4 << 10) - 4; + key_loc[0] = 0xde; + key_loc[1] = 0xad; + key_loc[2] = 0xbe; + key_loc[3] = 0xef; + + hash1 = hash_memory (key_loc, 4, 0ULL); + + vlib_cli_output (vm, "hash1 is %llx", hash1); + + key_loc = baseaddr; + + key_loc[0] = 0xde; + key_loc[1] = 0xad; + key_loc[2] = 0xbe; + key_loc[3] = 0xef; + + hash2 = hash_memory (key_loc, 4, 0ULL); + + vlib_cli_output (vm, "hash2 is %llx", hash2); + + if (hash1 == hash2) + vlib_cli_output (vm, "PASS..."); + else + vlib_cli_output (vm, "FAIL..."); + + return 0; +} + +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (test_hash_command, static) = +{ + .path = "test hash_memory", + .short_help = "page boundary crossing test", + .function = test_hash_command_fn, +}; +/* *INDENT-ON* */ + /* * fd.io coding-style-patch-verification: ON * |