Dominique Pelle wrote:

> vim-7.4.703 accesses invalid memory when doing:
> 
>   $ vim -E -u NONE -c 'call search(getline("."))' crash
> 
> ... where 'crash' is the attached file (16 bytes).
> 
> Asan (address sanitizer) reports:
> 
> ==27746== ERROR: AddressSanitizer: heap-buffer-overflow on address
> 0x60620001af00 at pc 0x625f1d bp 0x7ffdd32cbb50 sp 0x7ffdd32cbb48
> READ of size 1 at 0x60620001af00 thread T0
>     #0 0x625f1c in utf_ptr2char /home/pel/sb/vim/src/mbyte.c:1696
>     #1 0x706a2c in find_match_text
> /home/pel/sb/vim/src/regexp_nfa.c:5389 (discriminator 1)
>     #2 0x70eda9 in nfa_regexec_both /home/pel/sb/vim/src/regexp_nfa.c:7070
>     #3 0x70f8bb in nfa_regexec_multi /home/pel/sb/vim/src/regexp_nfa.c:7298
>     #4 0x7101bd in vim_regexec_multi /home/pel/sb/vim/src/regexp.c:8274
>     #5 0x741aa4 in searchit /home/pel/sb/vim/src/search.c:639
>     #6 0x4956d3 in search_cmn /home/pel/sb/vim/src/eval.c:16365
>     #7 0x495f70 in f_search /home/pel/sb/vim/src/eval.c:16515
>     #8 0x4799f1 in call_func /home/pel/sb/vim/src/eval.c:8760
>     #9 0x478a71 in get_func_tv /home/pel/sb/vim/src/eval.c:8560
>     #10 0x4662e1 in ex_call /home/pel/sb/vim/src/eval.c:3505
>     #11 0x4f71b0 in do_one_cmd /home/pel/sb/vim/src/ex_docmd.c:2940
>     #12 0x4edf74 in do_cmdline /home/pel/sb/vim/src/ex_docmd.c:1133
>     #13 0x4ecf39 in do_cmdline_cmd /home/pel/sb/vim/src/ex_docmd.c:738
>     #14 0x84c849 in exe_commands /home/pel/sb/vim/src/main.c:2922
>     #15 0x8469dd in main /home/pel/sb/vim/src/main.c:958
>     #16 0x7fc8f5c1bec4 in __libc_start_main
> /build/buildd/eglibc-2.19/csu/libc-start.c:287
>     #17 0x405b18 in _start ??:?
> 0x60620001af00 is located 0 bytes to the right of 4096-byte region
> [0x606200019f00,0x60620001af00)
> allocated by thread T0 here:
>     #0 0x7fc8f76f841a in malloc ??:?
>     #1 0x604823 in lalloc /home/pel/sb/vim/src/misc2.c:926
>     #2 0x6045e3 in alloc /home/pel/sb/vim/src/misc2.c:821
>     #3 0x8580b9 in mf_alloc_bhdr /home/pel/sb/vim/src/memfile.c:952
>     #4 0x8564cf in mf_new /home/pel/sb/vim/src/memfile.c:392 (discriminator 1)
>     #5 0x5baa13 in ml_new_data /home/pel/sb/vim/src/memline.c:3545
>     #6 0x5abe82 in ml_open /home/pel/sb/vim/src/memline.c:408
>     #7 0x405d6e in open_buffer /home/pel/sb/vim/src/buffer.c:98
>     #8 0x84bd88 in create_windows /home/pel/sb/vim/src/main.c:2692
>     #9 0x8466ac in main /home/pel/sb/vim/src/main.c:881
>     #10 0x7fc8f5c1bec4 in __libc_start_main
> /build/buildd/eglibc-2.19/csu/libc-start.c:287
> Shadow bytes around the buggy address:
>   0x0c0cbfffb590: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x0c0cbfffb5a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x0c0cbfffb5b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x0c0cbfffb5c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x0c0cbfffb5d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> =>0x0c0cbfffb5e0:[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x0c0cbfffb5f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x0c0cbfffb600: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x0c0cbfffb610: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x0c0cbfffb620: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x0c0cbfffb630: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> 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 righ 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
>   ASan internal:         fe
> ==27746== ABORTING
> 
> Bug was found by using a fuzzer:
> 'american fuzzy lop' (http://lcamtuf.coredump.cx/afl/).
> 
> Sorry, no patch. Not sure how to fix it.

Well, this turned out to be a tricky one.  vim_strchr() happily matches
a character with an illegal byte.  Thus the character 255 would match
one byte, and other parts of the code would think it matched two bytes,
which is the actual utf-8 encoding.

After fixing this tests failed.  Turns out the equivalence classes were
using negative numbers, resulting in using illegal bytes to match
against, which accidentally worked, because of vim_strchr() matching
illegal bytes.

I'm making a patch that should fix all this.

-- 
"Beware of bugs in the above code; I have only proved
it correct, not tried it." -- Donald Knuth

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui