diff --git a/CMakeLists.txt b/CMakeLists.txt index ffccc07..b243964 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,7 +98,6 @@ add_executable(VitaShell elf.c sha1.c minizip/zip.c - minizip/unzip.c minizip/ioapi.c bm.c audio/vita_audio.c diff --git a/archive.c b/archive.c index 1b9b521..ee347e1 100644 --- a/archive.c +++ b/archive.c @@ -32,11 +32,88 @@ char *uncompressBuffer(const Elf32_Ehdr *ehdr, const Elf32_Phdr *phdr, const seg const char *buffer); int archiveCheckFilesForUnsafeFself() { - // TODO + FileListEntry *archive_entry = archive_list.head; + + int i; + for (i = 0; i < archive_list.length; i++) { + char path[MAX_PATH_LENGTH]; + snprintf(path, MAX_PATH_LENGTH - 1, "%s/%s", archive_file, archive_entry->name); + + // Open + SceUID fd = archiveFileOpen(path, SCE_O_RDONLY, 0); + if (fd >= 0) { + uint32_t magic = 0; + archiveFileRead(fd, &magic, sizeof(uint32_t)); + + // SCE magic + if (magic == 0x00454353) { + char sce_header[0x84]; + archiveFileRead(fd, sce_header, sizeof(sce_header)); + + uint64_t elf1_offset = *(uint64_t *)(sce_header + 0x3C); + uint64_t phdr_offset = *(uint64_t *)(sce_header + 0x44); + uint64_t section_info_offset = *(uint64_t *)(sce_header + 0x54); + + // jump to elf1 + // Until here we have read 0x88 bytes + int i; + for (i = 0; i < elf1_offset - 0x88; i += sizeof(uint32_t)) { + uint32_t dummy = 0; + archiveFileRead(fd, &dummy, sizeof(uint32_t)); + } + + // Check imports + char *buffer = malloc(archive_entry->size); + if (buffer) { + archiveFileRead(fd, buffer, archive_entry->size); + + Elf32_Ehdr *elf1 = (Elf32_Ehdr*)buffer; + Elf32_Phdr *phdr = (Elf32_Phdr*)(buffer + phdr_offset - elf1_offset); + segment_info *info = (segment_info*)(buffer + section_info_offset - elf1_offset); + + // segment is elf2 section + char *segment = buffer + info->offset - elf1_offset; + + // zlib compress magic + char *uncompressed_buffer = NULL; + if (segment[0] == 0x78) { + // uncompressedBuffer will return elf2 section + uncompressed_buffer = uncompressBuffer(elf1, phdr, info, segment); + if (uncompressed_buffer) { + segment = uncompressed_buffer; + } + } + + int unsafe = checkForUnsafeImports(segment); + + if (uncompressed_buffer) + free(uncompressed_buffer); + free(buffer); + + if (unsafe) { + archiveFileClose(fd); + return unsafe; + } + } + + // Check authid flag + uint64_t authid = *(uint64_t *)(sce_header + 0x7C); + if (authid != 0x2F00000000000002) { + archiveFileClose(fd); + return 1; // Unsafe + } + } + + archiveFileClose(fd); + } + + // Next + archive_entry = archive_entry->next; + } + return 0; // Safe } -// TODO: improve traversal int fileListGetArchiveEntries(FileList *list, const char *path, int sort) { int res; @@ -74,12 +151,13 @@ int fileListGetArchiveEntries(FileList *list, const char *path, int sort) { strcpy(entry->name, archive_entry->name + name_length); - entry->is_folder = archive_entry->is_folder; - if (entry->is_folder) { + if (p || archive_entry->is_folder) { addEndSlash(entry->name); + entry->is_folder = 1; entry->type = FILE_TYPE_UNKNOWN; list->folders++; } else { + entry->is_folder = 0; entry->type = getFileType(entry->name); list->files++; } @@ -295,7 +373,6 @@ int archiveFileGetstat(const char *file, SceIoStat *stat) { return -1; } -// TODO: use cache int archiveFileOpen(const char *file, int flags, SceMode mode) { int res; @@ -307,6 +384,7 @@ int archiveFileOpen(const char *file, int flags, SceMode mode) { // Initialize archive_fd = archive_read_new(); + archive_read_support_filter_gzip(archive_fd); archive_read_support_format_all(archive_fd); // Open archive file @@ -383,6 +461,7 @@ int archiveOpen(const char *file) { // Initialize struct archive *archive = archive_read_new(); + archive_read_support_filter_gzip(archive); archive_read_support_format_all(archive); // Open archive file @@ -401,7 +480,7 @@ int archiveOpen(const char *file) { archive_read_free(archive); return -1; } - + const char *name = archive_entry_pathname(archive_entry); const struct stat *stat = archive_entry_stat(archive_entry); diff --git a/archiveRAR.c b/archiveRAR.c deleted file mode 100644 index 3a05fe7..0000000 --- a/archiveRAR.c +++ /dev/null @@ -1,219 +0,0 @@ -#include "archiveRAR.h" -#include "main.h" - -static ArchiveFileNode* root = NULL; -static int32_t filePathLength = -1; - - -int archiveRAROpen(const char *file) { - root = openRARFile(file); - if (!root) { - return -1; - } - filePathLength = strlen(file); - return 1; -} - -int fileListGetRARArchiveEntries(FileList *list, const char *path, int sort) { - if (!root) - return -1; - - FileListEntry *entry = malloc(sizeof(FileListEntry)); - strcpy(entry->name, DIR_UP); - entry->name_length = strlen(DIR_UP); - entry->is_folder = 1; - entry->type = FILE_TYPE_UNKNOWN; - fileListAddEntry(list, entry, sort); - - ArchiveFileNode* node = NULL; - if (strlen(path) == (filePathLength + sizeof(char))) - node = root; - else - node = getFloderNodeFromPath(root,path + filePathLength + sizeof(char)); - - uint32_t i = 0; - for (; i < node->childCount; i++) { - ArchiveFileNode* _t = (ArchiveFileNode*)(node->childPt[i]); - FileListEntry * childentry = malloc(sizeof(FileListEntry)); - - strcpy(childentry->name,_t->nodeName); - childentry->name_length = strlen(childentry->name); - childentry->size = _t->data.UnpSize; - childentry->size2 = _t->data.PackSize; - - sceRtcSetDosTime(&childentry->atime,_t->data.FileTime); - sceRtcSetDosTime(&childentry->ctime,_t->data.FileTime); - sceRtcSetDosTime(&childentry->mtime,_t->data.FileTime); - - if (_t->data.Flags == 0x20) { - addEndSlash(childentry->name); - childentry->is_folder = 1; - list->folders++; - } else { - childentry->type = getFileType(childentry->name); - childentry->is_folder = 0; - list->files++; - } - fileListAddEntry(list, childentry, sort); - } - return 1; -} - -int ReadArchiveRARFile(const char *file, void *buf, int size) { - if (filePathLength < 0) - return -1; - - char filepath[filePathLength + sizeof(char)]; - strncpy(filepath,file,filePathLength); - filepath[filePathLength] = '\0'; - struct ExtractHeader header = {memPtr:buf,offset:0,bufferSize:size,file:0,param:NULL}; - if (extractRAR(filepath,file + (filePathLength + sizeof(char)),&header) > 0) - return header.offset; - else - return -1; -} - -int archiveRARFileGetstat(const char *file, SceIoStat *stat) { - if (!root) - return -1; - - const char* p = file + (filePathLength + sizeof(char)); - uint32_t p_length = strlen(p); - - if (p[p_length-1] == '/') - return -1; - - ArchiveFileNode* filenode = getFileNodeFromFilePath(root,p); - if (!filenode) - return -1; - - if (stat) { - stat->st_size = filenode->data.UnpSize; - sceRtcSetDosTime(&stat->st_atime,filenode->data.FileTime); - sceRtcSetDosTime(&stat->st_ctime,filenode->data.FileTime); - sceRtcSetDosTime(&stat->st_mtime,filenode->data.FileTime); - } - - return 1; -} - -int getRARArchivePathInfo(const char *path, uint64_t *size, uint32_t *folders, uint32_t *files) { - if (!root) - return -1; - - SceIoStat stat; - memset(&stat, 0, sizeof(SceIoStat)); - if (archiveRARFileGetstat(path, &stat) < 0) { - FileList list; - memset(&list, 0, sizeof(FileList)); - fileListGetRARArchiveEntries(&list, path, SORT_NONE); - - FileListEntry *entry = list.head->next; // Ignore .. - - int i; - for (i = 0; i < list.length-1; i++) { - char *new_path = malloc(strlen(path) + strlen(entry->name) + 2); - snprintf(new_path, MAX_PATH_LENGTH, "%s%s", path, entry->name); - - getRARArchivePathInfo(new_path, size, folders, files); - - free(new_path); - - entry = entry->next; - } - - if (folders) - (*folders)++; - - fileListEmpty(&list); - } else { - if (size) - (*size) += stat.st_size; - - if (files) - (*files)++; - } - - return 0; -} - -int extractRARArchivePath(const char *src, const char *dst, FileProcessParam *param) { - if (!root) - return -1; - - SceIoStat stat; - memset(&stat, 0, sizeof(SceIoStat)); - if (archiveRARFileGetstat(src, &stat) < 0) { - FileList list; - memset(&list, 0, sizeof(FileList)); - fileListGetRARArchiveEntries(&list, src, SORT_NONE); - - int ret = sceIoMkdir(dst, 0777); - if (ret < 0 && ret != SCE_ERROR_ERRNO_EEXIST) { - fileListEmpty(&list); - return ret; - } - - if (param) { - if (param->value) - (*param->value) += DIRECTORY_SIZE; - - if (param->SetProgress) - param->SetProgress(param->value ? *param->value : 0, param->max); - - if (param->cancelHandler && param->cancelHandler()) { - fileListEmpty(&list); - return 0; - } - } - - FileListEntry *entry = list.head->next; // Ignore .. - - int i; - for (i = 0; i < list.length-1; i++) { - char *src_path = malloc(strlen(src) + strlen(entry->name) + 2); - snprintf(src_path, MAX_PATH_LENGTH, "%s%s", src, entry->name); - - char *dst_path = malloc(strlen(dst) + strlen(entry->name) + 2); - snprintf(dst_path, MAX_PATH_LENGTH, "%s%s", dst, entry->name); - - int ret = extractRARArchivePath(src_path, dst_path, param); - - free(dst_path); - free(src_path); - - if (ret <= 0) { - fileListEmpty(&list); - return ret; - } - - entry = entry->next; - } - - fileListEmpty(&list); - } else { - char filepath[filePathLength + sizeof(char)]; - strncpy(filepath,src,filePathLength); - filepath[filePathLength] = '\0'; - - SceUID fddst = sceIoOpen(dst, SCE_O_WRONLY | SCE_O_CREAT | SCE_O_TRUNC, 0777); - - struct ExtractHeader header = {file:fddst,offset:0,memPtr:NULL,bufferSize:0,param:param}; - - int result = extractRAR(filepath, (const char *)(src + (filePathLength + sizeof(char))), &header); - sceIoClose(fddst); - - return result; - } - - return 1; -} - -int archiveRARClose() { - filePathLength = -1; - if (!root) { - closeRARFile(root); - root = NULL; - } - return 1; -} \ No newline at end of file diff --git a/archiveRAR.h b/archiveRAR.h deleted file mode 100644 index 099d7e1..0000000 --- a/archiveRAR.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef ARCHIVERAR_H_INC -#define ARCHIVERAR_H_INC - -#include -#include -#include - -#include "file.h" -#include "unrarlib/unrarlibutils.h" -#include "utils.h" - - -int fileListGetRARArchiveEntries(FileList *list, const char *path, int sort); - -int getRARArchivePathInfo(const char *path, uint64_t *size, uint32_t *folders, uint32_t *files); -int extractRARArchivePath(const char *src, const char *dst, FileProcessParam *param); - -int archiveRARFileGetstat(const char *file, SceIoStat *stat); -int archiveRARFileOpen(const char *file, int flags, SceMode mode); -int archiveRARFileRead(SceUID fd, void *data, SceSize size); -int archiveRARFileClose(SceUID fd); - -int ReadArchiveRARFile(const char *file, void *buf, int size); - -int archiveRARClose(); -int archiveRAROpen(const char *file); - -#endif // ARCHIVERAR_H_INC diff --git a/audioplayer.c b/audioplayer.c index 6abed02..9b170a6 100644 --- a/audioplayer.c +++ b/audioplayer.c @@ -137,13 +137,13 @@ vita2d_texture *getAlternativeCoverImage(const char *file) { if (p) { *p = '\0'; - snprintf(path, MAX_PATH_LENGTH, "%s/cover.jpg", file); + snprintf(path, MAX_PATH_LENGTH - 1, "%s/cover.jpg", file); if (checkFileExist(path)) { *p = '/'; return vita2d_load_JPEG_file(path); } - snprintf(path, MAX_PATH_LENGTH, "%s/folder.jpg", file); + snprintf(path, MAX_PATH_LENGTH - 1, "%s/folder.jpg", file); if (checkFileExist(path)) { *p = '/'; return vita2d_load_JPEG_file(path); @@ -327,7 +327,7 @@ int audioPlayer(const char *file, int type, FileList *list, FileListEntry *entry if (!entry->is_folder) { char path[MAX_PATH_LENGTH]; - snprintf(path, MAX_PATH_LENGTH, "%s%s", list->path, entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", list->path, entry->name); int type = getFileType(path); if (type == FILE_TYPE_MP3 || type == FILE_TYPE_OGG) { file = path; diff --git a/file.c b/file.c index 6cd848e..cf0a7c8 100644 --- a/file.c +++ b/file.c @@ -594,21 +594,24 @@ typedef struct { static ExtensionType extension_types[] = { { ".PSP2DMP", FILE_TYPE_PSP2DMP }, - { ".TMP", FILE_TYPE_PSP2DMP }, - { ".BMP", FILE_TYPE_BMP }, - { ".INI", FILE_TYPE_INI }, - { ".JPG", FILE_TYPE_JPEG }, - { ".JPEG", FILE_TYPE_JPEG }, - { ".MP3", FILE_TYPE_MP3 }, - { ".MP4", FILE_TYPE_MP4 }, - { ".OGG", FILE_TYPE_OGG }, - { ".PNG", FILE_TYPE_PNG }, - { ".RAR", FILE_TYPE_RAR }, - { ".SFO", FILE_TYPE_SFO }, - { ".TXT", FILE_TYPE_TXT }, - { ".VPK", FILE_TYPE_VPK }, - { ".XML", FILE_TYPE_XML }, - { ".ZIP", FILE_TYPE_ZIP }, + { ".TMP", FILE_TYPE_PSP2DMP }, + { ".7Z", FILE_TYPE_7Z }, + { ".BMP", FILE_TYPE_BMP }, + { ".GZ", FILE_TYPE_GZ }, + { ".INI", FILE_TYPE_INI }, + { ".ISO", FILE_TYPE_ISO }, + { ".JPG", FILE_TYPE_JPEG }, + { ".JPEG", FILE_TYPE_JPEG }, + { ".MP3", FILE_TYPE_MP3 }, + { ".MP4", FILE_TYPE_MP4 }, + { ".OGG", FILE_TYPE_OGG }, + { ".PNG", FILE_TYPE_PNG }, + { ".RAR", FILE_TYPE_RAR }, + { ".SFO", FILE_TYPE_SFO }, + { ".TXT", FILE_TYPE_TXT }, + { ".VPK", FILE_TYPE_VPK }, + { ".XML", FILE_TYPE_XML }, + { ".ZIP", FILE_TYPE_ZIP }, }; int getFileType(const char *file) { @@ -625,6 +628,20 @@ int getFileType(const char *file) { return FILE_TYPE_UNKNOWN; } +int isArchiveType(int type) { + switch (type) { + case FILE_TYPE_7Z: + case FILE_TYPE_GZ: + case FILE_TYPE_ISO: + case FILE_TYPE_RAR: + case FILE_TYPE_ZIP: + return 1; + + default: + return 0; + } +} + int getNumberOfDevices() { return N_DEVICES; } diff --git a/file.h b/file.h index 049b76a..e7f3e0c 100644 --- a/file.h +++ b/file.h @@ -37,8 +37,11 @@ enum FileTypes { FILE_TYPE_UNKNOWN, FILE_TYPE_PSP2DMP, + FILE_TYPE_7Z, FILE_TYPE_BMP, + FILE_TYPE_GZ, FILE_TYPE_INI, + FILE_TYPE_ISO, FILE_TYPE_JPEG, FILE_TYPE_MP3, FILE_TYPE_MP4, @@ -61,7 +64,7 @@ enum FileSortFlags { enum FileMoveFlags { MOVE_INTEGRATE = 0x1, // Integrate directories - MOVE_REPLACE = 0x2, // Replace files + MOVE_REPLACE = 0x2, // Replace files }; typedef struct { @@ -111,6 +114,7 @@ int copyPath(const char *src_path, const char *dst_path, FileProcessParam *param int movePath(const char *src_path, const char *dst_path, int flags, FileProcessParam *param); int getFileType(const char *file); +int isArchiveType(int type); int getNumberOfDevices(); char **getDevices(); diff --git a/io_process.c b/io_process.c index ab6f7fb..194b9f9 100644 --- a/io_process.c +++ b/io_process.c @@ -117,7 +117,7 @@ int delete_thread(SceSize args_size, DeleteArguments *args) { int i; for (i = 0; i < count; i++) { - snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name); getPathInfo(path, NULL, &folders, &files, NULL); mark_entry = mark_entry->next; } @@ -131,7 +131,7 @@ int delete_thread(SceSize args_size, DeleteArguments *args) { mark_entry = head; for (i = 0; i < count; i++) { - snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name); FileProcessParam param; param.value = &value; @@ -531,7 +531,7 @@ int export_thread(SceSize args_size, ExportArguments *args) { int i; for (i = 0; i < count; i++) { - snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name); getPathInfo(path, &size, NULL, &files, mediaPathHandler); mark_entry = mark_entry->next; } @@ -557,7 +557,7 @@ int export_thread(SceSize args_size, ExportArguments *args) { mark_entry = head; for (i = 0; i < count; i++) { - snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name); FileProcessParam param; param.value = &value; diff --git a/language.c b/language.c index 250f8f2..0123b79 100644 --- a/language.c +++ b/language.c @@ -260,7 +260,7 @@ void loadLanguage(int id) { if (use_custom_config) { if (id >= 0 && id < (sizeof(lang) / sizeof(char *))) { char path[MAX_PATH_LENGTH]; - snprintf(path, MAX_PATH_LENGTH, "ux0:VitaShell/language/%s.txt", lang[id]); + snprintf(path, MAX_PATH_LENGTH - 1, "ux0:VitaShell/language/%s.txt", lang[id]); readConfig(path, language_entries, sizeof(language_entries) / sizeof(ConfigEntry)); } } diff --git a/main.c b/main.c index 14a9f99..4afbebc 100644 --- a/main.c +++ b/main.c @@ -74,7 +74,6 @@ int file_type = FILE_TYPE_UNKNOWN; // Archive static int is_in_archive = 0; static char dir_level_archive = -1; -enum FileTypes archive_type = FILE_TYPE_ZIP; // FTP static char vita_ip[16]; @@ -119,10 +118,6 @@ void dirLevelUp() { rel_pos = 0; } -enum FileTypes getArchiveType(){ - return archive_type; -} - int isInArchive() { return is_in_archive; } @@ -233,7 +228,7 @@ static void refreshMarkList() { FileListEntry *next = entry->next; char path[MAX_PATH_LENGTH]; - snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, entry->name); // Check if the entry still exits. If not, remove it from list SceIoStat stat; @@ -257,7 +252,7 @@ static void refreshCopyList() { FileListEntry *next = entry->next; char path[MAX_PATH_LENGTH]; - snprintf(path, MAX_PATH_LENGTH, "%s%s", copy_list.path, entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", copy_list.path, entry->name); // Check if the entry still exits. If not, remove it from list SceIoStat stat; @@ -278,6 +273,9 @@ static int handleFile(const char *file, FileListEntry *entry) { switch (type) { case FILE_TYPE_PSP2DMP: + case FILE_TYPE_7Z: + case FILE_TYPE_GZ: + case FILE_TYPE_ISO: case FILE_TYPE_MP3: case FILE_TYPE_OGG: case FILE_TYPE_RAR: @@ -312,10 +310,6 @@ static int handleFile(const char *file, FileListEntry *entry) { res = audioPlayer(file, type, &file_list, entry, &base_pos, &rel_pos); break; - case FILE_TYPE_RAR: - res = archiveOpen(file); - break; - case FILE_TYPE_SFO: res = SFOReader(file); break; @@ -325,6 +319,10 @@ static int handleFile(const char *file, FileListEntry *entry) { setDialogStep(DIALOG_STEP_INSTALL_QUESTION); break; + case FILE_TYPE_7Z: + case FILE_TYPE_GZ: + case FILE_TYPE_ISO: + case FILE_TYPE_RAR: case FILE_TYPE_ZIP: res = archiveOpen(file); break; @@ -884,7 +882,7 @@ static int dialogSteps() { setDialogStep(DIALOG_STEP_NONE); } else { char path[MAX_PATH_LENGTH]; - snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, name); int res = sceIoMkdir(path, 0777); if (res < 0) { @@ -1392,9 +1390,8 @@ static int fileBrowserMenuCtrl() { int type = handleFile(cur_file, file_entry); // Archive mode - if (type == FILE_TYPE_ZIP || type == FILE_TYPE_RAR) { + if (isArchiveType(type)) { is_in_archive = 1; - archive_type = type; dir_level_archive = dir_level; snprintf(archive_path, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name); @@ -1545,6 +1542,9 @@ static int shellMain() { icon = image_icon; break; + case FILE_TYPE_7Z: + case FILE_TYPE_GZ: + case FILE_TYPE_ISO: case FILE_TYPE_RAR: case FILE_TYPE_VPK: case FILE_TYPE_ZIP: diff --git a/main_context.c b/main_context.c index bc51995..ed79f3d 100644 --- a/main_context.c +++ b/main_context.c @@ -436,7 +436,7 @@ void setContextMenuMoreVisibilities() { menu_more_entries[MENU_MORE_ENTRY_OPEN_DECRYPTED].visibility = CTX_INVISIBLE; } else { char path[MAX_PATH_LENGTH]; - snprintf(path, MAX_PATH_LENGTH, "%s%ssce_pfs", file_list.path, file_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%ssce_pfs", file_list.path, file_entry->name); if (!checkFolderExist(path)) menu_more_entries[MENU_MORE_ENTRY_OPEN_DECRYPTED].visibility = CTX_INVISIBLE; @@ -713,9 +713,9 @@ static int contextMenuMainEnterCallback(int sel, void *context) { int count = 1; while (1) { if (count == 1) { - snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, language_container[NEW_FOLDER]); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, language_container[NEW_FOLDER]); } else { - snprintf(path, MAX_PATH_LENGTH, "%s%s (%d)", file_list.path, language_container[NEW_FOLDER], count); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s (%d)", file_list.path, language_container[NEW_FOLDER], count); } if (!checkFolderExist(path)) @@ -824,7 +824,7 @@ static int contextMenuMoreEnterCallback(int sel, void *context) { int i; for (i = 0; i < file_list.length - 1; i++) { char path[MAX_PATH_LENGTH]; - snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, file_entry->name); int type = getFileType(path); if (type == FILE_TYPE_VPK) { @@ -894,14 +894,14 @@ static int contextMenuMoreEnterCallback(int sel, void *context) { gameDataUmount(); - snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", file_list.path, file_entry->name); res = gameDataMount(path); // In case we're at ux0:patch or grw0:patch we need to apply the mounting at ux0:app or gro0:app - snprintf(path, MAX_PATH_LENGTH, "ux0:app/%s", file_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "ux0:app/%s", file_entry->name); if (res < 0) res = gameDataMount(path); - snprintf(path, MAX_PATH_LENGTH, "gro:app/%s", file_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "gro:app/%s", file_entry->name); if (res < 0) res = gameDataMount(path); diff --git a/makezip.c b/makezip.c index e533fa4..a5686f7 100644 --- a/makezip.c +++ b/makezip.c @@ -275,7 +275,7 @@ int compress_thread(SceSize args_size, CompressArguments *args) { int i; for (i = 0; i < count; i++) { - snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name); getPathInfo(path, &size, &folders, &files, NULL); mark_entry = mark_entry->next; } @@ -294,7 +294,7 @@ int compress_thread(SceSize args_size, CompressArguments *args) { mark_entry = head; for (i = 0; i < count; i++) { - snprintf(path, MAX_PATH_LENGTH, "%s%s", args->file_list->path, mark_entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", args->file_list->path, mark_entry->name); FileProcessParam param; param.value = &value; diff --git a/minizip/unzip.c b/minizip/unzip.c deleted file mode 100644 index 11fd7ba..0000000 --- a/minizip/unzip.c +++ /dev/null @@ -1,1952 +0,0 @@ -/* unzip.c -- IO for uncompress .zip files using zlib - Version 1.1, February 14h, 2010 - part of the MiniZip project - - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - Modifications of Unzip for Zip64 - Copyright (C) 2007-2008 Even Rouault - Modifications for Zip64 support on both zip and unzip - Copyright (C) 2009-2010 Mathias Svensson - http://result42.com - Modifications for AES, PKWARE disk spanning - Copyright (C) 2010-2014 Nathan Moinvaziri - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. - - Mar 8th, 2016 - Lucio Cosmo - Fixed support for 64bit builds for archives with "PKWARE" password. - Changed long, unsigned long, unsigned to unsigned int in - access functions to crctables and pkeys -*/ - -#include -#include -#include - -/*#ifndef NOUNCRYPT -# define NOUNCRYPT -#endif*/ - -#include "zlib.h" -#include "unzip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - -#ifdef HAVE_AES -# define AES_METHOD (99) -# define AES_PWVERIFYSIZE (2) -# define AES_MAXSALTLENGTH (16) -# define AES_AUTHCODESIZE (10) -# define AES_HEADERSIZE (11) -# define AES_KEYSIZE(mode) (64 + (mode * 64)) - -# include "aes/aes.h" -# include "aes/fileenc.h" -#endif -#ifndef NOUNCRYPT -# include "crypt.h" -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -#define DISKHEADERMAGIC (0x08074b50) -#define LOCALHEADERMAGIC (0x04034b50) -#define CENTRALHEADERMAGIC (0x02014b50) -#define ENDHEADERMAGIC (0x06054b50) -#define ZIP64ENDHEADERMAGIC (0x06064b50) -#define ZIP64ENDLOCHEADERMAGIC (0x07064b50) - -#define SIZECENTRALDIRITEM (0x2e) -#define SIZECENTRALHEADERLOCATOR (0x14) /* 20 */ -#define SIZEZIPLOCALHEADER (0x1e) - -#ifndef BUFREADCOMMENT -# define BUFREADCOMMENT (0x400) -#endif - -#ifndef UNZ_BUFSIZE -# define UNZ_BUFSIZE (64 * 1024) -#endif -#ifndef UNZ_MAXFILENAMEINZIP -# define UNZ_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -const char unz_copyright[] = - " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - -/* unz_file_info_interntal contain internal info about a file in zipfile*/ -typedef struct unz_file_info64_internal_s -{ - ZPOS64_T offset_curfile; /* relative offset of local header 8 bytes */ - ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx) */ -#ifdef HAVE_AES - uLong aes_encryption_mode; - uLong aes_compression_method; - uLong aes_version; -#endif -} unz_file_info64_internal; - -/* file_in_zip_read_info_s contain internal information about a file in zipfile */ -typedef struct -{ - Bytef *read_buffer; /* internal buffer for compressed data */ - z_stream stream; /* zLib stream structure for inflate */ - -#ifdef HAVE_BZIP2 - bz_stream bstream; /* bzLib stream structure for bziped */ -#endif -#ifdef HAVE_AES - fcrypt_ctx aes_ctx; -#endif - - ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek */ - uLong stream_initialised; /* flag set if stream structure is initialised */ - - ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ - uInt size_local_extrafield; /* size of the local extra field */ - ZPOS64_T pos_local_extrafield; /* position in the local extra field in read */ - ZPOS64_T total_out_64; - - uLong crc32; /* crc32 of all data uncompressed */ - uLong crc32_wait; /* crc32 we must obtain after decompress all */ - ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ - ZPOS64_T rest_read_uncompressed; /* number of byte to be obtained after decomp */ - - zlib_filefunc64_32_def z_filefunc; - - voidpf filestream; /* io structore of the zipfile */ - uLong compression_method; /* compression method (0==store) */ - ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx) */ - int raw; -} file_in_zip64_read_info_s; - -/* unz64_s contain internal information about the zipfile */ -typedef struct -{ - zlib_filefunc64_32_def z_filefunc; - voidpf filestream; /* io structure of the current zipfile */ - voidpf filestream_with_CD; /* io structure of the disk with the central directory */ - unz_global_info64 gi; /* public global information */ - ZPOS64_T byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/ - ZPOS64_T num_file; /* number of the current file in the zipfile*/ - ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ - ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ - ZPOS64_T central_pos; /* position of the beginning of the central dir*/ - uLong number_disk; /* number of the current disk, used for spanning ZIP*/ - ZPOS64_T size_central_dir; /* size of the central directory */ - ZPOS64_T offset_central_dir; /* offset of start of central directory with - respect to the starting disk number */ - - unz_file_info64 cur_file_info; /* public info about the current file in zip*/ - unz_file_info64_internal cur_file_info_internal; - /* private info about it*/ - file_in_zip64_read_info_s* pfile_in_zip_read; - /* structure about the current file if we are decompressing it */ - int isZip64; /* is the current file zip64 */ -#ifndef NOUNCRYPT - unsigned int keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned int* pcrc_32_tab; -#endif -} unz64_s; - -/* Translate date/time from Dos format to tm_unz (readable more easily) */ -local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) -{ - ZPOS64_T uDate = (ZPOS64_T)(ulDosDate>>16); - - ptm->tm_mday = (uInt)(uDate&0x1f); - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1); - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980); - ptm->tm_hour = (uInt)((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt)((ulDosDate&0x7E0)/0x20); - ptm->tm_sec = (uInt)(2*(ulDosDate&0x1f)); - -#define unz64local_in_range(min, max, value) ((min) <= (value) && (value) <= (max)) - if (!unz64local_in_range(0, 11, ptm->tm_mon) || - !unz64local_in_range(1, 31, ptm->tm_mday) || - !unz64local_in_range(0, 23, ptm->tm_hour) || - !unz64local_in_range(0, 59, ptm->tm_min) || - !unz64local_in_range(0, 59, ptm->tm_sec)) - /* Invalid date stored, so don't return it. */ - memset(ptm, 0, sizeof(tm_unz)); -#undef unz64local_in_range -} - -/* Read a byte from a gz_stream; Return EOF for end of file. */ -local int unz64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); -local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) -{ - unsigned char c; - int err = (int)ZREAD64(*pzlib_filefunc_def, filestream, &c, 1); - if (err == 1) - { - *pi = (int)c; - return UNZ_OK; - } - *pi = 0; - if (ZERROR64(*pzlib_filefunc_def, filestream)) - return UNZ_ERRNO; - return UNZ_EOF; -} - -local int unz64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); -local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) -{ - uLong x; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x = (uLong)i; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((uLong)i)<<8; - - if (err == UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unz64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); -local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) -{ - uLong x; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x = (uLong)i; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((uLong)i)<<8; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((uLong)i)<<16; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x += ((uLong)i)<<24; - - if (err == UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unz64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); -local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) -{ - ZPOS64_T x; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x = (ZPOS64_T)i; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<8; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<16; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<24; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<32; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<40; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<48; - if (err == UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def, filestream, &i); - x |= ((ZPOS64_T)i)<<56; - - if (err == UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -/* Locate the Central directory of a zip file (at the end, just before the global comment) */ -local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); -local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ - unsigned char* buf; - ZPOS64_T file_size; - ZPOS64_T back_read = 4; - ZPOS64_T max_back = 0xffff; /* maximum size of global comment */ - ZPOS64_T pos_found = 0; - uLong read_size; - ZPOS64_T read_pos; - int i; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT + 4); - if (buf == NULL) - return 0; - - if (ZSEEK64(*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0) - { - TRYFREE(buf); - return 0; - } - - file_size = ZTELL64(*pzlib_filefunc_def, filestream); - - if (max_back > file_size) - max_back = file_size; - - while (back_read < max_back) - { - if (back_read + BUFREADCOMMENT > max_back) - back_read = max_back; - else - back_read += BUFREADCOMMENT; - - read_pos = file_size - back_read; - read_size = ((BUFREADCOMMENT + 4) < (file_size - read_pos)) ? - (BUFREADCOMMENT + 4) : (uLong)(file_size - read_pos); - - if (ZSEEK64(*pzlib_filefunc_def, filestream, read_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - break; - if (ZREAD64(*pzlib_filefunc_def, filestream, buf, read_size) != read_size) - break; - - for (i = (int)read_size-3; (i--) > 0;) - if (((*(buf+i)) == (ENDHEADERMAGIC & 0xff)) && - ((*(buf+i+1)) == (ENDHEADERMAGIC >> 8 & 0xff)) && - ((*(buf+i+2)) == (ENDHEADERMAGIC >> 16 & 0xff)) && - ((*(buf+i+3)) == (ENDHEADERMAGIC >> 24 & 0xff))) - { - pos_found = read_pos+i; - break; - } - - if (pos_found != 0) - break; - } - TRYFREE(buf); - return pos_found; -} - -/* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T unz64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - const ZPOS64_T endcentraloffset)); -local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - const ZPOS64_T endcentraloffset) -{ - ZPOS64_T offset; - uLong uL; - - /* Zip64 end of central directory locator */ - if (ZSEEK64(*pzlib_filefunc_def, filestream, endcentraloffset - SIZECENTRALHEADERLOCATOR, ZLIB_FILEFUNC_SEEK_SET) != 0) - return 0; - - /* read locator signature */ - if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK) - return 0; - if (uL != ZIP64ENDLOCHEADERMAGIC) - return 0; - /* number of the disk with the start of the zip64 end of central directory */ - if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK) - return 0; - /* relative offset of the zip64 end of central directory record */ - if (unz64local_getLong64(pzlib_filefunc_def, filestream, &offset) != UNZ_OK) - return 0; - /* total number of disks */ - if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK) - return 0; - /* Goto end of central directory record */ - if (ZSEEK64(*pzlib_filefunc_def, filestream, offset, ZLIB_FILEFUNC_SEEK_SET) != 0) - return 0; - /* the signature */ - if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK) - return 0; - if (uL != ZIP64ENDHEADERMAGIC) - return 0; - - return offset; -} - -local unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) -{ - unz64_s us; - unz64_s *s; - ZPOS64_T central_pos; - ZPOS64_T central_pos64; - uLong uL; - ZPOS64_T uL64; - voidpf filestream = NULL; - ZPOS64_T number_entry_CD; - int err = UNZ_OK; - - if (unz_copyright[0]!=' ') - return NULL; - - us.filestream = NULL; - us.filestream_with_CD = NULL; - us.z_filefunc.zseek32_file = NULL; - us.z_filefunc.ztell32_file = NULL; - if (pzlib_filefunc64_32_def == NULL) - fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); - else - us.z_filefunc = *pzlib_filefunc64_32_def; - - us.filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); - - if (us.filestream == NULL) - return NULL; - - us.filestream_with_CD = us.filestream; - us.isZip64 = 0; - - /* Search for end of central directory header */ - central_pos = unz64local_SearchCentralDir(&us.z_filefunc, us.filestream); - if (central_pos) - { - if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = UNZ_ERRNO; - - /* the signature, already checked */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* number of this disk */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - us.number_disk = uL; - /* number of the disk with the start of the central directory */ - if (unz64local_getShort(&us.z_filefunc, us.filestream,& uL) != UNZ_OK) - err = UNZ_ERRNO; - us.gi.number_disk_with_CD = uL; - /* total number of entries in the central directory on this disk */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - us.gi.number_entry = uL; - /* total number of entries in the central directory */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - number_entry_CD = uL; - if (number_entry_CD != us.gi.number_entry) - err = UNZ_BADZIPFILE; - /* size of the central directory */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - us.size_central_dir = uL; - /* offset of start of central directory with respect to the starting disk number */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - us.offset_central_dir = uL; - /* zipfile comment length */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &us.gi.size_comment) != UNZ_OK) - err = UNZ_ERRNO; - - if (err == UNZ_OK) - { - /* Search for Zip64 end of central directory header */ - central_pos64 = unz64local_SearchCentralDir64(&us.z_filefunc, us.filestream, central_pos); - if (central_pos64) - { - central_pos = central_pos64; - us.isZip64 = 1; - - if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = UNZ_ERRNO; - - /* the signature, already checked */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* size of zip64 end of central directory record */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &uL64) != UNZ_OK) - err = UNZ_ERRNO; - /* version made by */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* version needed to extract */ - if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* number of this disk */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.number_disk) != UNZ_OK) - err = UNZ_ERRNO; - /* number of the disk with the start of the central directory */ - if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.gi.number_disk_with_CD) != UNZ_OK) - err = UNZ_ERRNO; - /* total number of entries in the central directory on this disk */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.gi.number_entry) != UNZ_OK) - err = UNZ_ERRNO; - /* total number of entries in the central directory */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &number_entry_CD) != UNZ_OK) - err = UNZ_ERRNO; - if (number_entry_CD != us.gi.number_entry) - err = UNZ_BADZIPFILE; - /* size of the central directory */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.size_central_dir) != UNZ_OK) - err = UNZ_ERRNO; - /* offset of start of central directory with respect to the starting disk number */ - if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.offset_central_dir) != UNZ_OK) - err = UNZ_ERRNO; - } - else if ((us.gi.number_entry == 0xffff) || (us.size_central_dir == 0xffff) || (us.offset_central_dir == 0xffffffff)) - err = UNZ_BADZIPFILE; - } - } - else - err = UNZ_ERRNO; - - if ((err == UNZ_OK) && (central_pos < us.offset_central_dir + us.size_central_dir)) - err = UNZ_BADZIPFILE; - - if (err != UNZ_OK) - { - ZCLOSE64(us.z_filefunc, us.filestream); - return NULL; - } - - if (us.gi.number_disk_with_CD == 0) - { - /* If there is only one disk open another stream so we don't have to seek between the CD - and the file headers constantly */ - filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); - if (filestream != NULL) - us.filestream = filestream; - } - - /* Hack for zip files that have no respect for zip64 - if ((central_pos > 0xffffffff) && (us.offset_central_dir < 0xffffffff)) - us.offset_central_dir = central_pos - us.size_central_dir;*/ - - us.byte_before_the_zipfile = central_pos - (us.offset_central_dir + us.size_central_dir); - us.central_pos = central_pos; - us.pfile_in_zip_read = NULL; - - s = (unz64_s*)ALLOC(sizeof(unz64_s)); - if (s != NULL) - { - *s = us; - unzGoToFirstFile((unzFile)s); - } - return (unzFile)s; -} - -extern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def* pzlib_filefunc32_def) -{ - if (pzlib_filefunc32_def != NULL) - { - zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; - fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def); - return unzOpenInternal(path, &zlib_filefunc64_32_def_fill); - } - return unzOpenInternal(path, NULL); -} - -extern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def* pzlib_filefunc_def) -{ - if (pzlib_filefunc_def != NULL) - { - zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; - zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; - zlib_filefunc64_32_def_fill.ztell32_file = NULL; - zlib_filefunc64_32_def_fill.zseek32_file = NULL; - return unzOpenInternal(path, &zlib_filefunc64_32_def_fill); - } - return unzOpenInternal(path, NULL); -} - -extern unzFile ZEXPORT unzOpen(const char *path) -{ - return unzOpenInternal(path, NULL); -} - -extern unzFile ZEXPORT unzOpen64(const void *path) -{ - return unzOpenInternal(path, NULL); -} - -extern int ZEXPORT unzClose(unzFile file) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD)) - ZCLOSE64(s->z_filefunc, s->filestream); - if (s->filestream_with_CD != NULL) - ZCLOSE64(s->z_filefunc, s->filestream_with_CD); - - s->filestream = NULL; - s->filestream_with_CD = NULL; - TRYFREE(s); - return UNZ_OK; -} - -/* Goto to the next available disk for spanned archives */ -local int unzGoToNextDisk OF((unzFile file)); -local int unzGoToNextDisk(unzFile file) -{ - unz64_s* s; - uLong number_disk_next = 0; - - s = (unz64_s*)file; - if (s == NULL) - return UNZ_PARAMERROR; - number_disk_next = s->number_disk; - - if ((s->pfile_in_zip_read != NULL) && (s->pfile_in_zip_read->rest_read_uncompressed > 0)) - /* We are currently reading a file and we need the next sequential disk */ - number_disk_next += 1; - else - /* Goto the disk for the current file */ - number_disk_next = s->cur_file_info.disk_num_start; - - if (number_disk_next != s->number_disk) - { - /* Switch disks */ - if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD)) - ZCLOSE64(s->z_filefunc, s->filestream); - - if (number_disk_next == s->gi.number_disk_with_CD) - { - s->filestream = s->filestream_with_CD; - } - else - { - s->filestream = ZOPENDISK64(s->z_filefunc, s->filestream_with_CD, number_disk_next, - ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); - } - - if (s->filestream == NULL) - return UNZ_ERRNO; - - s->number_disk = number_disk_next; - } - - return UNZ_OK; -} - -extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - /* to do : check if number_entry is not truncated */ - pglobal_info32->number_entry = (uLong)s->gi.number_entry; - pglobal_info32->size_comment = s->gi.size_comment; - pglobal_info32->number_disk_with_CD = s->gi.number_disk_with_CD; - return UNZ_OK; -} - -extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64* pglobal_info) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - *pglobal_info = s->gi; - return UNZ_OK; -} - -extern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uLong comment_size) -{ - unz64_s* s; - uLong bytes_to_read = comment_size; - if (file == NULL) - return (int)UNZ_PARAMERROR; - s = (unz64_s*)file; - - if (bytes_to_read > s->gi.size_comment) - bytes_to_read = s->gi.size_comment; - - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, s->central_pos + 22, ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_ERRNO; - - if (bytes_to_read>0) - { - *comment = 0; - if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, bytes_to_read) != bytes_to_read) - return UNZ_ERRNO; - } - - if ((comment != NULL) && (comment_size > s->gi.size_comment)) - *(comment+s->gi.size_comment) = 0; - return (int)bytes_to_read; -} - -/* Get Info about the current file in the zipfile, with internal only info */ -local int unz64local_GetCurrentFileInfoInternal(unzFile file, unz_file_info64 *pfile_info, - unz_file_info64_internal *pfile_info_internal, char *filename, uLong filename_size, void *extrafield, - uLong extrafield_size, char *comment, uLong comment_size) -{ - unz64_s* s; - unz_file_info64 file_info; - unz_file_info64_internal file_info_internal; - ZPOS64_T bytes_to_read; - int err = UNZ_OK; - uLong uMagic; - long lSeek = 0; - ZPOS64_T current_pos = 0; - uLong acc = 0; - uLong uL; - ZPOS64_T uL64; - - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, - s->pos_in_central_dir + s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = UNZ_ERRNO; - - /* Check the magic */ - if (err == UNZ_OK) - { - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uMagic) != UNZ_OK) - err = UNZ_ERRNO; - else if (uMagic != CENTRALHEADERMAGIC) - err = UNZ_BADZIPFILE; - } - - /* Read central directory header */ - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version_needed) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.flag) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.compression_method) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.dosDate) != UNZ_OK) - err = UNZ_ERRNO; - unz64local_DosDateToTmuDate(file_info.dosDate, &file_info.tmu_date); - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.crc) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - file_info.compressed_size = uL; - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - file_info.uncompressed_size = uL; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_filename) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_extra) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_comment) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.internal_fa) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.external_fa) != UNZ_OK) - err = UNZ_ERRNO; - /* Relative offset of local header */ - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - - file_info.size_file_extra_internal = 0; - file_info.disk_offset = uL; - file_info_internal.offset_curfile = uL; -#ifdef HAVE_AES - file_info_internal.aes_compression_method = 0; - file_info_internal.aes_encryption_mode = 0; - file_info_internal.aes_version = 0; -#endif - - lSeek += file_info.size_filename; - - if ((err == UNZ_OK) && (filename != NULL)) - { - if (file_info.size_filename < filename_size) - { - *(filename+file_info.size_filename) = 0; - bytes_to_read = file_info.size_filename; - } - else - bytes_to_read = filename_size; - - if ((file_info.size_filename > 0) && (filename_size > 0)) - if (ZREAD64(s->z_filefunc, s->filestream_with_CD,filename, (uLong)bytes_to_read) != bytes_to_read) - err = UNZ_ERRNO; - lSeek -= (uLong)bytes_to_read; - } - - /* Read extrafield */ - if ((err == UNZ_OK) && (extrafield != NULL)) - { - if (file_info.size_file_extra < extrafield_size) - bytes_to_read = file_info.size_file_extra; - else - bytes_to_read = extrafield_size; - - if (lSeek != 0) - { - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0) - lSeek=0; - else - err = UNZ_ERRNO; - } - - if ((file_info.size_file_extra > 0) && (extrafield_size > 0)) - if (ZREAD64(s->z_filefunc, s->filestream_with_CD, extrafield, (uLong)bytes_to_read) != bytes_to_read) - err = UNZ_ERRNO; - lSeek += file_info.size_file_extra - (uLong)bytes_to_read; - } - else - lSeek += file_info.size_file_extra; - - if ((err == UNZ_OK) && (file_info.size_file_extra != 0)) - { - if (lSeek != 0) - { - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0) - lSeek=0; - else - err = UNZ_ERRNO; - } - - /* We are going to parse the extra field so we need to move back */ - current_pos = ZTELL64(s->z_filefunc, s->filestream_with_CD); - if (current_pos < file_info.size_file_extra) - err = UNZ_ERRNO; - current_pos -= file_info.size_file_extra; - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, current_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) - err = UNZ_ERRNO; - - while((err != UNZ_ERRNO) && (acc < file_info.size_file_extra)) - { - uLong headerid; - uLong datasize; - - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &headerid) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &datasize) != UNZ_OK) - err = UNZ_ERRNO; - - /* ZIP64 extra fields */ - if (headerid == 0x0001) - { - /* Subtract size of ZIP64 field, since ZIP64 is handled internally */ - file_info.size_file_extra_internal += 2 + 2 + datasize; - - if (file_info.uncompressed_size == 0xffffffff) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.uncompressed_size) != UNZ_OK) - err = UNZ_ERRNO; - } - if (file_info.compressed_size == 0xffffffff) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.compressed_size) != UNZ_OK) - err = UNZ_ERRNO; - } - if (file_info_internal.offset_curfile == 0xffffffff) - { - /* Relative Header offset */ - if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &uL64) != UNZ_OK) - err = UNZ_ERRNO; - file_info_internal.offset_curfile = uL64; - file_info.disk_offset = uL64; - } - if (file_info.disk_num_start == 0xffffffff) - { - /* Disk Start Number */ - if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK) - err = UNZ_ERRNO; - } - } -#ifdef HAVE_AES - /* AES header */ - else if (headerid == 0x9901) - { - /* Subtract size of AES field, since AES is handled internally */ - file_info.size_file_extra_internal += 2 + 2 + datasize; - - /* Verify version info */ - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - /* Support AE-1 and AE-2 */ - if (uL != 1 && uL != 2) - err = UNZ_ERRNO; - file_info_internal.aes_version = uL; - if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - if ((char)uL != 'A') - err = UNZ_ERRNO; - if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - if ((char)uL != 'E') - err = UNZ_ERRNO; - /* Get AES encryption strength and actual compression method */ - if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - file_info_internal.aes_encryption_mode = uL; - if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK) - err = UNZ_ERRNO; - file_info_internal.aes_compression_method = uL; - } -#endif - else - { - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD,datasize, ZLIB_FILEFUNC_SEEK_CUR) != 0) - err = UNZ_ERRNO; - } - - acc += 2 + 2 + datasize; - } - } - - if (file_info.disk_num_start == s->gi.number_disk_with_CD) - file_info_internal.byte_before_the_zipfile = s->byte_before_the_zipfile; - else - file_info_internal.byte_before_the_zipfile = 0; - - if ((err == UNZ_OK) && (comment != NULL)) - { - if (file_info.size_file_comment < comment_size) - { - *(comment+file_info.size_file_comment) = 0; - bytes_to_read = file_info.size_file_comment; - } - else - bytes_to_read = comment_size; - - if (lSeek != 0) - { - if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) != 0) - err = UNZ_ERRNO; - } - - if ((file_info.size_file_comment > 0) && (comment_size > 0)) - if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, (uLong)bytes_to_read) != bytes_to_read) - err = UNZ_ERRNO; - lSeek += file_info.size_file_comment - (uLong)bytes_to_read; - } - else - lSeek += file_info.size_file_comment; - - if ((err == UNZ_OK) && (pfile_info != NULL)) - *pfile_info = file_info; - - if ((err == UNZ_OK) && (pfile_info_internal != NULL)) - *pfile_info_internal = file_info_internal; - - return err; -} - -extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info * pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char* comment, uLong comment_size) -{ - unz_file_info64 file_info64; - int err; - - err = unz64local_GetCurrentFileInfoInternal(file, &file_info64, NULL, filename, filename_size, - extrafield, extrafield_size, comment, comment_size); - - if ((err == UNZ_OK) && (pfile_info != NULL)) - { - pfile_info->version = file_info64.version; - pfile_info->version_needed = file_info64.version_needed; - pfile_info->flag = file_info64.flag; - pfile_info->compression_method = file_info64.compression_method; - pfile_info->dosDate = file_info64.dosDate; - pfile_info->crc = file_info64.crc; - - pfile_info->size_filename = file_info64.size_filename; - pfile_info->size_file_extra = file_info64.size_file_extra - file_info64.size_file_extra_internal; - pfile_info->size_file_comment = file_info64.size_file_comment; - - pfile_info->disk_num_start = file_info64.disk_num_start; - pfile_info->internal_fa = file_info64.internal_fa; - pfile_info->external_fa = file_info64.external_fa; - - pfile_info->tmu_date = file_info64.tmu_date, - - pfile_info->compressed_size = (uLong)file_info64.compressed_size; - pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; - - } - return err; -} - -extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 * pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char* comment, uLong comment_size) -{ - return unz64local_GetCurrentFileInfoInternal(file, pfile_info, NULL, filename, filename_size, - extrafield, extrafield_size, comment,comment_size); -} - -/* Read the local header of the current zipfile. Check the coherency of the local header and info in the - end of central directory about this file store in *piSizeVar the size of extra info in local header - (filename and size of extra field data) */ -local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s* s, uInt* piSizeVar, ZPOS64_T *poffset_local_extrafield, - uInt *psize_local_extrafield) -{ - uLong uMagic, uL, uFlags; - uLong size_filename; - uLong size_extra_field; - int err = UNZ_OK; - int compression_method = 0; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - err = unzGoToNextDisk((unzFile)s); - if (err != UNZ_OK) - return err; - - if (ZSEEK64(s->z_filefunc, s->filestream, s->cur_file_info_internal.offset_curfile + - s->cur_file_info_internal.byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_ERRNO; - - if (err == UNZ_OK) - { - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK) - err = UNZ_ERRNO; - else if (uMagic != LOCALHEADERMAGIC) - err = UNZ_BADZIPFILE; - } - - if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream, &uFlags) != UNZ_OK) - err = UNZ_ERRNO; - if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) - err = UNZ_ERRNO; - else if ((err == UNZ_OK) && (uL != s->cur_file_info.compression_method)) - err = UNZ_BADZIPFILE; - - compression_method = (int)s->cur_file_info.compression_method; -#ifdef HAVE_AES - if (compression_method == AES_METHOD) - compression_method = (int)s->cur_file_info_internal.aes_compression_method; -#endif - - if ((err == UNZ_OK) && (compression_method != 0) && -#ifdef HAVE_BZIP2 - (compression_method != Z_BZIP2ED) && -#endif - (compression_method != Z_DEFLATED)) - err = UNZ_BADZIPFILE; - - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* date/time */ - err = UNZ_ERRNO; - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* crc */ - err = UNZ_ERRNO; - else if ((err == UNZ_OK) && (uL != s->cur_file_info.crc) && ((uFlags & 8) == 0)) - err = UNZ_BADZIPFILE; - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size compr */ - err = UNZ_ERRNO; - else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.compressed_size) && ((uFlags & 8) == 0)) - err = UNZ_BADZIPFILE; - if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size uncompr */ - err = UNZ_ERRNO; - else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.uncompressed_size) && ((uFlags & 8) == 0)) - err = UNZ_BADZIPFILE; - if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_filename) != UNZ_OK) - err = UNZ_ERRNO; - else if ((err == UNZ_OK) && (size_filename != s->cur_file_info.size_filename)) - err = UNZ_BADZIPFILE; - - *piSizeVar += (uInt)size_filename; - - if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_extra_field) != UNZ_OK) - err = UNZ_ERRNO; - *poffset_local_extrafield = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; - *psize_local_extrafield = (uInt)size_extra_field; - - *piSizeVar += (uInt)size_extra_field; - - return err; -} - -/* - Open for reading data the current file in the zipfile. - If there is no error and the file is opened, the return value is UNZ_OK. -*/ -extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int* method, int* level, int raw, const char* password) -{ - int err = UNZ_OK; - int compression_method; - uInt iSizeVar; - unz64_s* s; - file_in_zip64_read_info_s* pfile_in_zip_read_info; - ZPOS64_T offset_local_extrafield; - uInt size_local_extrafield; -#ifndef NOUNCRYPT - char source[12]; -#else - if (password != NULL) - return UNZ_PARAMERROR; -#endif - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (!s->current_file_ok) - return UNZ_PARAMERROR; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if (unz64local_CheckCurrentFileCoherencyHeader(s, &iSizeVar, &offset_local_extrafield, &size_local_extrafield) != UNZ_OK) - return UNZ_BADZIPFILE; - - pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); - if (pfile_in_zip_read_info == NULL) - return UNZ_INTERNALERROR; - - pfile_in_zip_read_info->read_buffer = (Bytef*)ALLOC(UNZ_BUFSIZE); - pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; - pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; - pfile_in_zip_read_info->pos_local_extrafield = 0; - pfile_in_zip_read_info->raw = raw; - - if (pfile_in_zip_read_info->read_buffer == NULL) - { - TRYFREE(pfile_in_zip_read_info); - return UNZ_INTERNALERROR; - } - - pfile_in_zip_read_info->stream_initialised = 0; - - compression_method = (int)s->cur_file_info.compression_method; -#ifdef HAVE_AES - if (compression_method == AES_METHOD) - compression_method = (int)s->cur_file_info_internal.aes_compression_method; -#endif - - if (method != NULL) - *method = compression_method; - - if (level != NULL) - { - *level = 6; - switch (s->cur_file_info.flag & 0x06) - { - case 6 : *level = 1; break; - case 4 : *level = 2; break; - case 2 : *level = 9; break; - } - } - - if ((compression_method != 0) && -#ifdef HAVE_BZIP2 - (compression_method != Z_BZIP2ED) && -#endif - (compression_method != Z_DEFLATED)) - err = UNZ_BADZIPFILE; - - pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc; - pfile_in_zip_read_info->crc32 = 0; - pfile_in_zip_read_info->total_out_64 = 0; - pfile_in_zip_read_info->compression_method = compression_method; - pfile_in_zip_read_info->filestream = s->filestream; - pfile_in_zip_read_info->z_filefunc = s->z_filefunc; - if (s->number_disk == s->gi.number_disk_with_CD) - pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile; - else - pfile_in_zip_read_info->byte_before_the_zipfile = 0; - pfile_in_zip_read_info->stream.total_out = 0; - pfile_in_zip_read_info->stream.total_in = 0; - pfile_in_zip_read_info->stream.next_in = NULL; - - if (!raw) - { - if (compression_method == Z_BZIP2ED) - { -#ifdef HAVE_BZIP2 - pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; - pfile_in_zip_read_info->bstream.bzfree = (free_func)0; - pfile_in_zip_read_info->bstream.opaque = (voidpf)0; - pfile_in_zip_read_info->bstream.state = (voidpf)0; - - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)0; - pfile_in_zip_read_info->stream.next_in = (voidpf)0; - pfile_in_zip_read_info->stream.avail_in = 0; - - err = BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; - else - { - TRYFREE(pfile_in_zip_read_info); - return err; - } -#else - pfile_in_zip_read_info->raw = 1; -#endif - } - else if (compression_method == Z_DEFLATED) - { - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)s; - pfile_in_zip_read_info->stream.next_in = 0; - pfile_in_zip_read_info->stream.avail_in = 0; - - err = inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised = Z_DEFLATED; - else - { - TRYFREE(pfile_in_zip_read_info); - return err; - } - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - * In unzip, i don't wait absolutely Z_STREAM_END because I known the - * size of both compressed and uncompressed data - */ - } - } - - pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size; - pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size; - pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; - pfile_in_zip_read_info->stream.avail_in = (uInt)0; - - s->pfile_in_zip_read = pfile_in_zip_read_info; - -#ifndef NOUNCRYPT - s->pcrc_32_tab = NULL; - - if ((password != NULL) && ((s->cur_file_info.flag & 1) != 0)) - { - if (ZSEEK64(s->z_filefunc, s->filestream, - s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_INTERNALERROR; -#ifdef HAVE_AES - if (s->cur_file_info.compression_method == AES_METHOD) - { - unsigned char passverify[AES_PWVERIFYSIZE]; - unsigned char saltvalue[AES_MAXSALTLENGTH]; - uInt saltlength; - - if ((s->cur_file_info_internal.aes_encryption_mode < 1) || - (s->cur_file_info_internal.aes_encryption_mode > 3)) - return UNZ_INTERNALERROR; - - saltlength = SALT_LENGTH(s->cur_file_info_internal.aes_encryption_mode); - - if (ZREAD64(s->z_filefunc, s->filestream, saltvalue, saltlength) != saltlength) - return UNZ_INTERNALERROR; - if (ZREAD64(s->z_filefunc, s->filestream, passverify, AES_PWVERIFYSIZE) != AES_PWVERIFYSIZE) - return UNZ_INTERNALERROR; - - fcrypt_init(s->cur_file_info_internal.aes_encryption_mode, password, strlen(password), saltvalue, - passverify, &s->pfile_in_zip_read->aes_ctx); - - s->pfile_in_zip_read->rest_read_compressed -= saltlength + AES_PWVERIFYSIZE; - s->pfile_in_zip_read->rest_read_compressed -= AES_AUTHCODESIZE; - - s->pfile_in_zip_read->pos_in_zipfile += saltlength + AES_PWVERIFYSIZE; - } - else -#endif - { - int i; - s->pcrc_32_tab = (const unsigned int*)get_crc_table(); - init_keys(password, s->keys, s->pcrc_32_tab); - - if (ZREAD64(s->z_filefunc, s->filestream, source, 12) < 12) - return UNZ_INTERNALERROR; - - for (i = 0; i < 12; i++) - zdecode(s->keys, s->pcrc_32_tab, source[i]); - - s->pfile_in_zip_read->rest_read_compressed -= 12; - - s->pfile_in_zip_read->pos_in_zipfile += 12; - } - } -#endif - - return UNZ_OK; -} - -extern int ZEXPORT unzOpenCurrentFile(unzFile file) -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); -} - -extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char* password) -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, password); -} - -extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int* method, int* level, int raw) -{ - return unzOpenCurrentFile3(file, method, level, raw, NULL); -} - -/* Read bytes from the current file. - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if some bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ -extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len) -{ - int err = UNZ_OK; - uInt read = 0; - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - - if (s->pfile_in_zip_read == NULL) - return UNZ_PARAMERROR; - if (s->pfile_in_zip_read->read_buffer == NULL) - return UNZ_END_OF_LIST_OF_FILE; - if (len == 0) - return 0; - - s->pfile_in_zip_read->stream.next_out = (Bytef*)buf; - s->pfile_in_zip_read->stream.avail_out = (uInt)len; - - if (s->pfile_in_zip_read->raw) - { - if (len > s->pfile_in_zip_read->rest_read_compressed + s->pfile_in_zip_read->stream.avail_in) - s->pfile_in_zip_read->stream.avail_out = (uInt)s->pfile_in_zip_read->rest_read_compressed + - s->pfile_in_zip_read->stream.avail_in; - } - else - { - if (len > s->pfile_in_zip_read->rest_read_uncompressed) - s->pfile_in_zip_read->stream.avail_out = (uInt)s->pfile_in_zip_read->rest_read_uncompressed; - } - - while (s->pfile_in_zip_read->stream.avail_out > 0) - { - if (s->pfile_in_zip_read->stream.avail_in == 0) - { - uLong bytes_to_read = UNZ_BUFSIZE; - uLong bytes_not_read = 0; - uLong bytes_read = 0; - uLong total_bytes_read = 0; - - if (s->pfile_in_zip_read->stream.next_in != NULL) - bytes_not_read = s->pfile_in_zip_read->read_buffer + UNZ_BUFSIZE - - s->pfile_in_zip_read->stream.next_in; - bytes_to_read -= bytes_not_read; - if (bytes_not_read > 0) - memcpy(s->pfile_in_zip_read->read_buffer, s->pfile_in_zip_read->stream.next_in, bytes_not_read); - if (s->pfile_in_zip_read->rest_read_compressed < bytes_to_read) - bytes_to_read = (uInt)s->pfile_in_zip_read->rest_read_compressed; - - while (total_bytes_read != bytes_to_read) - { - if (ZSEEK64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream, - s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_ERRNO; - - bytes_read = ZREAD64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream, - s->pfile_in_zip_read->read_buffer + bytes_not_read + total_bytes_read, - bytes_to_read - total_bytes_read); - - total_bytes_read += bytes_read; - s->pfile_in_zip_read->pos_in_zipfile += bytes_read; - - if (bytes_read == 0) - { - if (ZERROR64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream)) - return UNZ_ERRNO; - - err = unzGoToNextDisk(file); - if (err != UNZ_OK) - return err; - - s->pfile_in_zip_read->pos_in_zipfile = 0; - s->pfile_in_zip_read->filestream = s->filestream; - } - } - -#ifndef NOUNCRYPT - if ((s->cur_file_info.flag & 1) != 0) - { -#ifdef HAVE_AES - if (s->cur_file_info.compression_method == AES_METHOD) - { - fcrypt_decrypt(s->pfile_in_zip_read->read_buffer, bytes_to_read, &s->pfile_in_zip_read->aes_ctx); - } - else -#endif - if (s->pcrc_32_tab != NULL) - { - uInt i; - for(i = 0; i < total_bytes_read; i++) - s->pfile_in_zip_read->read_buffer[i] = - zdecode(s->keys, s->pcrc_32_tab, s->pfile_in_zip_read->read_buffer[i]); - } - } -#endif - - s->pfile_in_zip_read->rest_read_compressed -= total_bytes_read; - s->pfile_in_zip_read->stream.next_in = (Bytef*)s->pfile_in_zip_read->read_buffer; - s->pfile_in_zip_read->stream.avail_in = (uInt)(bytes_not_read + total_bytes_read); - } - - if ((s->pfile_in_zip_read->compression_method == 0) || (s->pfile_in_zip_read->raw)) - { - uInt copy, i; - - if ((s->pfile_in_zip_read->stream.avail_in == 0) && - (s->pfile_in_zip_read->rest_read_compressed == 0)) - return (read == 0) ? UNZ_EOF : read; - - if (s->pfile_in_zip_read->stream.avail_out < s->pfile_in_zip_read->stream.avail_in) - copy = s->pfile_in_zip_read->stream.avail_out; - else - copy = s->pfile_in_zip_read->stream.avail_in; - - for (i = 0; i < copy; i++) - *(s->pfile_in_zip_read->stream.next_out+i) = - *(s->pfile_in_zip_read->stream.next_in+i); - - s->pfile_in_zip_read->total_out_64 = s->pfile_in_zip_read->total_out_64 + copy; - s->pfile_in_zip_read->rest_read_uncompressed -= copy; - s->pfile_in_zip_read->crc32 = crc32(s->pfile_in_zip_read->crc32, - s->pfile_in_zip_read->stream.next_out, copy); - - s->pfile_in_zip_read->stream.avail_in -= copy; - s->pfile_in_zip_read->stream.avail_out -= copy; - s->pfile_in_zip_read->stream.next_out += copy; - s->pfile_in_zip_read->stream.next_in += copy; - s->pfile_in_zip_read->stream.total_out += copy; - read += copy; - } - else if (s->pfile_in_zip_read->compression_method == Z_BZIP2ED) - { -#ifdef HAVE_BZIP2 - uLong total_out_before, total_out_after; - const Bytef *buf_before; - uLong out_bytes; - - s->pfile_in_zip_read->bstream.next_in = (char*)s->pfile_in_zip_read->stream.next_in; - s->pfile_in_zip_read->bstream.avail_in = s->pfile_in_zip_read->stream.avail_in; - s->pfile_in_zip_read->bstream.total_in_lo32 = (uInt)s->pfile_in_zip_read->stream.total_in; - s->pfile_in_zip_read->bstream.total_in_hi32 = s->pfile_in_zip_read->stream.total_in >> 32; - - s->pfile_in_zip_read->bstream.next_out = (char*)s->pfile_in_zip_read->stream.next_out; - s->pfile_in_zip_read->bstream.avail_out = s->pfile_in_zip_read->stream.avail_out; - s->pfile_in_zip_read->bstream.total_out_lo32 = (uInt)s->pfile_in_zip_read->stream.total_out; - s->pfile_in_zip_read->bstream.total_out_hi32 = s->pfile_in_zip_read->stream.total_out >> 32; - - total_out_before = s->pfile_in_zip_read->bstream.total_out_lo32 + - (((uLong)s->pfile_in_zip_read->bstream.total_out_hi32) << 32); - buf_before = (const Bytef *)s->pfile_in_zip_read->bstream.next_out; - - err = BZ2_bzDecompress(&s->pfile_in_zip_read->bstream); - - total_out_after = s->pfile_in_zip_read->bstream.total_out_lo32 + - (((uLong)s->pfile_in_zip_read->bstream.total_out_hi32) << 32); - - out_bytes = total_out_after-total_out_before; - - s->pfile_in_zip_read->total_out_64 = s->pfile_in_zip_read->total_out_64 + out_bytes; - s->pfile_in_zip_read->rest_read_uncompressed -= out_bytes; - s->pfile_in_zip_read->crc32 = crc32(s->pfile_in_zip_read->crc32,buf_before, (uInt)(out_bytes)); - - read += (uInt)(total_out_after - total_out_before); - - s->pfile_in_zip_read->stream.next_in = (Bytef*)s->pfile_in_zip_read->bstream.next_in; - s->pfile_in_zip_read->stream.avail_in = s->pfile_in_zip_read->bstream.avail_in; - s->pfile_in_zip_read->stream.total_in = s->pfile_in_zip_read->bstream.total_in_lo32; - s->pfile_in_zip_read->stream.next_out = (Bytef*)s->pfile_in_zip_read->bstream.next_out; - s->pfile_in_zip_read->stream.avail_out = s->pfile_in_zip_read->bstream.avail_out; - s->pfile_in_zip_read->stream.total_out = s->pfile_in_zip_read->bstream.total_out_lo32; - - if (err == BZ_STREAM_END) - return (read == 0) ? UNZ_EOF : read; - if (err != BZ_OK) - break; -#endif - } - else - { - ZPOS64_T total_out_before, total_out_after; - const Bytef *buf_before; - ZPOS64_T out_bytes; - int flush=Z_SYNC_FLUSH; - - total_out_before = s->pfile_in_zip_read->stream.total_out; - buf_before = s->pfile_in_zip_read->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err = inflate(&s->pfile_in_zip_read->stream,flush); - - if ((err >= 0) && (s->pfile_in_zip_read->stream.msg != NULL)) - err = Z_DATA_ERROR; - - total_out_after = s->pfile_in_zip_read->stream.total_out; - out_bytes = total_out_after-total_out_before; - - s->pfile_in_zip_read->total_out_64 += out_bytes; - s->pfile_in_zip_read->rest_read_uncompressed -= out_bytes; - s->pfile_in_zip_read->crc32 = - crc32(s->pfile_in_zip_read->crc32,buf_before, (uInt)(out_bytes)); - - read += (uInt)(total_out_after - total_out_before); - - if (err == Z_STREAM_END) - return (read == 0) ? UNZ_EOF : read; - if (err != Z_OK) - break; - } - } - - if (err == Z_OK) - return read; - return err; -} - -extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file) -{ - unz64_s* s; - s = (unz64_s*)file; - if (file == NULL) - return 0; /* UNZ_PARAMERROR */ - if (s->pfile_in_zip_read == NULL) - return 0; /* UNZ_PARAMERROR */ - return s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile; -} - -extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, unsigned len) -{ - unz64_s* s; - uInt read_now; - ZPOS64_T size_to_read; - - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (s->pfile_in_zip_read == NULL) - return UNZ_PARAMERROR; - - size_to_read = s->pfile_in_zip_read->size_local_extrafield - s->pfile_in_zip_read->pos_local_extrafield; - - if (buf == NULL) - return (int)size_to_read; - - if (len > size_to_read) - read_now = (uInt)size_to_read; - else - read_now = (uInt)len ; - - if (read_now == 0) - return 0; - - if (ZSEEK64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream, - s->pfile_in_zip_read->offset_local_extrafield + s->pfile_in_zip_read->pos_local_extrafield, - ZLIB_FILEFUNC_SEEK_SET) != 0) - return UNZ_ERRNO; - - if (ZREAD64(s->pfile_in_zip_read->z_filefunc, s->pfile_in_zip_read->filestream, buf, read_now) != read_now) - return UNZ_ERRNO; - - return (int)read_now; -} - -extern int ZEXPORT unzCloseCurrentFile(unzFile file) -{ - int err = UNZ_OK; - - unz64_s* s; - file_in_zip64_read_info_s* pfile_in_zip_read_info; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info == NULL) - return UNZ_PARAMERROR; - -#ifdef HAVE_AES - if (s->cur_file_info.compression_method == AES_METHOD) - { - unsigned char authcode[AES_AUTHCODESIZE]; - unsigned char rauthcode[AES_AUTHCODESIZE]; - - if (ZREAD64(s->z_filefunc, s->filestream, authcode, AES_AUTHCODESIZE) != AES_AUTHCODESIZE) - return UNZ_ERRNO; - - if (fcrypt_end(rauthcode, &s->pfile_in_zip_read->aes_ctx) != AES_AUTHCODESIZE) - err = UNZ_CRCERROR; - if (memcmp(authcode, rauthcode, AES_AUTHCODESIZE) != 0) - err = UNZ_CRCERROR; - } - /* AES zip version AE-1 will expect a valid crc as well */ - if ((s->cur_file_info.compression_method != AES_METHOD) || - (s->cur_file_info_internal.aes_version == 0x0001)) -#endif - { - if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && - (!pfile_in_zip_read_info->raw)) - { - if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) - err = UNZ_CRCERROR; - } - } - - TRYFREE(pfile_in_zip_read_info->read_buffer); - pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) - inflateEnd(&pfile_in_zip_read_info->stream); -#ifdef HAVE_BZIP2 - else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) - BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); -#endif - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); - - s->pfile_in_zip_read = NULL; - - return err; -} - -extern int ZEXPORT unzGoToFirstFile2(unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size) -{ - int err = UNZ_OK; - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - s->pos_in_central_dir = s->offset_central_dir; - s->num_file = 0; - err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, - filename,filename_size, extrafield,extrafield_size, comment,comment_size); - s->current_file_ok = (err == UNZ_OK); - if ((err == UNZ_OK) && (pfile_info != NULL)) - memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64)); - return err; -} - -extern int ZEXPORT unzGoToFirstFile(unzFile file) -{ - return unzGoToFirstFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0); -} - -extern int ZEXPORT unzGoToNextFile2(unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size) -{ - unz64_s* s; - int err; - - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ - if (s->num_file+1 == s->gi.number_entry) - return UNZ_END_OF_LIST_OF_FILE; - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment; - s->num_file++; - err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, - filename, filename_size, extrafield,extrafield_size, comment,comment_size); - s->current_file_ok = (err == UNZ_OK); - if ((err == UNZ_OK) && (pfile_info != NULL)) - memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64)); - return err; -} - -extern int ZEXPORT unzGoToNextFile(unzFile file) -{ - return unzGoToNextFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0); -} - -extern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func) -{ - unz64_s* s; - int err; - unz_file_info64 cur_file_info_saved; - unz_file_info64_internal cur_file_info_internal_saved; - ZPOS64_T num_file_saved; - ZPOS64_T pos_in_central_dir_saved; - char current_filename[UNZ_MAXFILENAMEINZIP+1]; - - if (file == NULL) - return UNZ_PARAMERROR; - if (strlen(filename) >= UNZ_MAXFILENAMEINZIP) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - /* Save the current state */ - num_file_saved = s->num_file; - pos_in_central_dir_saved = s->pos_in_central_dir; - cur_file_info_saved = s->cur_file_info; - cur_file_info_internal_saved = s->cur_file_info_internal; - - err = unzGoToFirstFile2(file, NULL, current_filename, sizeof(current_filename)-1, NULL, 0, NULL, 0); - - while (err == UNZ_OK) - { - if (filename_compare_func != NULL) - err = filename_compare_func(file, current_filename, filename); - else - err = strcmp(current_filename, filename); - if (err == 0) - return UNZ_OK; - err = unzGoToNextFile2(file, NULL, current_filename, sizeof(current_filename)-1, NULL, 0, NULL, 0); - } - - /* We failed, so restore the state of the 'current file' to where we were. */ - s->num_file = num_file_saved; - s->pos_in_central_dir = pos_in_central_dir_saved; - s->cur_file_info = cur_file_info_saved; - s->cur_file_info_internal = cur_file_info_internal_saved; - return err; -} - -extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos* file_pos) -{ - unz64_file_pos file_pos64; - int err = unzGetFilePos64(file,&file_pos64); - if (err == UNZ_OK) - { - file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; - file_pos->num_of_file = (uLong)file_pos64.num_of_file; - } - return err; -} - -extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos* file_pos) -{ - unz64_file_pos file_pos64; - - if (file_pos == NULL) - return UNZ_PARAMERROR; - file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; - file_pos64.num_of_file = file_pos->num_of_file; - return unzGoToFilePos64(file,&file_pos64); -} - -extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) -{ - unz64_s* s; - - if (file == NULL || file_pos == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - file_pos->pos_in_zip_directory = s->pos_in_central_dir; - file_pos->num_of_file = s->num_file; - - return UNZ_OK; -} - -extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) -{ - unz64_s* s; - int err; - - if (file == NULL || file_pos == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - - /* jump to the right spot */ - s->pos_in_central_dir = file_pos->pos_in_zip_directory; - s->num_file = file_pos->num_of_file; - - /* set the current file */ - err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal,NULL,0,NULL,0,NULL,0); - /* return results */ - s->current_file_ok = (err == UNZ_OK); - return err; -} - -extern uLong ZEXPORT unzGetOffset(unzFile file) -{ - ZPOS64_T offset64; - - if (file == NULL) - return 0; /* UNZ_PARAMERROR; */ - offset64 = unzGetOffset64(file); - return (uLong)offset64; -} - -extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) -{ - unz64_s* s; - - if (file == NULL) - return 0; /* UNZ_PARAMERROR; */ - s = (unz64_s*)file; - if (!s->current_file_ok) - return 0; - if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) - if (s->num_file == s->gi.number_entry) - return 0; - return s->pos_in_central_dir; -} - -extern int ZEXPORT unzSetOffset(unzFile file, uLong pos) -{ - return unzSetOffset64(file, pos); -} - -extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) -{ - unz64_s* s; - int err; - - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - s->pos_in_central_dir = pos; - s->num_file = s->gi.number_entry; /* hack */ - - err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0); - - s->current_file_ok = (err == UNZ_OK); - return err; -} - -extern z_off_t ZEXPORT unztell(unzFile file) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (s->pfile_in_zip_read == NULL) - return UNZ_PARAMERROR; - return (z_off_t)s->pfile_in_zip_read->stream.total_out; -} - -extern ZPOS64_T ZEXPORT unztell64(unzFile file) -{ - unz64_s* s; - if (file == NULL) - return (ZPOS64_T)-1; - s = (unz64_s*)file; - if (s->pfile_in_zip_read == NULL) - return (ZPOS64_T)-1; - return s->pfile_in_zip_read->total_out_64; -} - -extern int ZEXPORT unzseek(unzFile file, z_off_t offset, int origin) -{ - return unzseek64(file, (ZPOS64_T)offset, origin); -} - -extern int ZEXPORT unzseek64(unzFile file, ZPOS64_T offset, int origin) -{ - unz64_s* s; - ZPOS64_T stream_pos_begin; - ZPOS64_T stream_pos_end; - int isWithinBuffer; - ZPOS64_T position; - - if (file == NULL) - return UNZ_PARAMERROR; - - s = (unz64_s*)file; - - if (s->pfile_in_zip_read == NULL) - return UNZ_ERRNO; - if (s->pfile_in_zip_read->compression_method != 0) - return UNZ_ERRNO; - - if (origin == SEEK_SET) - position = offset; - else if (origin == SEEK_CUR) - position = s->pfile_in_zip_read->total_out_64 + offset; - else if (origin == SEEK_END) - position = s->cur_file_info.compressed_size + offset; - else - return UNZ_PARAMERROR; - - if (position > s->cur_file_info.compressed_size) - return UNZ_PARAMERROR; - - stream_pos_end = s->pfile_in_zip_read->pos_in_zipfile; - stream_pos_begin = stream_pos_end; - - if (stream_pos_begin > UNZ_BUFSIZE) - stream_pos_begin -= UNZ_BUFSIZE; - else - stream_pos_begin = 0; - - isWithinBuffer = s->pfile_in_zip_read->stream.avail_in != 0 && - (s->pfile_in_zip_read->rest_read_compressed != 0 || s->cur_file_info.compressed_size < UNZ_BUFSIZE) && - position >= stream_pos_begin && position < stream_pos_end; - - if (isWithinBuffer) - { - s->pfile_in_zip_read->stream.next_in += position - s->pfile_in_zip_read->total_out_64; - s->pfile_in_zip_read->stream.avail_in = (uInt)(stream_pos_end - position); - } - else - { - s->pfile_in_zip_read->stream.avail_in = 0; - s->pfile_in_zip_read->stream.next_in = 0; - - s->pfile_in_zip_read->pos_in_zipfile = s->pfile_in_zip_read->offset_local_extrafield + position; - s->pfile_in_zip_read->rest_read_compressed = s->cur_file_info.compressed_size - position; - } - - s->pfile_in_zip_read->rest_read_uncompressed -= (position - s->pfile_in_zip_read->total_out_64); - s->pfile_in_zip_read->stream.total_out = (uLong)position; - s->pfile_in_zip_read->total_out_64 = position; - - return UNZ_OK; -} - -extern int ZEXPORT unzeof(unzFile file) -{ - unz64_s* s; - if (file == NULL) - return UNZ_PARAMERROR; - s = (unz64_s*)file; - if (s->pfile_in_zip_read == NULL) - return UNZ_PARAMERROR; - if (s->pfile_in_zip_read->rest_read_uncompressed == 0) - return 1; - return 0; -} diff --git a/minizip/unzip.h b/minizip/unzip.h deleted file mode 100644 index 3a65b54..0000000 --- a/minizip/unzip.h +++ /dev/null @@ -1,319 +0,0 @@ -/* unzip.h -- IO for uncompress .zip files using zlib - Version 1.1, February 14h, 2010 - part of the MiniZip project - - Copyright (C) 1998-2010 Gilles Vollant - http://www.winimage.com/zLibDll/minizip.html - Modifications of Unzip for Zip64 - Copyright (C) 2007-2008 Even Rouault - Modifications for Zip64 support on both zip and unzip - Copyright (C) 2009-2010 Mathias Svensson - http://result42.com - - This program is distributed under the terms of the same license as zlib. - See the accompanying LICENSE file for the full text of the license. -*/ - -#ifndef _UNZ_H -#define _UNZ_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#ifndef _ZLIBIOAPI_H -#include "ioapi.h" -#endif - -#ifdef HAVE_BZIP2 -#include "bzlib.h" -#endif - -#define Z_BZIP2ED 12 - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ { int unused; } unzFile__; -typedef unzFile__ *unzFile; -#else -typedef voidp unzFile; -#endif - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (Z_ERRNO) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) - -/* tm_unz contain date/time info */ -typedef struct tm_unz_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_unz; - -/* unz_global_info structure contain global data about the ZIPfile - These data comes from the end of central dir */ -typedef struct unz_global_info64_s -{ - ZPOS64_T number_entry; /* total number of entries in the central dir on this disk */ - uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info64; - -typedef struct unz_global_info_s -{ - uLong number_entry; /* total number of entries in the central dir on this disk */ - uLong number_disk_with_CD; /* number the the disk with central dir, used for spanning ZIP*/ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info; - -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_info64_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - ZPOS64_T compressed_size; /* compressed size 8 bytes */ - ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; - ZPOS64_T disk_offset; - uLong size_file_extra_internal; -} unz_file_info64; - -typedef struct unz_file_info_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - uLong compressed_size; /* compressed size 4 bytes */ - uLong uncompressed_size; /* uncompressed size 4 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; - uLong disk_offset; -} unz_file_info; - -/***************************************************************************/ -/* Opening and close a zip file */ - -extern unzFile ZEXPORT unzOpen OF((const char *path)); -extern unzFile ZEXPORT unzOpen64 OF((const void *path)); -/* Open a Zip file. - - path should contain the full pathname (by example, on a Windows XP computer - "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". - return NULL if zipfile cannot be opened or doesn't exist - return unzFile handle if no error - - NOTE: The "64" function take a const void* pointer, because the path is just the value passed to the - open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path - is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* does not describe the reality */ - -extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def)); -/* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write operations */ -extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, zlib_filefunc64_def* pzlib_filefunc_def)); -/* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write 64-bit operations */ - -extern int ZEXPORT unzClose OF((unzFile file)); -/* Close a ZipFile opened with unzOpen. If there is files inside the .Zip opened with unzOpenCurrentFile, - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - - return UNZ_OK if there is no error */ - -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); -extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, unz_global_info64 *pglobal_info)); -/* Write info about the ZipFile in the *pglobal_info structure. - - return UNZ_OK if no error */ - -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *comment, uLong comment_size)); -/* Get the global comment string of the ZipFile, in the comment buffer. - - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 */ - -/***************************************************************************/ -/* Reading the content of the current zipfile, you can open it, read data from it, and close it - (you can close it before reading all the file) */ - -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); -/* Open for reading data the current file in the zipfile. - - return UNZ_OK if no error */ - -extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password)); -/* Open for reading data the current file in the zipfile. - password is a crypting password - - return UNZ_OK if no error */ - -extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw)); -/* Same as unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 *method will receive method of compression, *level will receive level of compression - - NOTE: you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL */ - -extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password)); -/* Same as unzOpenCurrentFile, but takes extra parameter password for encrypted files */ - -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); -/* Read bytes from the current file (opened by unzOpenCurrentFile) - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)); -extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)); -/* Get Info about the current file - - pfile_info if != NULL, the *pfile_info structure will contain somes info about the current file - filename if != NULL, the file name string will be copied in filename - filename_size is the size of the filename buffer - extrafield if != NULL, the extra field information from the central header will be copied in to - extrafield_size is the size of the extraField buffer - comment if != NULL, the comment string of the file will be copied in to - comment_size is the size of the comment buffer */ - -extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); - -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); -/* Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf == NULL, it return the size of the local extra field - if buf != NULL, len is the size of the buffer, the extra header is copied in buf. - - return number of bytes copied in buf, or (if <0) the error code */ - -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); -/* Close the file in zip opened with unzOpenCurrentFile - - return UNZ_CRCERROR if all the file was read but the CRC is not good */ - -/***************************************************************************/ -/* Browse the directory of the zipfile */ - -typedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2); -typedef int (*unzIteratorFunction)(unzFile file); -typedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size); - -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); -/* Set the current file of the zipfile to the first file. - - return UNZ_OK if no error */ - -extern int ZEXPORT unzGoToFirstFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)); -/* Set the current file of the zipfile to the first file and retrieves the current info on success. - Not as seek intensive as unzGoToFirstFile + unzGetCurrentFileInfo. - - return UNZ_OK if no error */ - -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); -/* Set the current file of the zipfile to the next file. - - return UNZ_OK if no error - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */ - -extern int ZEXPORT unzGoToNextFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename, - uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)); -/* Set the current file of the zipfile to the next file and retrieves the current - info on success. Does less seeking around than unzGotoNextFile + unzGetCurrentFileInfo. - - return UNZ_OK if no error - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */ - -extern int ZEXPORT unzLocateFile OF((unzFile file, const char *filename, unzFileNameComparer filename_compare_func)); -/* Try locate the file szFileName in the zipfile. For custom filename comparison pass in comparison function. - - return UNZ_OK if the file is found (it becomes the current file) - return UNZ_END_OF_LIST_OF_FILE if the file is not found */ - -/***************************************************************************/ -/* Raw access to zip file */ - -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; /* offset in zip file directory */ - uLong num_of_file; /* # of file */ -} unz_file_pos; - -extern int ZEXPORT unzGetFilePos OF((unzFile file, unz_file_pos* file_pos)); -extern int ZEXPORT unzGoToFilePos OF((unzFile file, unz_file_pos* file_pos)); - -typedef struct unz64_file_pos_s -{ - ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ - ZPOS64_T num_of_file; /* # of file */ -} unz64_file_pos; - -extern int ZEXPORT unzGetFilePos64 OF((unzFile file, unz64_file_pos* file_pos)); -extern int ZEXPORT unzGoToFilePos64 OF((unzFile file, const unz64_file_pos* file_pos)); - -extern uLong ZEXPORT unzGetOffset OF((unzFile file)); -extern ZPOS64_T ZEXPORT unzGetOffset64 OF((unzFile file)); -/* Get the current file offset */ - -extern int ZEXPORT unzSetOffset OF((unzFile file, uLong pos)); -extern int ZEXPORT unzSetOffset64 OF((unzFile file, ZPOS64_T pos)); -/* Set the current file offset */ - -extern z_off_t ZEXPORT unztell OF((unzFile file)); -extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); -/* return current position in uncompressed data */ - -extern int ZEXPORT unzseek OF((unzFile file, z_off_t offset, int origin)); -extern int ZEXPORT unzseek64 OF((unzFile file, ZPOS64_T offset, int origin)); -/* Seek within the uncompressed data if compression method is storage */ - -extern int ZEXPORT unzeof OF((unzFile file)); -/* return 1 if the end of file was reached, 0 elsewhere */ - -/***************************************************************************/ - -#ifdef __cplusplus -} -#endif - -#endif /* _UNZ_H */ diff --git a/package_installer.c b/package_installer.c index ed9cf19..8b540a5 100644 --- a/package_installer.c +++ b/package_installer.c @@ -318,7 +318,7 @@ int install_thread(SceSize args_size, InstallArguments *args) { if (SCE_S_ISDIR(stat.st_mode)) { // Check for param.sfo - snprintf(path, MAX_PATH_LENGTH, "%s/sce_sys/param.sfo", args->file); + snprintf(path, MAX_PATH_LENGTH - 1, "%s/sce_sys/param.sfo", args->file); if (sceIoGetstat(path, &stat) < 0 || SCE_S_ISDIR(stat.st_mode)) { closeWaitDialog(); errorDialog(-2); @@ -326,7 +326,7 @@ int install_thread(SceSize args_size, InstallArguments *args) { } // Check permissions - snprintf(path, MAX_PATH_LENGTH, "%s/eboot.bin", args->file); + snprintf(path, MAX_PATH_LENGTH - 1, "%s/eboot.bin", args->file); SceUID fd = sceIoOpen(path, SCE_O_RDONLY, 0); if (fd >= 0) { char buffer[0x88]; @@ -388,7 +388,7 @@ int install_thread(SceSize args_size, InstallArguments *args) { } // Check for param.sfo - snprintf(path, MAX_PATH_LENGTH, "%s/sce_sys/param.sfo", args->file); + snprintf(path, MAX_PATH_LENGTH - 1, "%s/sce_sys/param.sfo", args->file); if (archiveFileGetstat(path, NULL) < 0) { closeWaitDialog(); errorDialog(-2); diff --git a/photo.c b/photo.c index 258d14d..4c0d9ee 100644 --- a/photo.c +++ b/photo.c @@ -224,7 +224,7 @@ int photoViewer(const char *file, int type, FileList *list, FileListEntry *entry if (!entry->is_folder) { char path[MAX_PATH_LENGTH]; - snprintf(path, MAX_PATH_LENGTH, "%s%s", list->path, entry->name); + snprintf(path, MAX_PATH_LENGTH - 1, "%s%s", list->path, entry->name); int type = getFileType(path); if (type == FILE_TYPE_BMP || type == FILE_TYPE_JPEG || type == FILE_TYPE_PNG) { vita2d_wait_rendering_done(); diff --git a/property_dialog.c b/property_dialog.c index 5a62773..e130b6e 100644 --- a/property_dialog.c +++ b/property_dialog.c @@ -64,7 +64,7 @@ PropertyEntry property_entries[] = { { PROPERTY_TYPE, PROPERTY_ENTRY_VISIBLE, property_type, sizeof(property_type) }, { PROPERTY_FSELF_MODE, PROPERTY_ENTRY_VISIBLE, property_fself_mode, sizeof(property_fself_mode) }, { PROPERTY_SIZE, PROPERTY_ENTRY_VISIBLE, property_size, sizeof(property_size) }, - { PROPERTY_COMPRESSED_SIZE, PROPERTY_ENTRY_VISIBLE, property_compressed_size, sizeof(property_compressed_size) }, + // { PROPERTY_COMPRESSED_SIZE, PROPERTY_ENTRY_VISIBLE, property_compressed_size, sizeof(property_compressed_size) }, { PROPERTY_CONTAINS, PROPERTY_ENTRY_VISIBLE, property_contains, sizeof(property_contains) }, { -1, PROPERTY_ENTRY_UNUSED, NULL }, { PROPERTY_CREATION_DATE, PROPERTY_ENTRY_VISIBLE, property_creation_date, sizeof(property_creation_date) }, @@ -76,7 +76,7 @@ enum PropertyEntries { PROPERTY_ENTRY_TYPE, PROPERTY_ENTRY_FSELF_MODE, PROPERTY_ENTRY_SIZE, - PROPERTY_ENTRY_COMPRESSED_SIZE, + // PROPERTY_ENTRY_COMPRESSED_SIZE, PROPERTY_ENTRY_CONTAINS, PROPERTY_ENTRY_EMPTY_1, PROPERTY_ENTRY_CREATION_DATE, @@ -287,18 +287,18 @@ int initPropertyDialog(char *path, FileListEntry *entry) { property_entries[PROPERTY_ENTRY_CONTAINS].visibility = PROPERTY_ENTRY_VISIBLE; } - property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_INVISIBLE; + // property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_INVISIBLE; } else { getSizeString(property_size, entry->size); property_entries[PROPERTY_ENTRY_CONTAINS].visibility = PROPERTY_ENTRY_INVISIBLE; - + /* // Compressed size if (isInArchive()) { getSizeString(property_compressed_size, entry->size2); property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_VISIBLE; } else { property_entries[PROPERTY_ENTRY_COMPRESSED_SIZE].visibility = PROPERTY_ENTRY_INVISIBLE; - } + }*/ } // Dates diff --git a/refresh.c b/refresh.c index 283cf84..f2cd59e 100644 --- a/refresh.c +++ b/refresh.c @@ -199,7 +199,7 @@ void app_callback(void* data, const char* dir, const char* subdir) return; if (refresh_data->refresh_pass) { - snprintf(path, MAX_PATH_LENGTH, "%s/%s", dir, subdir); + snprintf(path, MAX_PATH_LENGTH - 1, "%s/%s", dir, subdir); if (refreshNeeded(path)) { // Move the directory to temp for installation removePath(APP_TEMP, NULL); @@ -226,7 +226,7 @@ void dlc_callback_inner(void* data, const char* dir, const char* subdir) return; if (dlc_data->refresh_data->refresh_pass) { - snprintf(path, MAX_PATH_LENGTH, "%s/%s", dir, subdir); + snprintf(path, MAX_PATH_LENGTH - 1, "%s/%s", dir, subdir); if (dlc_data->list_size < MAX_DLC_PER_TITLE) dlc_data->list[dlc_data->list_size++] = strdup(path); } else { @@ -252,7 +252,7 @@ void dlc_callback_outer(void* data, const char* dir, const char* subdir) // 2. Refresh the moved dlc_data for (int i = 0; i < dlc_data.list_size; i++) { if (refreshNeeded(dlc_data.list[i])) { - snprintf(path, MAX_PATH_LENGTH, DLC_TEMP "/%s", &dlc_data.list[i][len + 1]); + snprintf(path, MAX_PATH_LENGTH - 1, DLC_TEMP "/%s", &dlc_data.list[i][len + 1]); removePath(path, NULL); sceIoRename(dlc_data.list[i], path); } else { @@ -265,7 +265,7 @@ void dlc_callback_outer(void* data, const char* dir, const char* subdir) // Now that the dlc we need are out of addcont/title_id, refresh them for (int i = 0; i < dlc_data.list_size; i++) { if (dlc_data.list[i] != NULL) { - snprintf(path, MAX_PATH_LENGTH, DLC_TEMP "/%s", &dlc_data.list[i][len + 1]); + snprintf(path, MAX_PATH_LENGTH - 1, DLC_TEMP "/%s", &dlc_data.list[i][len + 1]); if (refreshApp(path) == 1) refresh_data->refreshed++; else diff --git a/theme.c b/theme.c index f738253..5e8a8c6 100644 --- a/theme.c +++ b/theme.c @@ -241,16 +241,16 @@ void loadTheme() { if (theme_name) { // Load colors config - snprintf(path, MAX_PATH_LENGTH, "ux0:VitaShell/theme/%s/colors.txt", theme_name); + snprintf(path, MAX_PATH_LENGTH - 1, "ux0:VitaShell/theme/%s/colors.txt", theme_name); readConfig(path, colors_entries, sizeof(colors_entries) / sizeof(ConfigEntry)); // Font - snprintf(path, MAX_PATH_LENGTH, "ux0:VitaShell/theme/%s/font.pgf", theme_name); + snprintf(path, MAX_PATH_LENGTH - 1, "ux0:VitaShell/theme/%s/font.pgf", theme_name); font = vita2d_load_custom_pgf(path); // Load theme for (i = 0; i < N_THEME_IMAGES; i++) { - snprintf(path, MAX_PATH_LENGTH, "ux0:VitaShell/theme/%s/%s", theme_name, theme_images[i].name); + snprintf(path, MAX_PATH_LENGTH - 1, "ux0:VitaShell/theme/%s/%s", theme_name, theme_images[i].name); if (theme_images[i].texture && *(theme_images[i].texture) == NULL) *(theme_images[i].texture) = vita2d_load_PNG_file(path); } diff --git a/unrarlib/unrar_c_wrapper.h b/unrarlib/unrar_c_wrapper.h deleted file mode 100644 index 04cff39..0000000 --- a/unrarlib/unrar_c_wrapper.h +++ /dev/null @@ -1,155 +0,0 @@ -#include - -#ifndef _UNRAR_C_WRAPPER_H_INC -#define _UNRAR_C_WRAPPER_H_INC - -#define ERAR_SUCCESS 0 -#define ERAR_END_ARCHIVE 10 -#define ERAR_NO_MEMORY 11 -#define ERAR_BAD_DATA 12 -#define ERAR_BAD_ARCHIVE 13 -#define ERAR_UNKNOWN_FORMAT 14 -#define ERAR_EOPEN 15 -#define ERAR_ECREATE 16 -#define ERAR_ECLOSE 17 -#define ERAR_EREAD 18 -#define ERAR_EWRITE 19 -#define ERAR_SMALL_BUF 20 -#define ERAR_UNKNOWN 21 -#define ERAR_MISSING_PASSWORD 22 -#define ERAR_EREFERENCE 23 -#define ERAR_BAD_PASSWORD 24 - -#define RAR_OM_LIST 0 -#define RAR_OM_EXTRACT 1 -#define RAR_OM_LIST_INCSPLIT 2 - -#define RAR_SKIP 0 -#define RAR_TEST 1 -#define RAR_EXTRACT 2 - -#define RAR_VOL_ASK 0 -#define RAR_VOL_NOTIFY 1 - -#define RAR_DLL_VERSION 6 - -#define RAR_HASH_NONE 0 -#define RAR_HASH_CRC32 1 -#define RAR_HASH_BLAKE2 2 - - -#ifdef _UNIX -#define CALLBACK -#define PASCAL -#define LONG long -#define HANDLE void * -#define LPARAM long -#define UINT unsigned int -#endif - -#define RHDF_SPLITBEFORE 0x01 -#define RHDF_SPLITAFTER 0x02 -#define RHDF_ENCRYPTED 0x04 -#define RHDF_SOLID 0x10 -#define RHDF_DIRECTORY 0x20 - - -struct RARHeaderData -{ - char ArcName[260]; - char FileName[260]; - unsigned int Flags; - unsigned int PackSize; - unsigned int UnpSize; - unsigned int HostOS; - unsigned int FileCRC; - unsigned int FileTime; - unsigned int UnpVer; - unsigned int Method; - unsigned int FileAttr; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; -}; - - -struct RARHeaderDataEx -{ - char ArcName[1024]; - wchar_t ArcNameW[1024]; - char FileName[1024]; - wchar_t FileNameW[1024]; - unsigned int Flags; - unsigned int PackSize; - unsigned int PackSizeHigh; - unsigned int UnpSize; - unsigned int UnpSizeHigh; - unsigned int HostOS; - unsigned int FileCRC; - unsigned int FileTime; - unsigned int UnpVer; - unsigned int Method; - unsigned int FileAttr; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; - unsigned int DictSize; - unsigned int HashType; - char Hash[32]; - unsigned int Reserved[1014]; -}; - - -struct RAROpenArchiveData -{ - char *ArcName; - unsigned int OpenMode; - unsigned int OpenResult; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; -}; - -typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2); - -struct RAROpenArchiveDataEx -{ - char *ArcName; - wchar_t *ArcNameW; - unsigned int OpenMode; - unsigned int OpenResult; - char *CmtBuf; - unsigned int CmtBufSize; - unsigned int CmtSize; - unsigned int CmtState; - unsigned int Flags; - UNRARCALLBACK Callback; - LPARAM UserData; - unsigned int Reserved[28]; -}; - -enum UNRARCALLBACK_MESSAGES { - UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD,UCM_CHANGEVOLUMEW, - UCM_NEEDPASSWORDW -}; - -typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode); -typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size); - -extern HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData); -extern HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData); -extern int PASCAL RARCloseArchive(HANDLE hArcData); -extern int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *HeaderData); -extern int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData); -extern int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName, bool TestMode); -extern int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar_t *DestPath,wchar_t *DestName, bool TestMode); -extern void PASCAL RARSetCallback(HANDLE hArcData,UNRARCALLBACK Callback,LPARAM UserData); -extern void PASCAL RARSetChangeVolProc(HANDLE hArcData,CHANGEVOLPROC ChangeVolProc); -extern void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataProc); -extern void PASCAL RARSetPassword(HANDLE hArcData,char *Password); -extern int PASCAL RARGetDllVersion(); - -#endif diff --git a/unrarlib/unrarlibutils.c b/unrarlib/unrarlibutils.c deleted file mode 100644 index 000d961..0000000 --- a/unrarlib/unrarlibutils.c +++ /dev/null @@ -1,275 +0,0 @@ -#include "unrarlibutils.h" - -int getcwd() { - return 0; -} - -int fsync() { - return 0; -} - -static void *rar_open(const char *filename, unsigned int om) { - struct RAROpenArchiveData arc_open; - arc_open.ArcName = (char*)filename; - arc_open.OpenMode = om; - arc_open.CmtBuf = NULL; - HANDLE rar_file = RAROpenArchive(&arc_open); - if (arc_open.OpenResult != 0) { - return NULL; - } - return rar_file; -} - -ArchiveFileNode *createNode(const char *name) { - ArchiveFileNode *node = malloc(sizeof(ArchiveFileNode)); - node->nodeName = malloc((strlen(name) + 2) *sizeof(char)); - strcpy(node->nodeName, name); - node->childCount = 0; - node->childPt = NULL; - node->fatherPt = NULL; - node->maxCount = 0; - return node; -} - -void add_node(ArchiveFileNode *father, ArchiveFileNode *child) { - uint32_t count = father->childCount; - if( (count + 1) > father->maxCount ) { - if(father->maxCount == 0) { - father->maxCount = 16; - father->childPt = malloc(16 *sizeof(void*)); - } else { - void *n_ptr = realloc((void*)father->childPt,2 *father->maxCount *sizeof(void*)); - if(n_ptr) { - father->childPt = n_ptr; - father->maxCount *= 2; - } - } - } - father->childPt[count] = (void*)child; - father->childCount++; - - child->fatherPt = father; -} - -ArchiveFileNode *getChildNodeByName(ArchiveFileNode *node, const char *name) { - if(node->childCount <= 0 ) - return NULL; - uint32_t i; - for(i = 0; i < node->childCount; i++) { - ArchiveFileNode *_n = (ArchiveFileNode*)(node->childPt[i]); - if(strcmp(_n->nodeName,name) == 0) { - return _n; - } - } - return NULL; -} - -void free_node(ArchiveFileNode *node) { - uint32_t count = node->childCount; - int i = 0; - - for(; i < count; i++) { - ArchiveFileNode *_n = (ArchiveFileNode*)(node->childPt[i]); - free_node(_n); - } - if(node->childPt != NULL) { - free(node->childPt); - } - if(node->nodeName != NULL) { - free(node->nodeName); - } - free(node); -} - -void parse_path(const char *name, struct filelayer *layer) { - char *p; - char _name[RARMAX_FILENAME]; - strcpy(_name, name); - uint32_t depth = 0; - while(1) { - p = strrchr(_name, '/'); - if(!p) - break; - strcpy(&(layer->name[depth][0]), p + sizeof(char)); - layer->depth = ++depth; - *p = '\0'; - } - strcpy(&(layer->name[depth][0]), _name); -} - -ArchiveFileNode *openRARFile(const char *filename) { - ArchiveFileNode *root = createNode("root"); - HANDLE RARFile = rar_open(filename,RAR_OM_LIST); - if(!RARFile) { - free_node(root); - return NULL; - } - - struct RARHeaderData data; - while (!RARReadHeader(RARFile, &data)) { - struct filelayer layer = {0}; - parse_path(data.FileName,&layer); - ArchiveFileNode *_up = root; - int i = layer.depth; - for(; i > 0; i--) { - ArchiveFileNode *father = getChildNodeByName(_up, &(layer.name[i][0])); - if(!father) { - father = createNode(&(layer.name[i][0])); - add_node(_up,father); - } - _up = father; - } - ArchiveFileNode *filenode = getChildNodeByName(_up,&(layer.name[0][0])); - - if(!filenode) { - filenode = createNode(&(layer.name[0][0])); - add_node(_up, filenode); - } - - filenode->data = data; - - RARProcessFile(RARFile, RAR_SKIP,NULL,NULL,false); - } - - RARCloseArchive(RARFile); - return root; -} - -int extractToMem(struct ExtractHeader *header, char *extractBuffer, uint64_t bufferSize) { - if(header->offset >= header->bufferSize) - return -1; - - if((header->offset + bufferSize) > header->bufferSize) - bufferSize = (header->bufferSize - header->offset);//no enough memory - - memcpy((header->memPtr + header->offset),extractBuffer,bufferSize); - header->offset += bufferSize; - return 1; -} - -int extractToFile(struct ExtractHeader *header, char *extractBuffer, uint64_t bufferSize) { - if(!header->file) - return -1; - - FileProcessParam *param = header->param; - if (param) { - if (param->value) - (*param->value) += bufferSize; - - if (param->SetProgress) - param->SetProgress(param->value ? *param->value : 0, param->max); - - if (param->cancelHandler && param->cancelHandler()) { - return -1; - } - } - - sceIoLseek(header->file,header->offset,SCE_SEEK_SET); - sceIoWrite(header->file,extractBuffer,bufferSize); - header->offset += bufferSize; - - - return 1; -} - -static int CALLBACK rarCallback(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2) { - struct ExtractHeader *header; - int rtn = 1; - switch(msg) { - case UCM_CHANGEVOLUME: - if(P2 != RAR_VOL_NOTIFY) { - rtn = -1; - } - break; - case UCM_PROCESSDATA: - header = (struct ExtractHeader*)UserData; - if(header->memPtr) - extractToMem(header,(char*)P1,P2); - else - rtn = extractToFile(header,(char*)P1,P2); - break; - default: - rtn = -1; - break; - } - return rtn; -} - -int extractRAR(const char *path, const char *filename, struct ExtractHeader *header) { - - HANDLE RARFile = rar_open(path,RAR_OM_EXTRACT); - if(!RARFile) - return -1; - - struct RARHeaderData data; - int rtn = -1; - while (!RARReadHeader(RARFile, &data)) { - if(!(strcmp(data.FileName,filename))) { - rtn = 1; - break; - } - RARProcessFile(RARFile, RAR_SKIP,NULL,NULL,false); - } - - if(rtn > 0) { - RARSetCallback(RARFile,rarCallback,(LPARAM)header); - int result = RARProcessFile(RARFile, RAR_TEST,NULL,NULL,false); - if(result >= 0) - rtn = 1; - else if(result == -2) - rtn = 0; - } - - RARCloseArchive(RARFile); - return rtn; -} - -ArchiveFileNode *getFileNodeFromFilePath(ArchiveFileNode *root,const char *filepath) { - struct filelayer layer = {0}; - parse_path(filepath,&layer); - int i = layer.depth; - ArchiveFileNode *_up = root; - - for(; i > 0; i--) { - _up = getChildNodeByName(_up, &(layer.name[i][0])); - if(!_up) - return NULL; - } - - return getChildNodeByName(_up,&(layer.name[0][0])); -} - -int getRARArchiveNodeInfo(ArchiveFileNode *root, uint64_t *size, uint32_t *folders, uint32_t *files) { - if(root->childCount > 0) { - uint32_t count = root->childCount; - int i = 0; - for(; i < count; i++) { - ArchiveFileNode *_n = (ArchiveFileNode*)(root->childPt[i]); - getRARArchiveNodeInfo(_n,size,folders,files); - } - } - if(root->data.Flags == 0x20) { - if(folders) - (*folders)++; - } else { - if(size) - (*size) += root->data.UnpSize; - if(files) - (*files) ++; - } - - return 1; -} - -ArchiveFileNode *getFloderNodeFromPath(ArchiveFileNode *root,const char *path) { - uint32_t pathlen = strlen(path); - char temp[pathlen]; - strcpy(temp,path); - temp[pathlen - 1] ='\0'; - return getFileNodeFromFilePath(root,temp); -} - - -void closeRARFile(ArchiveFileNode *root) { - free_node(root); -} diff --git a/unrarlib/unrarlibutils.h b/unrarlib/unrarlibutils.h deleted file mode 100644 index a799a22..0000000 --- a/unrarlib/unrarlibutils.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef UNRARLIBUTILS_H_INC -#define UNRARLIBUTILS_H_INC - -#include -#include -#include -#include -#include - -#include "../file.h" - -#define _UNIX -#include "unrar_c_wrapper.h" - -#define RARMAX_HIERARCHY 32//max hierarchy for folder -#define RARMAX_FILENAME 262 - - -typedef struct { - char *nodeName; - void *fatherPt; - void* *childPt; - uint32_t childCount; - uint32_t maxCount; - struct RARHeaderData data; -} ArchiveFileNode; - -struct filelayer { - uint32_t depth; - char name[RARMAX_HIERARCHY][RARMAX_FILENAME]; -}; - -struct ExtractHeader { - SceUID file; - uint64_t offset; - char *memPtr; - uint64_t bufferSize; - FileProcessParam *param; -}; - - -ArchiveFileNode *openRARFile(const char *filename);//returns the number of files in the rar document archive -void closeRARFile(ArchiveFileNode *root); -ArchiveFileNode *createNode(const char *name); -ArchiveFileNode *getChildNodeByName(ArchiveFileNode *node, const char *name); -int extractRAR(const char *path, const char *filename, struct ExtractHeader *header); -ArchiveFileNode *getFileNodeFromFilePath(ArchiveFileNode *root, const char *filepath); -int getRARArchiveNodeInfo(ArchiveFileNode *root, uint64_t *size, uint32_t *folders, uint32_t *files); -void free_node(ArchiveFileNode *node); -ArchiveFileNode *getFloderNodeFromPath(ArchiveFileNode *root, const char *path); - -#endif // UNRARLIBUTILS_H_INC