summaryrefslogtreecommitdiff
path: root/bsdiff.c
diff options
context:
space:
mode:
authorMatthew Endsley <mendsley@gmail.com>2012-05-11 21:54:00 -0700
committerMatthew Endsley <mendsley@gmail.com>2012-05-14 01:04:24 -0700
commit1d0d6045671f00f1c96dd980b4113e57b1f48724 (patch)
tree0d923159c3f233d06cfba6a65a9959486597b962 /bsdiff.c
parentbf86e11152202816b0cfe2c8522945b8191c36dc (diff)
downloadbsdiff-1d0d6045671f00f1c96dd980b4113e57b1f48724.tar.gz
moving core allocations to trampoline function so they're freed on error
Diffstat (limited to 'bsdiff.c')
-rw-r--r--bsdiff.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/bsdiff.c b/bsdiff.c
index 094884e..d3f56e8 100644
--- a/bsdiff.c
+++ b/bsdiff.c
@@ -213,6 +213,8 @@ struct bsdiff_request
int64_t newsize;
struct bsdiff_compressor* compressor;
struct bsdiff_header* header;
+ int64_t *I;
+ uint8_t *db, *eb;
};
static int bsdiff_internal(const struct bsdiff_request req)
@@ -229,14 +231,14 @@ static int bsdiff_internal(const struct bsdiff_request req)
uint8_t *db,*eb;
uint8_t buf[8 * 3];
- if(((I=malloc((req.oldsize+1)*sizeof(int64_t)))==NULL) ||
- ((V=malloc((req.oldsize+1)*sizeof(int64_t)))==NULL)) return -1;
+ if((V=malloc((req.oldsize+1)*sizeof(int64_t)))==NULL) return -1;
+ I = req.I;
qsufsort(I,V,req.old,req.oldsize);
-
free(V);
- if(((db=malloc(req.newsize+1))==NULL) ||
- ((eb=malloc(req.newsize+1))==NULL)) return -1;
+
+ db = req.db;
+ eb = req.eb;
dblen=0;
eblen=0;
filelen=0;
@@ -362,24 +364,44 @@ static int bsdiff_internal(const struct bsdiff_request req)
if (compresslen == -1)
return -1;
- /* Free the memory we used */
- free(db);
- free(eb);
- free(I);
-
return 0;
}
int bsdiff(uint8_t* old, int64_t oldsize, uint8_t* new, int64_t newsize, struct bsdiff_compressor* compressor, struct bsdiff_header* header)
{
+ int result;
struct bsdiff_request req;
+
+ if((req.I=malloc((oldsize+1)*sizeof(int64_t)))==NULL)
+ return -1;
+
+ if((req.db=malloc(newsize+1))==NULL)
+ {
+ free(req.I);
+ return -1;
+ }
+
+ if((req.eb=malloc(newsize+1))==NULL)
+ {
+ free(req.db);
+ free(req.I);
+ return -1;
+ }
+
req.old = old;
req.oldsize = oldsize;
req.new = new;
req.newsize = newsize;
req.compressor = compressor;
req.header = header;
- return bsdiff_internal(req);
+
+ result = bsdiff_internal(req);
+
+ free(req.eb);
+ free(req.db);
+ free(req.I);
+
+ return result;
}
#if !defined(BSDIFF_LIBRARY)