summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Rabinoff <jrabinoff6@math.gatech.edu>2018-12-04 10:12:24 -0500
committerJoe Rabinoff <jrabinoff6@math.gatech.edu>2018-12-04 10:12:24 -0500
commit36f807427910ac28c9278702a24b0577da944d1c (patch)
treefa1a6a8ca8418f46521c7639895e7c50ec7539eb
parente7873eb2cc0e96c9eebe653b6a5ba41daea4a28e (diff)
downloadlibgit2-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.c15
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);