time_t mtime;
long mnsec;
mode_t mode;
+ char *filename;
+ size_t filename_allocated;
/* File header optional entries */
char salt[8];
rar = (struct rar *)(a->format->data);
free_codes(a);
+ free(rar->filename);
free(rar->unp_buffer);
free(rar->lzss.window);
__archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
"Invalid filename size");
return (ARCHIVE_FATAL);
}
- if ((filename = malloc(filename_size+2)) == NULL) {
- archive_set_error(&a->archive, ENOMEM,
- "Couldn't allocate memory.");
- return (ARCHIVE_FATAL);
+ if (rar->filename_allocated < filename_size+2) {
+ rar->filename = realloc(rar->filename, filename_size+2);
+ if (rar->filename == NULL) {
+ archive_set_error(&a->archive, ENOMEM,
+ "Couldn't allocate memory.");
+ return (ARCHIVE_FATAL);
+ }
}
+ filename = rar->filename;
memcpy(filename, p, filename_size);
filename[filename_size] = '\0';
if (rar->file_flags & FHD_UNICODE)
}
}
if (filename_size >= end) {
- free(filename);
archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
"Invalid filename");
return (ARCHIVE_FAILED);
sconv = archive_string_conversion_from_charset(&a->archive, "UTF-16BE", 1);
if (sconv == NULL)
- {
- free(filename);
return (ARCHIVE_FATAL);
- }
strp = filename;
while (memcmp(strp, "\x00\x00", 2))
{
default:
archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
"Unknown file attributes from RAR file's host OS");
- free(filename);
return (ARCHIVE_FATAL);
}
archive_string_conversion_charset_name(sconv));
ret = (ARCHIVE_WARN);
}
- free(filename);
if (((rar->mode) & AE_IFMT) == AE_IFLNK)
{
rar->lengthtable[i++] = 0;
}
}
+ free(precode.tree);
+ free(precode.table);
r = create_code(a, &rar->maincode, &rar->lengthtable[0], MAINCODE_SIZE,
MAX_SYMBOL_LENGTH);