From 17389b83af2faa217cec09a8fd6cec906525c1fe Mon Sep 17 00:00:00 2001 From: "p.kosyh" Date: Fri, 4 Jun 2010 07:27:10 +0000 Subject: [PATCH] More clever extract from zip --- src/sdl-instead/game.c | 20 ++++++++++++++------ src/sdl-instead/main.c | 9 ++++++++- src/sdl-instead/unpack.c | 34 ++++++++++++++++++++++++---------- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/sdl-instead/game.c b/src/sdl-instead/game.c index 2158a91..5fc05a7 100644 --- a/src/sdl-instead/game.c +++ b/src/sdl-instead/game.c @@ -2375,14 +2375,14 @@ int game_from_disk(void) #ifdef _USE_UNPACK p = game_local_games_path(1); fprintf(stderr,"Trying to install: %s\n", g); - if (!unpack(g, p) && zip_game_dirname[0]) { - if (games_replace(p, zip_game_dirname)) { - p = getpath(p, zip_game_dirname); - remove_dir(p); - free(p); + if (!unpack(g, p)) { + if (!zip_game_dirname[0]) return -1; - } + if (games_replace(p, zip_game_dirname)) + goto clean; p = zip_game_dirname; + } else if (zip_game_dirname[0]) { /* error, needs to clean */ + goto clean; #else if (0) { #endif @@ -2395,6 +2395,14 @@ int game_from_disk(void) game_error(p); } return 0; +#ifdef _USE_UNPACK +clean: + p = getpath(p, zip_game_dirname); + fprintf(stderr, "Cleaning: '%s'...\n", p); + remove_dir(p); + free(p); + return -1; +#endif } int game_loop(void) diff --git a/src/sdl-instead/main.c b/src/sdl-instead/main.c index 15e1971..cd52375 100644 --- a/src/sdl-instead/main.c +++ b/src/sdl-instead/main.c @@ -30,8 +30,15 @@ static int setup_zip(const char *file, char *p) if (!p) return -1; fprintf(stderr,"Trying to install: %s\n", file); - if (unpack(file, p)) + if (unpack(file, p)) { + if (zip_game_dirname[0]) { + p = getpath(p, zip_game_dirname); + fprintf(stderr, "Cleaning: '%s'...\n", p); + remove_dir(p); + free(p); + } return -1; + } game_sw = zip_game_dirname; games_sw = p; return 0; diff --git a/src/sdl-instead/unpack.c b/src/sdl-instead/unpack.c index ff745eb..b926f1e 100644 --- a/src/sdl-instead/unpack.c +++ b/src/sdl-instead/unpack.c @@ -38,6 +38,7 @@ #endif #include "unzip.h" +#include "util.h" #define CASESENSITIVITY (0) #define WRITEBUFFERSIZE (8192) @@ -191,19 +192,24 @@ const char *password; } if ((*filename_withoutpath) == '\0') { + if (zip_game_dirname[0] && strncmp(zip_game_dirname, + filename_inzip, strlen(zip_game_dirname))) { + err = -1; + fprintf(stderr, "Too many dirs in zip...\n"); + goto out; + } printf("creating directory: %s\n", filename_inzip); mymkdir(filename_inzip); - if (!*zip_game_dirname) { - int s = strlen(filename_inzip); - if (s && (filename_inzip[s - 1] == '/' || filename_inzip[s - 1] == '\\')) - s --; - memcpy(zip_game_dirname, filename_inzip, s); - zip_game_dirname[s] = 0; - } + if (!*zip_game_dirname) + strcpy(zip_game_dirname, filename_inzip); } else { const char *write_filename; int skip = 0; - + if (!*zip_game_dirname) { + err = -1; + fprintf(stderr, "No dir in zip...\n"); + goto out; + } write_filename = filename_inzip; err = unzOpenCurrentFilePassword(uf, password); @@ -271,6 +277,14 @@ const char *password; unzCloseCurrentFile(uf); /* don't lose the error */ } + if (*zip_game_dirname) { + int s = strlen(zip_game_dirname); + unix_path(zip_game_dirname); + if (s && (zip_game_dirname[s - 1] == '/')) + s --; + zip_game_dirname[s] = 0; + } +out: free(buf); return err; } @@ -288,7 +302,7 @@ const char *password; for (i = 0; i < gi.number_entry; i++) { if (do_extract_currentfile(uf, password) != UNZ_OK) - break; + return -1; if ((i + 1) < gi.number_entry) { err = unzGoToNextFile(uf); @@ -296,7 +310,7 @@ const char *password; printf ("error %d with zipfile in unzGoToNextFile\n", err); - break; + return -1; } } }