204
204
static int is_rar_archive(int fd)
206
206
mark_header_t mark;
207
const mark_header_t rar_hdr[2] = {{0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}, {'U', 'n', 'i', 'q', 'u', 'E', '!'}};
207
const mark_header_t rar_hdr[2] = {{{0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00}}, {{'U', 'n', 'i', 'q', 'u', 'E', '!'}}};
210
210
if(read(fd, &mark, SIZEOF_MARKHEAD) != SIZEOF_MARKHEAD)
264
264
if(!is_rar_archive(fd))
265
265
return UNRAR_ERR;
267
unpack_data = (unpack_data_t *) malloc(sizeof(unpack_data_t));
269
unrar_dbgmsg("UNRAR: malloc failed for unpack_data\n");
272
unpack_data->rarvm_data.mem = NULL;
273
unpack_data->old_filter_lengths = NULL;
274
unpack_data->PrgStack.array = unpack_data->Filters.array = NULL;
275
unpack_data->PrgStack.num_items = unpack_data->Filters.num_items = 0;
276
unpack_data->unp_crc = 0xffffffff;
278
ppm_constructor(&unpack_data->ppm_data);
279
267
main_hdr = read_header(fd, MAIN_HEAD);
281
ppm_destructor(&unpack_data->ppm_data);
282
rar_init_filters(unpack_data);
283
unpack_free_data(unpack_data);
285
269
return UNRAR_ERR;
287
271
unrar_dbgmsg("UNRAR: Head CRC: %.4x\n", main_hdr->head_crc);
288
272
unrar_dbgmsg("UNRAR: Head Type: %.2x\n", main_hdr->head_type);
289
273
unrar_dbgmsg("UNRAR: Flags: %.4x\n", main_hdr->flags);
290
274
unrar_dbgmsg("UNRAR: Head Size: %.4x\n", main_hdr->head_size);
276
if(main_hdr->flags & MHD_PASSWORD) {
292
281
snprintf(filename,1024,"%s/comments", dirname);
293
282
if(mkdir(filename,0700)) {
294
283
unrar_dbgmsg("UNRAR: Unable to create comment temporary directory\n");
296
ppm_destructor(&unpack_data->ppm_data);
297
rar_init_filters(unpack_data);
298
unpack_free_data(unpack_data);
300
285
return UNRAR_ERR;
302
287
state->comment_dir = strdup(filename);
303
288
if(!state->comment_dir) {
305
ppm_destructor(&unpack_data->ppm_data);
306
rar_init_filters(unpack_data);
307
unpack_free_data(unpack_data);
309
290
return UNRAR_EMEM;
312
293
if(main_hdr->head_size < SIZEOF_NEWMHD) {
314
ppm_destructor(&unpack_data->ppm_data);
315
rar_init_filters(unpack_data);
316
unpack_free_data(unpack_data);
318
295
free(state->comment_dir);
319
296
return UNRAR_ERR;
299
unpack_data = (unpack_data_t *) malloc(sizeof(unpack_data_t));
302
free(state->comment_dir);
303
unrar_dbgmsg("UNRAR: malloc failed for unpack_data\n");
306
unpack_data->rarvm_data.mem = NULL;
307
unpack_data->old_filter_lengths = NULL;
308
unpack_data->PrgStack.array = unpack_data->Filters.array = NULL;
309
unpack_data->PrgStack.num_items = unpack_data->Filters.num_items = 0;
310
unpack_data->unp_crc = 0xffffffff;
312
ppm_constructor(&unpack_data->ppm_data);
322
314
if(main_hdr->flags & MHD_COMMENT) {
323
315
unrar_comment_header_t *comment_header;
324
316
unrar_dbgmsg("UNRAR: RAR main comment\n");
542
533
free(state->unpack_data);
543
534
free(state->comment_dir);
539
* A copy is needed here to avoid a cyclic dependancy libclamunrar_iface<->libclamav
540
* e.g. see the comment in bug 775 about dropping the old internal snprintf
541
* which didn't have this problem and bug 785
545
snprintf(char *str, size_t size, const char *format, ...)
550
va_start(args, format);
551
ret = _vsnprintf_s(str, size, _TRUNCATE, format, args);