summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/restore.c16
-rw-r--r--src/restore.h2
2 files changed, 11 insertions, 7 deletions
diff --git a/src/restore.c b/src/restore.c
index cdbd791..d2611a5 100644
--- a/src/restore.c
+++ b/src/restore.c
@@ -1109,7 +1109,7 @@ int restore_send_component(restored_client_t restore, struct idevicerestore_clie
return 0;
}
-int restore_send_nor(restored_client_t restore, struct idevicerestore_client_t* client, plist_t build_identity)
+int restore_send_nor(restored_client_t restore, struct idevicerestore_client_t* client, plist_t build_identity, plist_t message)
{
char* llb_path = NULL;
char* llb_filename = NULL;
@@ -1127,9 +1127,15 @@ int restore_send_nor(restored_client_t restore, struct idevicerestore_client_t*
unsigned char* nor_data = NULL;
plist_t norimage = NULL;
plist_t firmware_files = NULL;
+ int flash_version_1 = 0;
info("About to send NORData...\n");
+ plist_t arguments = plist_dict_get_item(message, "Arguments");
+ if (arguments && plist_get_node_type(arguments) == PLIST_DICT) {
+ flash_version_1 = plist_dict_get_item(arguments, "FlashVersion1") ? 1 : 0;
+ }
+
if (client->tss) {
if (tss_response_get_path_by_entry(client->tss, "LLB", &llb_path) < 0) {
debug("NOTE: Could not get LLB path from TSS data, will fetch from build identity\n");
@@ -1249,9 +1255,7 @@ int restore_send_nor(restored_client_t restore, struct idevicerestore_client_t*
plist_dict_set_item(dict, "LlbImageData", plist_new_data((char*)llb_data, (uint64_t) llb_size));
free(llb_data);
- if (client->build_major >= 20) {
- // Starting with M1 macs, it seems that NorImageData is now a dict.
- // Sending an array like previous versions results in restore success but the machine will SOS after rebooting.
+ if (flash_version_1) {
norimage = plist_new_dict();
} else {
norimage = plist_new_array();
@@ -1307,7 +1311,7 @@ int restore_send_nor(restored_client_t restore, struct idevicerestore_client_t*
component_data = NULL;
component_size = 0;
- if (client->build_major >= 20) {
+ if (flash_version_1) {
plist_dict_set_item(norimage, component, plist_new_data((char*)nor_data, (uint64_t)nor_size));
} else {
/* make sure iBoot is the first entry in the array */
@@ -3633,7 +3637,7 @@ int restore_handle_data_request_msg(struct idevicerestore_client_t* client, idev
else if (!strcmp(type, "NORData")) {
if((client->flags & FLAG_EXCLUDE) == 0) {
- if(restore_send_nor(restore, client, build_identity) < 0) {
+ if(restore_send_nor(restore, client, build_identity, message) < 0) {
error("ERROR: Unable to send NOR data\n");
return -1;
}
diff --git a/src/restore.h b/src/restore.h
index c93e325..ad3b721 100644
--- a/src/restore.h
+++ b/src/restore.h
@@ -53,7 +53,7 @@ const char* restore_progress_string(unsigned int operation);
int restore_handle_status_msg(restored_client_t client, plist_t msg);
int restore_handle_progress_msg(struct idevicerestore_client_t* client, plist_t msg);
int restore_handle_data_request_msg(struct idevicerestore_client_t* client, idevice_t device, restored_client_t restore, plist_t message, plist_t build_identity, const char* filesystem);
-int restore_send_nor(restored_client_t restore, struct idevicerestore_client_t* client, plist_t build_identity);
+int restore_send_nor(restored_client_t restore, struct idevicerestore_client_t* client, plist_t build_identity, plist_t message);
int restore_send_root_ticket(restored_client_t restore, struct idevicerestore_client_t* client);
int restore_send_component(restored_client_t restore, struct idevicerestore_client_t* client, plist_t build_identity, const char* component, const char* component_name);
int restore_device(struct idevicerestore_client_t* client, plist_t build_identity, const char* filesystem);