diff options
author | Joe Rabinoff <jrabinoff6@math.gatech.edu> | 2018-12-04 10:12:24 -0500 |
---|---|---|
committer | Joe Rabinoff <jrabinoff6@math.gatech.edu> | 2018-12-04 10:12:24 -0500 |
commit | 36f807427910ac28c9278702a24b0577da944d1c (patch) | |
tree | fa1a6a8ca8418f46521c7639895e7c50ec7539eb | |
parent | e7873eb2cc0e96c9eebe653b6a5ba41daea4a28e (diff) | |
download | libgit2-36f807427910ac28c9278702a24b0577da944d1c.tar.gz |
Fix segfault in loose_backend__readstream
If the routine exits with error before stream or hash_ctx is initialized, the
program will segfault when trying to free them.
-rw-r--r-- | src/odb_loose.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/odb_loose.c b/src/odb_loose.c index c37b1eda2..5872a25b3 100644 --- a/src/odb_loose.c +++ b/src/odb_loose.c @@ -1028,11 +1028,16 @@ static int loose_backend__readstream( done: if (error < 0) { - git_futils_mmap_free(&stream->map); - git_zstream_free(&stream->zstream); - git_hash_ctx_cleanup(hash_ctx); - git__free(hash_ctx); - git__free(stream); + if(stream && stream->map.data) + git_futils_mmap_free(&stream->map); + if(stream) + git_zstream_free(&stream->zstream); + if(stream) + git__free(stream); + if(hash_ctx) { + git_hash_ctx_cleanup(hash_ctx); + git__free(hash_ctx); + } } git_buf_dispose(&object_path); |