Fedora 25
Angband 4.1.0 (sdl front end)
Probably reproducible on most other platforms and front ends.
If you create a keymap exactly 20 characters long, the code triggers a read past the end of the array.
It seams the UB is lying dormant. I spotted it using -fsanitize=undefined. Better kill it now before it comes for us.
How to reproduce:
1. recompile with -fsanitize=undefined
2. create a keymap
3. enter 20 characters (maximum allowed)
4. -fsanitize=undefined crashes the game, printing the diagnostic:
Angband 4.1.0 (sdl front end)
Probably reproducible on most other platforms and front ends.
If you create a keymap exactly 20 characters long, the code triggers a read past the end of the array.
It seams the UB is lying dormant. I spotted it using -fsanitize=undefined. Better kill it now before it comes for us.
How to reproduce:
1. recompile with -fsanitize=undefined
Code:
$ make clean $ SANITIZE_FLAGS="-fsanitize=undefined -fsanitize=address" ./configure $ SANITIZE_FLAGS="-fsanitize=undefined -fsanitize=address" make
3. enter 20 characters (maximum allowed)
4. -fsanitize=undefined crashes the game, printing the diagnostic:
Code:
==1845==ERROR: AddressSanitizer: global-buffer-overflow on address 0x000001090db0 at pc 0x000000696727 bp 0x7ffc2612be20 sp 0x7ffc2612be10 READ of size 4 at 0x000001090db0 thread T0 #0 0x696726 in keypress_to_text /home/user/angband/src/ui-event.c:225 #1 0x6e6b14 in ui_keymap_create /home/user/angband/src/ui-options.c:488 #2 0x6c4a68 in menu_action_handle /home/user/angband/src/ui-menu.c:102 #3 0x6cb9da in menu_handle_action /home/user/angband/src/ui-menu.c:661 #4 0x6cd0a8 in menu_select /home/user/angband/src/ui-menu.c:797 #5 0x6e7651 in do_cmd_keymaps /home/user/angband/src/ui-options.c:601 #6 0x6c4a68 in menu_action_handle /home/user/angband/src/ui-menu.c:102 #7 0x6cb9da in menu_handle_action /home/user/angband/src/ui-menu.c:661 #8 0x6cd0a8 in menu_select /home/user/angband/src/ui-menu.c:797 #9 0x6ee955 in do_cmd_options /home/user/angband/src/ui-options.c:1826 #10 0x677a8c in do_cmd_xxx_options /home/user/angband/src/ui-command.c:138 #11 0x697c89 in textui_process_command /home/user/angband/src/ui-game.c:313 #12 0x697e02 in textui_get_cmd /home/user/angband/src/ui-game.c:325 #13 0x698ccf in play_game /home/user/angband/src/ui-game.c:434 #14 0x7679c4 in main /home/user/angband/src/main.c:524 #15 0x7f841dba2400 in __libc_start_main (/lib64/libc.so.6+0x20400) #16 0x403769 in _start (/home/user/angband/src/angband+0x403769) 0x000001090db0 is located 0 bytes to the right of global variable 'keymap_buffer' defined in 'ui-options.c:377:24' (0x1090cc0) of size 240 0x000001090db0 is located 48 bytes to the left of global variable 'keymap_menu' defined in 'ui-options.c:574:21' (0x1090de0) of size 8 SUMMARY: AddressSanitizer: global-buffer-overflow /home/user/angband/src/ui-event.c:225 in keypress_to_text Shadow bytes around the buggy address: 0x00008020a160: 04 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 0x00008020a170: 04 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 f9 f9 f9 f9 0x00008020a180: 04 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9 0x00008020a190: 01 f9 f9 f9 f9 f9 f9 f9 00 00 00 00 00 00 00 00 0x00008020a1a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =>0x00008020a1b0: 00 00 00 00 00 00[f9]f9 f9 f9 f9 f9 00 f9 f9 f9 0x00008020a1c0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x00008020a1d0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 0x00008020a1e0: f9 f9 f9 f9 00 00 00 06 f9 f9 f9 f9 00 05 f9 f9 0x00008020a1f0: f9 f9 f9 f9 00 02 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x00008020a200: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 04 f9 f9 f9 Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Heap right redzone: fb Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack partial redzone: f4 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb ==1845==ABORTING