From 32237e595651622ed21323ab326e7fe262b65b48 Mon Sep 17 00:00:00 2001 From: Mathis Rosenhauer Date: Fri, 10 Aug 2012 16:53:27 +0200 Subject: [PATCH] fixed some leaks and mem errors --- src/Makefile | 4 ++-- src/aed.c | 19 +++++++++++++++---- src/aee.c | 23 ++++++++++++++--------- src/libae.h | 2 ++ src/sz_compat.c | 6 ++++++ src/test_decode.c | 3 +++ src/test_encode.c | 3 +++ 7 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/Makefile b/src/Makefile index ad1bedc..852efd4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,7 +1,7 @@ CC = gcc #CFLAGS = -g -pg -lc -O2 -Wall -fprofile-arcs -ftest-coverage -DPROFILE -CFLAGS = -g -pg -lc -O2 -Wall -fprofile-arcs -ftest-coverage -DUNROLL_BLOCK_8 -#CFLAGS = -g -O3 -Wall -DUNROLL_BLOCK_8 +#CFLAGS = -g -pg -lc -O2 -Wall -fprofile-arcs -ftest-coverage -DUNROLL_BLOCK_8 +CFLAGS = -g -O3 -Wall -DUNROLL_BLOCK_8 OBJS = aee.o aed.o sz_compat.o diff --git a/src/aed.c b/src/aed.c index 7d00465..e9981da 100644 --- a/src/aed.c +++ b/src/aed.c @@ -326,6 +326,17 @@ int ae_decode_init(ae_streamp strm) return AE_OK; } +int ae_decode_end(ae_streamp strm) +{ + decode_state *state; + + state = strm->state; + free(state->block); + free(state->id_table); + free(state); + return AE_OK; +} + #define ASK(n) \ do { \ while (state->bitp < (unsigned)(n)) \ @@ -426,7 +437,7 @@ int ae_decode(ae_streamp strm, int flush) state->n = strm->block_size; } - state->i = state->n; + state->i = state->n - 1; state->mode = M_SPLIT_FS; case M_SPLIT_FS: @@ -436,9 +447,9 @@ int ae_decode(ae_streamp strm, int flush) state->block[state->i] = GETFS(); DROPFS(); } - while(--state->i); + while(state->i--); - state->i = state->n; + state->i = state->n - 1; state->mode = M_SPLIT_OUTPUT; case M_SPLIT_OUTPUT: @@ -449,7 +460,7 @@ int ae_decode(ae_streamp strm, int flush) PUT((state->block[state->i] << k) + GET(k)); DROP(k); } - while(--state->i); + while(state->i--); state->mode = M_ID; break; diff --git a/src/aee.c b/src/aee.c index fc356fe..bae510a 100644 --- a/src/aee.c +++ b/src/aee.c @@ -206,6 +206,20 @@ int ae_encode_init(ae_streamp strm) return AE_OK; } +int ae_encode_end(ae_streamp strm) +{ + encode_state *state; + + state = strm->state; +#ifdef PROFILE + free(state->prof); +#endif + free(state->block_in); + free(state->block_out); + free(state); + return AE_OK; +} + static inline void emit(encode_state *state, int64_t data, int bits) { while(bits) @@ -595,14 +609,5 @@ int ae_encode(ae_streamp strm, int flush) req_buffer: strm->total_out = total_out; strm->avail_out = avail_out; - if (strm->avail_in == 0 && avail_out && flush == AE_FLUSH) - { -#ifdef PROFILE - free(state->prof); -#endif - free(state->block_in); - free(state->block_out); - free(strm->state); - } return AE_OK; } diff --git a/src/libae.h b/src/libae.h index 460aee3..51e34de 100644 --- a/src/libae.h +++ b/src/libae.h @@ -59,8 +59,10 @@ typedef ae_stream *ae_streamp; int ae_decode_init(ae_streamp strm); int ae_decode(ae_streamp strm, int flush); +int ae_decode_end(ae_streamp strm); int ae_encode_init(ae_streamp strm); int ae_encode(ae_streamp strm, int flush); +int ae_encode_end(ae_streamp strm); #endif /* LIBAE_H */ diff --git a/src/sz_compat.c b/src/sz_compat.c index f88e9ff..ed4e4d6 100644 --- a/src/sz_compat.c +++ b/src/sz_compat.c @@ -21,6 +21,9 @@ int SZ_BufftoBuffCompress(void *dest, size_t *destLen, const void *source, size_ if ((status = ae_encode(&strm, AE_FLUSH)) != AE_OK) return status; + if ((status = ae_encode_end(&strm)) != AE_OK) + return status; + *destLen = strm.total_out; return SZ_OK; } @@ -45,6 +48,9 @@ int SZ_BufftoBuffDecompress(void *dest, size_t *destLen, const void *source, siz if ((status = ae_decode(&strm, AE_FLUSH)) != AE_OK) return status; + if ((status = ae_decode_end(&strm)) != AE_OK) + return status; + *destLen = strm.total_out; return SZ_OK; } diff --git a/src/test_decode.c b/src/test_decode.c index a9d5b15..65a67f6 100644 --- a/src/test_decode.c +++ b/src/test_decode.c @@ -88,5 +88,8 @@ int main(int argc, char *argv[]) } + ae_decode_end(&strm); + free(in); + free(out); return 0; } diff --git a/src/test_encode.c b/src/test_encode.c index 957ef3a..41c01b9 100644 --- a/src/test_encode.c +++ b/src/test_encode.c @@ -105,5 +105,8 @@ int main(int argc, char *argv[]) putc(out[i], stdout); } } + ae_encode_end(&strm); + free(in); + free(out); return 0; } -- GitLab