From f7988de8279051f3d2d7973b8d7f2116aa5d9317 Mon Sep 17 00:00:00 2001 From: Greg Dennis Date: Fri, 1 Jun 2018 13:07:38 -0400 Subject: Return non-zero status on ideviceinstaller errors Fixes: https://github.com/libimobiledevice/ideviceinstaller/issues/96--- src/ideviceinstaller.c | 124 +++++++++++++++++++++++++++++++------------------ 1 file changed, 79 insertions(+), 45 deletions(-) diff --git a/src/ideviceinstaller.c b/src/ideviceinstaller.c index f45326f..5709b58 100644 --- a/src/ideviceinstaller.c +++ b/src/ideviceinstaller.c @@ -657,6 +657,7 @@ int main(int argc, char **argv) if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &client, "ideviceinstaller")) { fprintf(stderr, "Could not connect to lockdownd. Exiting.\n"); + res = -1; goto leave_cleanup; } @@ -665,6 +666,7 @@ int main(int argc, char **argv) &service) != LOCKDOWN_E_SUCCESS) || !service) { fprintf(stderr, "Could not start com.apple.mobile.notification_proxy!\n"); + res = -1; goto leave_cleanup; } @@ -677,6 +679,7 @@ int main(int argc, char **argv) if (nperr != NP_E_SUCCESS) { fprintf(stderr, "Could not connect to notification_proxy!\n"); + res = -1; goto leave_cleanup; } @@ -696,6 +699,7 @@ run_again: &service) != LOCKDOWN_E_SUCCESS) || !service) { fprintf(stderr, "Could not start com.apple.mobile.installation_proxy!\n"); + res = -1; goto leave_cleanup; } @@ -708,6 +712,7 @@ run_again: if (err != INSTPROXY_E_SUCCESS) { fprintf(stderr, "Could not connect to installation_proxy!\n"); + res = -1; goto leave_cleanup; } @@ -760,6 +765,7 @@ run_again: if (!apps || (plist_get_node_type(apps) != PLIST_ARRAY)) { fprintf(stderr, "ERROR: instproxy_browse returnd an invalid plist!\n"); + res = -1; goto leave_cleanup; } @@ -785,6 +791,7 @@ run_again: instproxy_client_options_free(client_opts); if (err != INSTPROXY_E_SUCCESS) { fprintf(stderr, "ERROR: instproxy_browse returned %d\n", err); + res = -1; goto leave_cleanup; } @@ -804,6 +811,7 @@ run_again: if ((lockdownd_start_service(client, "com.apple.afc", &service) != LOCKDOWN_E_SUCCESS) || !service) { fprintf(stderr, "Could not start com.apple.afc!\n"); + res = -1; goto leave_cleanup; } @@ -812,11 +820,13 @@ run_again: if (afc_client_new(device, service, &afc) != AFC_E_SUCCESS) { fprintf(stderr, "Could not connect to AFC!\n"); + res = -1; goto leave_cleanup; } if (stat(appid, &fst) != 0) { fprintf(stderr, "ERROR: stat: %s: %s\n", appid, strerror(errno)); + res = -1; goto leave_cleanup; } @@ -845,6 +855,7 @@ run_again: zf = zip_open(appid, 0, &errp); if (!zf) { fprintf(stderr, "ERROR: zip_open: %s: %d\n", appid, errp); + res = -1; goto leave_cleanup; } @@ -917,6 +928,7 @@ run_again: afc_file_close(afc, af); zip_fclose(zfile); free(dstpath); + res = -1; goto leave_cleanup; } } @@ -940,6 +952,7 @@ run_again: if (asprintf(&pkgname, "%s/%s", PKG_PATH, basename(appid)) < 0) { fprintf(stderr, "ERROR: Out of memory allocating pkgname!?\n"); + res = -1; goto leave_cleanup; } @@ -947,55 +960,59 @@ run_again: afc_upload_dir(afc, appid, pkgname); printf("DONE.\n"); - /* extract the CFBundleIdentifier from the package */ - - /* construct full filename to Info.plist */ - char *filename = (char*)malloc(strlen(appid)+10+1); - strcpy(filename, appid); - strcat(filename, "/Info.plist"); - - struct stat st; - FILE *fp = NULL; - - if (stat(filename, &st) == -1 || (fp = fopen(filename, "r")) == NULL) { - fprintf(stderr, "ERROR: could not locate %s in app!\n", filename); - free(filename); - goto leave_cleanup; - } - size_t filesize = st.st_size; - char *ibuf = malloc(filesize * sizeof(char)); - size_t amount = fread(ibuf, 1, filesize, fp); - if (amount != filesize) { - fprintf(stderr, "ERROR: could not read %ld bytes from %s\n", filesize, filename); - free(filename); - goto leave_cleanup; - } - fclose(fp); - free(filename); - - plist_t info = NULL; - if (memcmp(ibuf, "bplist00", 8) == 0) { - plist_from_bin(ibuf, filesize, &info); - } else { - plist_from_xml(ibuf, filesize, &info); - } - free(ibuf); - - if (!info) { - fprintf(stderr, "ERROR: could not parse Info.plist!\n"); - goto leave_cleanup; - } - - plist_t bname = plist_dict_get_item(info, "CFBundleIdentifier"); - if (bname) { - plist_get_string_val(bname, &bundleidentifier); - } - plist_free(info); - info = NULL; + /* extract the CFBundleIdentifier from the package */ + + /* construct full filename to Info.plist */ + char *filename = (char*)malloc(strlen(appid)+10+1); + strcpy(filename, appid); + strcat(filename, "/Info.plist"); + + struct stat st; + FILE *fp = NULL; + + if (stat(filename, &st) == -1 || (fp = fopen(filename, "r")) == NULL) { + fprintf(stderr, "ERROR: could not locate %s in app!\n", filename); + free(filename); + res = -1; + goto leave_cleanup; + } + size_t filesize = st.st_size; + char *ibuf = malloc(filesize * sizeof(char)); + size_t amount = fread(ibuf, 1, filesize, fp); + if (amount != filesize) { + fprintf(stderr, "ERROR: could not read %ld bytes from %s\n", filesize, filename); + free(filename); + res = -1; + goto leave_cleanup; + } + fclose(fp); + free(filename); + + plist_t info = NULL; + if (memcmp(ibuf, "bplist00", 8) == 0) { + plist_from_bin(ibuf, filesize, &info); + } else { + plist_from_xml(ibuf, filesize, &info); + } + free(ibuf); + + if (!info) { + fprintf(stderr, "ERROR: could not parse Info.plist!\n"); + res = -1; + goto leave_cleanup; + } + + plist_t bname = plist_dict_get_item(info, "CFBundleIdentifier"); + if (bname) { + plist_get_string_val(bname, &bundleidentifier); + } + plist_free(info); + info = NULL; } else { zf = zip_open(appid, 0, &errp); if (!zf) { fprintf(stderr, "ERROR: zip_open: %s: %d\n", appid, errp); + res = -1; goto leave_cleanup; } @@ -1024,6 +1041,7 @@ run_again: if (zip_get_app_directory(zf, &app_directory_name)) { fprintf(stderr, "Unable to locate app directory in archive!\n"); + res = -1; goto leave_cleanup; } @@ -1039,6 +1057,7 @@ run_again: free(filename); zip_unchange_all(zf); zip_close(zf); + res = -1; goto leave_cleanup; } free(filename); @@ -1053,6 +1072,7 @@ run_again: fprintf(stderr, "Could not parse Info.plist!\n"); zip_unchange_all(zf); zip_close(zf); + res = -1; goto leave_cleanup; } @@ -1074,12 +1094,14 @@ run_again: fprintf(stderr, "Could not determine value for CFBundleExecutable!\n"); zip_unchange_all(zf); zip_close(zf); + res = -1; goto leave_cleanup; } char *sinfname = NULL; if (asprintf(&sinfname, "Payload/%s.app/SC_Info/%s.sinf", bundleexecutable, bundleexecutable) < 0) { fprintf(stderr, "Out of memory!?\n"); + res = -1; goto leave_cleanup; } free(bundleexecutable); @@ -1099,6 +1121,7 @@ run_again: pkgname = NULL; if (asprintf(&pkgname, "%s/%s", PKG_PATH, bundleidentifier) < 0) { fprintf(stderr, "Out of memory!?\n"); + res = -1; goto leave_cleanup; } @@ -1162,12 +1185,14 @@ run_again: err = instproxy_lookup_archives(ipc, NULL, &dict); if (err != INSTPROXY_E_SUCCESS) { fprintf(stderr, "ERROR: lookup_archives returned %d\n", err); + res = -1; goto leave_cleanup; } if (!dict) { fprintf(stderr, "ERROR: lookup_archives did not return a plist!?\n"); + res = -1; goto leave_cleanup; } @@ -1273,12 +1298,14 @@ run_again: if (stat(copy_path, &fst) != 0) { fprintf(stderr, "ERROR: stat: %s: %s\n", copy_path, strerror(errno)); free(copy_path); + res = -1; goto leave_cleanup; } if (!S_ISDIR(fst.st_mode)) { fprintf(stderr, "ERROR: '%s' is not a directory as expected.\n", copy_path); free(copy_path); + res = -1; goto leave_cleanup; } @@ -1290,6 +1317,7 @@ run_again: if ((lockdownd_start_service(client, "com.apple.afc", &service) != LOCKDOWN_E_SUCCESS) || !service) { fprintf(stderr, "Could not start com.apple.afc!\n"); free(copy_path); + res = -1; goto leave_cleanup; } @@ -1298,6 +1326,7 @@ run_again: if (afc_client_new(device, service, &afc) != AFC_E_SUCCESS) { fprintf(stderr, "Could not connect to AFC!\n"); + res = -1; goto leave_cleanup; } } @@ -1318,6 +1347,7 @@ run_again: if (err_occurred) { afc_client_free(afc); afc = NULL; + res = -1; goto leave_cleanup; } FILE *f = NULL; @@ -1326,6 +1356,7 @@ run_again: char *localfile = NULL; if (asprintf(&localfile, "%s/%s.ipa", copy_path, appid) < 0) { fprintf(stderr, "Out of memory!?\n"); + res = -1; goto leave_cleanup; } free(copy_path); @@ -1351,6 +1382,7 @@ run_again: fclose(f); free(remotefile); free(localfile); + res = -1; goto leave_cleanup; } @@ -1381,6 +1413,7 @@ run_again: fprintf(stderr, "ERROR: could not open '%s' on device for reading!\n", remotefile); free(remotefile); free(localfile); + res = -1; goto leave_cleanup; } @@ -1430,6 +1463,7 @@ run_again: options = NULL; if (LOCKDOWN_E_SUCCESS != lockdownd_client_new_with_handshake(device, &client, "ideviceinstaller")) { fprintf(stderr, "Could not connect to lockdownd. Exiting.\n"); + res = -1; goto leave_cleanup; } goto run_again; -- cgit v1.1-32-gdbae