segfault on ggit_diff_new_buffers with bad buffer input
Trying to create a diff from buffers that don't contain a newline segfaults. A simple repro using the Python introspection:
>>> from gi.repository import Ggit
>>> d = Ggit.Diff.new_buffers(b'qwe', None, b'wer', None)
Admittedly, I don't know whether Python GI is involved here, but adding a newline to both buffers fixes the issue.
Stacktrace:
Thread 1 "python3" received signal SIGSEGV, Segmentation fault.
0x00007ffff7e5a38c in realloc () from /lib64/libc.so.6
(gdb) bt
0 0x00007ffff7e5a38c in realloc () at /lib64/libc.so.6
1 0x00007fffe2404bd2 in git__realloc (size=64, ptr=<optimized out>) at ../src/util.h:147
2 0x00007fffe2404bd2 in git_buf_try_grow (buf=buf@entry=0x55555555c138, target_size=<optimized out>, mark_oom=mark_oom@entry=true)
at ../src/buffer.c:80
3 0x00007fffe2404c9e in git_buf_grow (buffer=buffer@entry=0x55555555c138, target_size=<optimized out>) at ../src/buffer.c:104
4 0x00007fffe2405ad0 in git_buf_vprintf
(buf=buf@entry=0x55555555c138, format=format@entry=0x7fffe24a5078 "invalid patch hunk at line %zu", ap=ap@entry=0x7fffffffc8f0)
at ../src/buffer.c:520
5 0x00007fffe24246f1 in giterr_set
(error_class=error_class@entry=31, string=string@entry=0x7fffe24a5078 "invalid patch hunk at line %zu") at ../src/errors.c:64
6 0x00007fffe24587df in parse_hunk_body (ctx=<optimized out>, hunk=0x555555940850, patch=0x555555676a10) at ../src/patch_parse.c:581
7 0x00007fffe24587df in parse_patch_hunks (ctx=<optimized out>, patch=<optimized out>) at ../src/patch_parse.c:832
8 0x00007fffe24587df in parse_patch_body (ctx=0x555555676a10, patch=0x555555676a10) at ../src/patch_parse.c:850
9 0x00007fffe24587df in git_patch_parse (out=out@entry=0x7fffffffcb50, ctx=ctx@entry=0x5555556769b0) at ../src/patch_parse.c:1098
10 0x00007fffe241fff0 in git_diff_from_buffer (out=out@entry=0x7fffffffcbb0, content=<optimized out>, content_len=<optimized out>)
at ../src/diff_parse.c:87
11 0x00007fffe24f16f2 in ggit_diff_new_buffers
(buffer1=<optimized out>, buffer1_len=<optimized out>, buffer1_as_path=0x0, buffer2=0x7fffe19fc208 "wer", buffer2_len=<optimized out>, buffer2_as_path=0x0, diff_options=0x0, error=0x7fffffffce48) at ../libgit2-glib/ggit-diff.c:1010
12 0x00007fffea447b28 in ffi_call_unix64 () at /lib64/libffi.so.6
13 0x00007fffea447339 in ffi_call () at /lib64/libffi.so.6
14 0x00007fffea636b35 in () at /usr/lib64/python3.7/site-packages/gi/_gi.cpython-37m-x86_64-linux-gnu.so
15 0x00007fffea6384e8 in () at /usr/lib64/python3.7/site-packages/gi/_gi.cpython-37m-x86_64-linux-gnu.so
16 0x00007fffea63866c in () at /usr/lib64/python3.7/site-packages/gi/_gi.cpython-37m-x86_64-linux-gnu.so
17 0x00007fffea6292c4 in () at /usr/lib64/python3.7/site-packages/gi/_gi.cpython-37m-x86_64-linux-gnu.so
18 0x00007ffff7bcdc9c in _PyObject_FastCallKeywords () at /lib64/libpython3.7m.so.1.0
19 0x00007ffff7bcf0d9 in () at /lib64/libpython3.7m.so.1.0
20 0x00007ffff7c118b2 in _PyEval_EvalFrameDefault () at /lib64/libpython3.7m.so.1.0
21 0x00007ffff7bbb000 in _PyEval_EvalCodeWithName () at /lib64/libpython3.7m.so.1.0
22 0x00007ffff7bbbd59 in PyEval_EvalCodeEx () at /lib64/libpython3.7m.so.1.0
23 0x00007ffff7bbbd7b in PyEval_EvalCode () at /lib64/libpython3.7m.so.1.0
24 0x00007ffff7c88093 in () at /lib64/libpython3.7m.so.1.0
25 0x00007ffff7b5ed65 in () at /lib64/libpython3.7m.so.1.0
26 0x00007ffff7b66750 in PyRun_InteractiveLoopFlags () at /lib64/libpython3.7m.so.1.0
27 0x00007ffff7b667f1 in () at /lib64/libpython3.7m.so.1.0
28 0x00007ffff7c8fd9c in () at /lib64/libpython3.7m.so.1.0
29 0x00007ffff7c8ff4c in _Py_UnixMain () at /lib64/libpython3.7m.so.1.0
30 0x00007ffff7df7f33 in __libc_start_main () at /lib64/libc.so.6
31 0x000055555555508e in _start ()