summaryrefslogtreecommitdiffstats
path: root/src/restore.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/restore.c')
-rw-r--r--src/restore.c122
1 files changed, 48 insertions, 74 deletions
diff --git a/src/restore.c b/src/restore.c
index d354ac6..6fe1049 100644
--- a/src/restore.c
+++ b/src/restore.c
@@ -225,24 +225,23 @@ const char* restore_check_hardware_model(struct idevicerestore_client_t* client)
idevice_t device = NULL;
restored_client_t restore = NULL;
restored_error_t restore_error = RESTORE_E_SUCCESS;
- char* product_type = NULL;
irecv_device_t irecv_device = NULL;
restore_idevice_new(client, &device);
if (!device) {
- return product_type;
+ return NULL;
}
restore_error = restored_client_new(device, &restore, "idevicerestore");
if (restore_error != RESTORE_E_SUCCESS) {
idevice_free(device);
- return product_type;
+ return NULL;
}
if (restored_query_type(restore, NULL, NULL) != RESTORE_E_SUCCESS) {
restored_client_free(restore);
idevice_free(device);
- return product_type;
+ return NULL;
}
if (client->srnm == NULL) {
@@ -251,41 +250,32 @@ const char* restore_check_hardware_model(struct idevicerestore_client_t* client)
error("ERROR: Unable to get SerialNumber from restored\n");
restored_client_free(restore);
idevice_free(device);
- return product_type;
+ return NULL;
}
plist_get_string_val(node, &client->srnm);
info("INFO: device serial number is %s\n", client->srnm);
+ plist_free(node);
node = NULL;
}
restore_error = restored_get_value(restore, "HardwareModel", &node);
- if (restore_error != RESTORE_E_SUCCESS) {
- error("ERROR: Unable to get HardwareModel from restored\n");
- restored_client_free(restore);
- idevice_free(device);
- return product_type;
- }
-
restored_client_free(restore);
idevice_free(device);
- restore = NULL;
- device = NULL;
-
- if (!node || plist_get_node_type(node) != PLIST_STRING) {
- error("ERROR: Unable to get HardwareModel information\n");
- if (node)
- plist_free(node);
- return product_type;
+ if (restore_error != RESTORE_E_SUCCESS || !node || plist_get_node_type(node) != PLIST_STRING) {
+ error("ERROR: Unable to get HardwareModel from restored\n");
+ plist_free(node);
+ return NULL;
}
- plist_get_string_val(node, &model);
+ plist_get_string_val(node, &model);
irecv_devices_get_device_by_hardware_model(model, &irecv_device);
+ free(model);
if (irecv_device && irecv_device->product_type) {
return irecv_device->hardware_model;
}
- return product_type;
+ return NULL;
}
void restore_device_callback(const idevice_event_t* event, void* userdata) {
@@ -1141,7 +1131,6 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
uint64_t blob_size = 0;
int zerr = 0;
int zindex = -1;
- int size = 0;
struct zip_stat zstat;
struct zip_file* zfile = NULL;
struct zip* za = NULL;
@@ -1180,7 +1169,7 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
goto leave;
}
char* ext = strrchr(signfn, '.');
- if (strcmp(ext, ".fls") == 0) {
+ if (!strcmp(ext, ".fls")) {
is_fls = 1;
}
@@ -1202,30 +1191,29 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
goto leave;
}
- size = zstat.size;
- buffer = (unsigned char*) malloc(size+1);
+ buffer = (unsigned char*) malloc(zstat.size + 1);
if (buffer == NULL) {
error("ERROR: Out of memory\n");
goto leave;
}
- if (zip_fread(zfile, buffer, size) != size) {
+ if (zip_fread(zfile, buffer, zstat.size) != zstat.size) {
error("ERROR: zip_fread: failed\n");
goto leave;
}
- buffer[size] = '\0';
+ buffer[zstat.size] = '\0';
zip_fclose(zfile);
zfile = NULL;
if (is_fls) {
- fls = fls_parse(buffer, size);
+ fls = fls_parse(buffer, zstat.size);
if (!fls) {
error("ERROR: could not parse fls file\n");
goto leave;
}
} else {
- mbn = mbn_parse(buffer, size);
+ mbn = mbn_parse(buffer, zstat.size);
if (!mbn) {
error("ERROR: could not parse mbn file\n");
goto leave;
@@ -1256,15 +1244,17 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
free(blob);
blob = NULL;
+ fsize = (is_fls ? fls->size : mbn->size);
+ fdata = (unsigned char*)malloc(fsize);
+ if (fdata == NULL) {
+ error("ERROR: out of memory\n");
+ goto leave;
+ }
if (is_fls) {
- fsize = fls->size;
- fdata = (unsigned char*)malloc(fsize);
memcpy(fdata, fls->data, fsize);
fls_free(fls);
fls = NULL;
} else {
- fsize = mbn->size;
- fdata = (unsigned char*)malloc(fsize);
memcpy(fdata, mbn->data, fsize);
mbn_free(mbn);
mbn = NULL;
@@ -1273,6 +1263,7 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
zs = zip_source_buffer(za, fdata, fsize, 1);
if (!zs) {
error("ERROR: out of memory\n");
+ free(fdata);
goto leave;
}
@@ -1294,33 +1285,29 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
free(iter);
// remove everything but required files
- int i;
- int j;
- int skip = 0;
- int numf = zip_get_num_files(za);
+ int i, j, keep, numf = zip_get_num_files(za);
for (i = 0; i < numf; i++) {
- skip = 0;
+ keep = 0;
// check for signed file index
for (j = 0; j < signed_file_count; j++) {
if (i == signed_file_idxs[j]) {
- skip = 1;
+ keep = 1;
break;
}
}
// check for anything but .mbn and .fls if bb_nonce is set
- if (bb_nonce && !skip) {
+ if (bb_nonce && !keep) {
const char* fn = zip_get_name(za, i, 0);
if (fn) {
char* ext = strrchr(fn, '.');
if (ext && (!strcmp(ext, ".fls") || !strcmp(ext, ".mbn") || !strcmp(ext, ".elf") || !strcmp(ext, ".bin"))) {
- skip = 1;
+ keep = 1;
}
}
}
- if (skip) {
- continue;
+ if (!keep) {
+ zip_delete(za, i);
}
- zip_delete(za, i);
}
if (bb_nonce) {
@@ -1344,23 +1331,22 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
goto leave;
}
- size = zstat.size;
- buffer = (unsigned char*) malloc(size+1);
+ buffer = (unsigned char*) malloc(zstat.size + 1);
if (buffer == NULL) {
error("ERROR: Out of memory\n");
goto leave;
}
- if (zip_fread(zfile, buffer, size) != size) {
+ if (zip_fread(zfile, buffer, zstat.size) != zstat.size) {
error("ERROR: zip_fread: failed\n");
goto leave;
}
- buffer[size] = '\0';
+ buffer[zstat.size] = '\0';
zip_fclose(zfile);
zfile = NULL;
- fls = fls_parse(buffer, size);
+ fls = fls_parse(buffer, zstat.size);
free(buffer);
buffer = NULL;
if (!fls) {
@@ -1385,6 +1371,10 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
fsize = fls->size;
fdata = (unsigned char*)malloc(fsize);
+ if (!fdata) {
+ error("ERROR: out of memory\n");
+ goto leave;
+ }
memcpy(fdata, fls->data, fsize);
fls_free(fls);
fls = NULL;
@@ -1392,6 +1382,7 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
zs = zip_source_buffer(za, fdata, fsize, 1);
if (!zs) {
error("ERROR: out of memory\n");
+ free(fdata);
goto leave;
}
@@ -1434,12 +1425,6 @@ static int restore_sign_bbfw(const char* bbfwtmp, plist_t bbtss, const unsigned
zs = NULL;
leave:
- if (mbn) {
- mbn_free(mbn);
- }
- if (fls) {
- fls_free(fls);
- }
if (zfile) {
zip_fclose(zfile);
}
@@ -1450,12 +1435,10 @@ leave:
zip_unchange_all(za);
zip_close(za);
}
- if (buffer) {
- free(buffer);
- }
- if (blob) {
- free(blob);
- }
+ mbn_free(mbn);
+ fls_free(fls);
+ free(buffer);
+ free(blob);
return res;
}
@@ -1609,25 +1592,16 @@ int restore_send_baseband_data(restored_client_t restore, struct idevicerestore_
}
info("Done sending BasebandData\n");
- plist_free(dict);
- dict = NULL;
-
res = 0;
leave:
- if (dict) {
- plist_free(dict);
- }
- if (buffer) {
- free(buffer);
- }
+ plist_free(dict);
+ free(buffer);
if (bbfwtmp) {
remove(bbfwtmp);
free(bbfwtmp);
}
- if (response) {
- plist_free(response);
- }
+ plist_free(response);
return res;
}