@@ -119,8 +119,8 @@ int EnDeTool::encodebinary( const char* src, unsigned srcsize, char* &out )
119
119
}
120
120
121
121
memset ( encptr, 0 , tmpCiperLen );
122
- memcpy ( &encptr[0 ], &srcsize, sizeof ( unsigned int ) );
123
- memcpy ( &encptr[sizeof ( unsigned int ) ], src, srcsize );
122
+ memcpy ( &encptr[0 ], &srcsize, 4 );
123
+ memcpy ( &encptr[4 ], src, srcsize );
124
124
125
125
int encloop = tmpCiperLen / AES_BLOCKLEN;
126
126
if ( encloop == 0 )
@@ -170,19 +170,27 @@ int EnDeTool::decodebinary( const char* src, unsigned srcsize, char* &out )
170
170
unsigned int realsz = 0 ;
171
171
172
172
// checks is it compressed ..
173
- if ( strncmp ( &src[4 ], LZMAT_COMPRESS_HEADER, 4 ) == 0 )
173
+ if ( strncmp ( &src[0 ], LZMAT_COMPRESS_HEADER, 0 ) == 0 )
174
174
{
175
- realsz = *(unsigned int *)src;
176
- decbuff = new char [ srcsize - 4 ];
175
+ memcpy ( &realsz, &src[4 ], 4 );
176
+ if ( realsz == 0 )
177
+ return -1 ;
178
+
179
+ // reallocate buffer for decompress buffer.
180
+ decbuff = NULL ;
181
+ decbuff = new char [ srcsize ];
177
182
178
183
if ( decbuff == NULL )
179
- return -1 ;
184
+ return -1 ;
180
185
181
- memcpy ( decbuff, & src[ 4 ] , srcsize - 4 );
182
- decbuffsz = decompressbuffer ( decbuff, srcsize - 4 );
186
+ memcpy ( decbuff, src, srcsize );
187
+ decbuffsz = decompressbuffer ( decbuff, srcsize );
183
188
184
189
if ( decbuffsz < AES_BLOCKLEN )
185
- return -2 ;
190
+ {
191
+ delete[] decbuff;
192
+ return -2 ;
193
+ }
186
194
187
195
need2free = true ;
188
196
}
@@ -586,24 +594,24 @@ unsigned EnDeTool::decompressbuffer( char* &buff, unsigned blen )
586
594
// Check original size.
587
595
MP_U32* olen = (MP_U32*)&buff[4 ];
588
596
589
- if ( olen > 0 )
597
+ if ( * olen > 0 )
590
598
{
599
+ MP_U32 buffolen = *olen;
591
600
MP_U8* rebuff = (MP_U8*)buff + 8 ;
592
601
MP_U32 rebufflen = blen - 8 ;
593
602
594
- MP_U8* debuff = new MP_U8[ *olen ];
603
+ MP_U8* debuff = new MP_U8[ buffolen ];
595
604
if ( debuff != NULL )
596
605
{
597
- MP_U32 debufflen = *olen;
598
- int retcode = lzmat_decode ( debuff, &debufflen,
606
+ int retcode = lzmat_decode ( debuff, &buffolen,
599
607
rebuff, rebufflen );
600
608
601
609
if ( retcode == LZMAT_STATUS_OK )
602
610
{
603
611
delete[] buff;
604
612
buff = (char *)debuff;
605
613
606
- return *olen ;
614
+ return buffolen ;
607
615
}
608
616
}
609
617
}
0 commit comments