2012-08-03 3 views
0

안녕하세요. 저는 기본적으로 zlib 라이브러리를 사용하려고합니다. 그러나 다른 zlib'd 파일을 팽창 시켰을 때 자체적으로 압축 된 파일을 팽창 시키려고 할 때 문제가 발생합니다.Zlib가 오류를 팽창시키고 줄입니다.

로터리 압축기의 압축 코드 :

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef unsigned char BYTE; 
typedef unsigned int UINT; 
#include "zlib.h" 
#define HEADERSIZE (1024) 
#define CHUNKSIZE 4096 
#define SWAPINT(x) (((x)&0xFF) << 24)|(((x)&0xFF00) << 8) | (((x)&0xFF0000) >> 8) | (((x)&0xFF000000) >> 24) 
#define DEFLATESIZE 65536 
const char *mz_error(int err) 
{ 
    static struct { int m_err; const char *m_pDesc; } s_error_descs[] = 
    { 
    { Z_OK, "" }, { Z_STREAM_END, "stream end" }, { Z_NEED_DICT, "need dictionary" }, { Z_ERRNO, "file error" }, { Z_STREAM_ERROR, "stream error" }, 
    { Z_DATA_ERROR, "data error" }, { Z_MEM_ERROR, "out of memory" }, { Z_BUF_ERROR, "buf error" }, { Z_VERSION_ERROR, "version error" } 
    }; 
    UINT i; for (i = 0; i < sizeof(s_error_descs)/sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc; 
    return NULL; 
} 

char* myinflate(char* buffer, int bufsize, int* inflatedSize) 
{ 
    BYTE tmpinf[DEFLATESIZE]; 
    char* inflated=(char*)malloc(DEFLATESIZE); 
    int ret,have; 
    z_stream strm; 
    strm.zalloc = Z_NULL; 
    strm.zfree = Z_NULL; 
    strm.opaque = Z_NULL; 
    strm.avail_in = bufsize; 
    strm.next_in = (Bytef*)buffer; 
    strm.avail_out = sizeof(tmpinf); 
    strm.next_out = tmpinf; 
    ret = inflateInit(&strm); 
    printf("%s",mz_error(ret)); 
    ret = inflate(&strm, Z_FINISH); 
    printf("%s",mz_error(ret)); 
    if(ret == Z_DATA_ERROR) 
     printf(strm.msg); 
    inflateEnd(&strm); 
    have = strm.total_out; 
    printf("%d\n",have); 
    memcpy(inflated,tmpinf,have); 
    *inflatedSize = have; 
    return inflated; 
} 
char* mydeflate(char* buffer, int bufsize, int* deflatedSize) 
{ 
    BYTE tmpdef[CHUNKSIZE*4]; 
    char* deflated=(char*)malloc(DEFLATESIZE); 
    int have,ret; 
    z_stream strm; 
    strm.zalloc = Z_NULL; 
    strm.zfree = Z_NULL; 
    strm.opaque = Z_NULL; 
    strm.avail_in = bufsize; 
    strm.next_in = (Bytef*)buffer; 
    strm.avail_out = sizeof(tmpdef); 
    strm.next_out = tmpdef; 
    ret = deflateInit(&strm,Z_DEFAULT_COMPRESSION); 
    printf("%s",mz_error(ret)); 
    ret = deflate(&strm, Z_FINISH); 
    printf("%s",mz_error(ret)); 
    ret = deflateEnd(&strm); 
    printf("%s",mz_error(ret)); 
    have = strm.total_out; 
    printf("%d\n",have); 
    memcpy(deflated,tmpdef,have); 
    *deflatedSize = have; 
    return deflated; 
} 
int main() 
{ 
    FILE* fptr = fopen("test.in","rb"); 
    fseek (fptr, 0, SEEK_END); 
    int size = ftell(fptr); 
    fseek (fptr, 0, SEEK_SET); 
    char* buffer = (char*)malloc(size); 
    fread(buffer,1,size,fptr); 
    int infsize,defsize; 
    char* buf = myinflate(buffer,size,&infsize); 
    FILE* out = fopen("testinf.hex","wb"); 
    fwrite(buf,1,infsize,out); 
    fclose(out); 
    char* buf2 = mydeflate(buf,infsize,&defsize); 
    out = fopen("testdef.hex","wb"); 
    fwrite(buf2,1,defsize,out); 
    fclose(out); 
    int buf3size; 
    char* buf3 = myinflate(buf2,defsize,&buf3size); 
    out = fopen("testinfdef.hex","wb"); 
    fwrite(buf3,1,buf3size,out); 
} 

http://www.filehosting.org/file/details/364574/eEyzAbMuCp93MmGk/test.in

답변

5

당신은 어떤 반환 코드를 검사 한 아닙니다. 무슨 일이 벌어 질지 어떻게 예상 할 수 있니? 오류를 반환 할 수있는 모든 함수에서 반환 코드를 확인하십시오!

압축 및/또는 압축 해제에 필요한 공간이 충분하지 않을 수 있습니다. inflate()compress()의 리턴 코드는 이것이 사실인지 여부를 나타냅니다.

그런데 malloc()inflated 두 번, 첫 번째 메모리를 덮어 쓰면 방대한 메모리 누수가 발생합니다.

또한 int 포인터를 부호없는 긴 포인터로 blithely 변환합니다. 길이가 다른 경우 문제가 발생합니다.

+0

malloc()은 끔찍한 복사 - 붙여 넣기 오류였습니다. 고맙습니다. 이미 편집 했으므로 고맙습니다. 그러나 긴 포인터는 컴파일러와 OS의 int 포인터와 같으며 지금은이 포인터를 이식 할 계획이 아닙니다. 어쨌든 그것은 마지막 inflate()에서 데이터 에러라고 말하며, 왜 그런 일이 발생하는지에 대해서는 생각하지 못합니다. – chubakueno

+0

이제'malloc()'중 하나를 제거 했으므로'tmpinf'가 존재하지 않습니다. 직접 팽창 시켜서 팽창시킬 수 있습니다. 'tmpdef'도 마찬가지입니다. –

+0

리턴 코드를 인쇄하기 위해 모두 변경했습니다. 그러나 리턴 코드가 무엇인지 표시하기 위해 출력을 변경하지 않았습니다. 'mz_error() '란 무엇입니까? 또한 반환 코드가'Z_DATA_ERROR' 인 경우'strm.msg'도 출력해야합니다. –

관련 문제