author | Lars Hjemli <hjemli@gmail.com> | 2009-02-01 18:29:24 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2009-02-01 18:29:24 (UTC) |
commit | 481ce5e298e2dcd7edc1d4a30e523dda2ce58b01 (patch) (unidiff) | |
tree | b5a2acddf2403fcbaecc17b206ec44044a30cf27 | |
parent | ae1d4d75b2a2eb3534ff4b3685cc5c0b80007ef7 (diff) | |
download | cgit-481ce5e298e2dcd7edc1d4a30e523dda2ce58b01.zip cgit-481ce5e298e2dcd7edc1d4a30e523dda2ce58b01.tar.gz cgit-481ce5e298e2dcd7edc1d4a30e523dda2ce58b01.tar.bz2 |
shared.c: avoid SEGFAULT when checking for binary buffers
Before calling buffer_is_binary() we need to verify that the buffer
is valid.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | shared.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -250,50 +250,50 @@ int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) | |||
250 | if (diffbuf) { | 250 | if (diffbuf) { |
251 | ((linediff_fn)priv)(diffbuf, buflen); | 251 | ((linediff_fn)priv)(diffbuf, buflen); |
252 | free(diffbuf); | 252 | free(diffbuf); |
253 | diffbuf = NULL; | 253 | diffbuf = NULL; |
254 | buflen = 0; | 254 | buflen = 0; |
255 | } | 255 | } |
256 | return 0; | 256 | return 0; |
257 | } | 257 | } |
258 | 258 | ||
259 | int cgit_diff_files(const unsigned char *old_sha1, | 259 | int cgit_diff_files(const unsigned char *old_sha1, |
260 | const unsigned char *new_sha1, unsigned long *old_size, | 260 | const unsigned char *new_sha1, unsigned long *old_size, |
261 | unsigned long *new_size, int *binary, linediff_fn fn) | 261 | unsigned long *new_size, int *binary, linediff_fn fn) |
262 | { | 262 | { |
263 | mmfile_t file1, file2; | 263 | mmfile_t file1, file2; |
264 | xpparam_t diff_params; | 264 | xpparam_t diff_params; |
265 | xdemitconf_t emit_params; | 265 | xdemitconf_t emit_params; |
266 | xdemitcb_t emit_cb; | 266 | xdemitcb_t emit_cb; |
267 | 267 | ||
268 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) | 268 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) |
269 | return 1; | 269 | return 1; |
270 | 270 | ||
271 | *old_size = file1.size; | 271 | *old_size = file1.size; |
272 | *new_size = file2.size; | 272 | *new_size = file2.size; |
273 | 273 | ||
274 | if (buffer_is_binary(file1.ptr, file1.size) || | 274 | if ((file1.ptr && buffer_is_binary(file1.ptr, file1.size)) || |
275 | buffer_is_binary(file2.ptr, file2.size)) { | 275 | (file2.ptr && buffer_is_binary(file2.ptr, file2.size))) { |
276 | *binary = 1; | 276 | *binary = 1; |
277 | return 0; | 277 | return 0; |
278 | } | 278 | } |
279 | 279 | ||
280 | memset(&diff_params, 0, sizeof(diff_params)); | 280 | memset(&diff_params, 0, sizeof(diff_params)); |
281 | memset(&emit_params, 0, sizeof(emit_params)); | 281 | memset(&emit_params, 0, sizeof(emit_params)); |
282 | memset(&emit_cb, 0, sizeof(emit_cb)); | 282 | memset(&emit_cb, 0, sizeof(emit_cb)); |
283 | diff_params.flags = XDF_NEED_MINIMAL; | 283 | diff_params.flags = XDF_NEED_MINIMAL; |
284 | emit_params.ctxlen = 3; | 284 | emit_params.ctxlen = 3; |
285 | emit_params.flags = XDL_EMIT_FUNCNAMES; | 285 | emit_params.flags = XDL_EMIT_FUNCNAMES; |
286 | emit_cb.outf = filediff_cb; | 286 | emit_cb.outf = filediff_cb; |
287 | emit_cb.priv = fn; | 287 | emit_cb.priv = fn; |
288 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); | 288 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); |
289 | return 0; | 289 | return 0; |
290 | } | 290 | } |
291 | 291 | ||
292 | void cgit_diff_tree(const unsigned char *old_sha1, | 292 | void cgit_diff_tree(const unsigned char *old_sha1, |
293 | const unsigned char *new_sha1, | 293 | const unsigned char *new_sha1, |
294 | filepair_fn fn, const char *prefix) | 294 | filepair_fn fn, const char *prefix) |
295 | { | 295 | { |
296 | struct diff_options opt; | 296 | struct diff_options opt; |
297 | int ret; | 297 | int ret; |
298 | int prefixlen; | 298 | int prefixlen; |
299 | 299 | ||