place ssdeep_context on the heap
authorHelmut Grohne <helmut@subdivi.de>
Sun, 24 Mar 2013 13:47:04 +0000 (14:47 +0100)
committerHelmut Grohne <helmut@subdivi.de>
Sun, 24 Mar 2013 13:47:04 +0000 (14:47 +0100)
When publishing an API based on ssdeep_context this enables us to change
its size without breaking API or ABI. Also splint appears to cope better
with that.

fuzzy.c

diff --git a/fuzzy.c b/fuzzy.c
index b530e92..71dedf2 100644 (file)
--- a/fuzzy.c
+++ b/fuzzy.c
@@ -122,10 +122,15 @@ struct ssdeep_context {
        struct roll_state roll;
 };
 
-static int ssdeep_init(/*@out@*/ struct ssdeep_context *self) {
+static /*@only@*/ /*@null@*/ struct ssdeep_context *ssdeep_new(void) {
+       struct ssdeep_context *self;
+       if(NULL == (self = malloc(sizeof(struct ssdeep_context))))
+               return NULL;
        self->blockhashes = malloc(sizeof(struct blockhash_context));
-       if(NULL == self->blockhashes)
-               return -1;
+       if(NULL == self->blockhashes) {
+               free(self);
+               return NULL;
+       }
        self->start_blocksize = MIN_BLOCKSIZE;
        self->blockhashes->h = HASH_INIT;
        self->blockhashes->halfh = HASH_INIT;
@@ -133,7 +138,7 @@ static int ssdeep_init(/*@out@*/ struct ssdeep_context *self) {
        self->blockhashes->next = NULL;
        self->total_size = 0;
        roll_init(&self->roll);
-       return 0;
+       return self;
 }
 
 static void ssdeep_try_reduce_blockhash(struct ssdeep_context *self) {
@@ -293,7 +298,7 @@ static void ssdeep_digest(const struct ssdeep_context *self,
        *result = '\0';
 }
 
-static void ssdeep_clear(struct ssdeep_context *self) {
+static void ssdeep_free(/*@only@*/ struct ssdeep_context *self) {
        struct blockhash_context *bh, *bhn;
        bh = self->blockhashes;
        while(bh) {
@@ -301,27 +306,28 @@ static void ssdeep_clear(struct ssdeep_context *self) {
                free(bh);
                bh = bhn;
        }
+       free(self);
 }
 
 int fuzzy_hash_buf(const unsigned char *buf, uint32_t buf_len,
                /*@out@*/ char *result) {
-       struct ssdeep_context ctx[1];
-       if(ssdeep_init(ctx) < 0)
+       struct ssdeep_context *ctx;
+       if(NULL == (ctx = ssdeep_new()))
                return -1;
        if(ssdeep_engine(ctx, buf, buf_len) < 0) {
-               ssdeep_clear(ctx);
+               ssdeep_free(ctx);
                return -1;
        }
        ssdeep_digest(ctx, result);
-       ssdeep_clear(ctx);
+       ssdeep_free(ctx);
        return 0;
 }
 
 int fuzzy_hash_stream(FILE *handle, /*@out@*/ char *result) {
-       struct ssdeep_context ctx[1];
+       struct ssdeep_context *ctx;
        unsigned char buffer[4096];
        size_t n;
-       if(ssdeep_init(ctx) < 0)
+       if(NULL == (ctx = ssdeep_new()))
                return -1;
        for(;;) {
                n = fread(buffer, 1, 4096, handle);
@@ -333,10 +339,10 @@ int fuzzy_hash_stream(FILE *handle, /*@out@*/ char *result) {
        if(ferror(handle) != 0)
                goto errout;
        ssdeep_digest(ctx, result);
-       ssdeep_clear(ctx);
+       ssdeep_free(ctx);
        return 0;
 errout:
-       ssdeep_clear(ctx);
+       ssdeep_free(ctx);
        return -1;
 }