Fix extract_archive so it doesnt mangle filenames, dont try and extract "./" and strip leading "./" on other files
This commit is contained in:
parent
778041f8d1
commit
8d3b0497a4
@ -82,8 +82,11 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f
|
|||||||
/* strip leading '/' in filename to extract as prefix may not be dir */
|
/* strip leading '/' in filename to extract as prefix may not be dir */
|
||||||
/* Cant use concat_path_file here as prefix might not be a directory */
|
/* Cant use concat_path_file here as prefix might not be a directory */
|
||||||
char *path = file_entry->name;
|
char *path = file_entry->name;
|
||||||
if (*path == '/') {
|
if (strncmp("./", path, 2) == 0) {
|
||||||
path++;
|
path += 2;
|
||||||
|
if (strlen(path) == 0) {
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
full_name = xmalloc(strlen(prefix) + strlen(path) + 1);
|
full_name = xmalloc(strlen(prefix) + strlen(path) + 1);
|
||||||
strcpy(full_name, prefix);
|
strcpy(full_name, prefix);
|
||||||
@ -91,7 +94,6 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f
|
|||||||
} else {
|
} else {
|
||||||
full_name = file_entry->name;
|
full_name = file_entry->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (function & extract_to_stdout) {
|
if (function & extract_to_stdout) {
|
||||||
if (S_ISREG(file_entry->mode)) {
|
if (S_ISREG(file_entry->mode)) {
|
||||||
copy_file_chunk(src_stream, out_stream, file_entry->size);
|
copy_file_chunk(src_stream, out_stream, file_entry->size);
|
||||||
@ -244,6 +246,7 @@ char *unarchive(FILE *src_stream, FILE *out_stream, file_header_t *(*get_headers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found) {
|
if (found) {
|
||||||
buffer = extract_archive(src_stream, out_stream, file_entry, extract_function, prefix);
|
buffer = extract_archive(src_stream, out_stream, file_entry, extract_function, prefix);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user