summaryrefslogtreecommitdiffstats
path: root/src/ideviceinstaller.c
diff options
context:
space:
mode:
authorGravatar Martin Szulecki2012-08-25 00:17:40 +0200
committerGravatar Martin Szulecki2012-08-25 00:17:40 +0200
commit60cf6780c399f71751b4748bcca84c41f1a0b722 (patch)
tree36029ba814fab041cb6f945438b6210fd0abbdd6 /src/ideviceinstaller.c
parent1086db865ee04febf929f0708e7428fda45f38db (diff)
downloadideviceinstaller-60cf6780c399f71751b4748bcca84c41f1a0b722.tar.gz
ideviceinstaller-60cf6780c399f71751b4748bcca84c41f1a0b722.tar.bz2
Improve detection of Info.plist in application archive
Some applications appear to provide another Info.plist. Using zip_name_locate() might locate the wrong one in such a case which prevented the correct installation of the application.
Diffstat (limited to 'src/ideviceinstaller.c')
-rw-r--r--src/ideviceinstaller.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/ideviceinstaller.c b/src/ideviceinstaller.c
index 8f5ec5e..bde9d97 100644
--- a/src/ideviceinstaller.c
+++ b/src/ideviceinstaller.c
@@ -631,7 +631,24 @@ run_again:
plist_t info = NULL;
zbuf = NULL;
len = 0;
- if (zip_get_contents(zf, "Info.plist", ZIP_FL_NODIR, &zbuf, &len) < 0) {
+ char filename[256];
+
+ /* check for "Payload" directory */
+ strcpy(filename, zip_get_name(zf, 0, 0));
+ if (strcmp(filename, "Payload") != 0) {
+ fprintf(stderr, "Unable to locate Payload folder in archive!\n");
+ zip_unchange_all(zf);
+ zip_close(zf);
+ goto leave_cleanup;
+ }
+
+ /* check for "*.app" directory */
+ strcpy(filename, zip_get_name(zf, 1, 0));
+
+ /* construct full filename to Info.plist */
+ strcat(filename, "Info.plist");
+
+ if (zip_get_contents(zf, filename, 0, &zbuf, &len) < 0) {
zip_unchange_all(zf);
zip_close(zf);
goto leave_cleanup;