X-Git-Url: http://pileus.org/git/?p=aweather;a=blobdiff_plain;f=src%2Fwsr88ddec.c;h=9db0589c89dfa863f8d65fd8fdcd4091a0fa2c7b;hp=71fc432369e56737077ed9f3a53b3efe9db9908f;hb=9e734911e96ae83b0f41afa5073d5313bc197d96;hpb=518768fdda018e6ee4089bd848350fe26e9c0cc1 diff --git a/src/wsr88ddec.c b/src/wsr88ddec.c index 71fc432..9db0589 100644 --- a/src/wsr88ddec.c +++ b/src/wsr88ddec.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andy Spencer + * Copyright (C) 2009-2011 Andy Spencer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,6 +18,8 @@ #include #include +#define SANITY_MAX_SIZE 50*1024*1024 // 50 MB/bzip + char *bunzip2(char *input, int input_len, int *output_len) { bz_stream *stream = g_new0(bz_stream, 1); @@ -26,8 +28,8 @@ char *bunzip2(char *input, int input_len, int *output_len) case BZ_CONFIG_ERROR: g_error("the library has been mis-compiled"); case BZ_PARAM_ERROR: g_error("Parameter error"); case BZ_MEM_ERROR: g_error("insufficient memory is available"); - //case BZ_OK: g_debug("success\n"); break; - //default: g_debug("unknown\n"); break; + //case BZ_OK: g_debug("success"); break; + //default: g_debug("unknown"); break; } int status; @@ -39,21 +41,21 @@ char *bunzip2(char *input, int input_len, int *output_len) stream->avail_in = input_len - stream->total_in_lo32; output_size *= 2; output = g_realloc(output, output_size); - //g_debug("alloc %d\n", output_size); + //g_debug("alloc %d", output_size); stream->next_out = output + stream->total_out_lo32; stream->avail_out = output_size - stream->total_out_lo32; //g_debug("decompressing..\n" // " next_in = %p\n" // " avail_in = %u\n" // " next_out = %p\n" - // " avail_out = %u\n", + // " avail_out = %u", // stream->next_in, // stream->avail_in, // stream->next_out, // stream->avail_out); - } while ((status = BZ2_bzDecompress(stream)) == BZ_OK && output_size < 1024*1024); + } while ((status = BZ2_bzDecompress(stream)) == BZ_OK && output_size < SANITY_MAX_SIZE); - // g_debug("done with status %d = %d\n", status, BZ_STREAM_END); + //g_debug("done with status %d = %d", status, BZ_STREAM_END); *output_len = stream->total_out_lo32; BZ2_bzDecompressEnd(stream); @@ -77,34 +79,35 @@ int main(int argc, char **argv) char *buf = g_malloc(24); /* Clear header */ - //g_debug("reading header\n"); + //g_debug("reading header"); if (!fread (buf, 24, 1, input)) g_error("error reading header"); if (!fwrite(buf, 24, 1, output)) g_error("error writing header"); - //g_debug("reading body\n"); + //g_debug("reading body"); while ((st = fread(&size, 1, 4, input))) { - //g_debug("size=%08x\n", size); - //g_debug("read %u bytes\n", st); + //g_debug("size=%08x", size); + //g_debug("read %u bytes", st); //fwrite(&size, 1, 4, output); // DEBUG size = ABS(g_ntohl(size)); if (size < 0) return 0; - //g_debug("size = %x\n", size); - if (size > 20*1024*1024) + //g_debug("size = %x", size); + if (size > SANITY_MAX_SIZE) g_error("sanity check failed, buf is to big: %d", size); buf = g_realloc(buf, size); - if (!fread(buf, size, 1, input)) + if (fread(buf, 1, size, input) != size) g_error("error reading data"); //fwrite(buf, 1, size, output); // DEBUG int dec_len; char *dec = bunzip2(buf, size, &dec_len); - // g_debug("decompressed %u bytes\n", dec_len); - if (!fwrite(dec, 1, dec_len, output)) + //g_debug("decompressed %u bytes", dec_len); + if (fwrite(dec, 1, dec_len, output) != dec_len) g_error("error writing data"); g_free(dec); + //g_debug("decompressed %-6x -> %x", size, dec_len); } return 0;