From 8ee1ca12bd5189fd51f907a63b04d68d3b54a976 Mon Sep 17 00:00:00 2001 From: boxingsquirrel Date: Fri, 3 Sep 2010 13:57:44 -0400 Subject: [PATCH 1/3] Fixed a bug causin a sefault... --- src/activate.c | 45 ++++++++++++++++++++++++++++++++++++++----- src/cache.c | 4 +++- src/ideviceactivate.c | 2 +- src/util.c | 7 ++----- src/util.h | 2 +- xml.txt | 1 + 6 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 xml.txt diff --git a/src/activate.c b/src/activate.c index 8a8357a..9f8fb22 100755 --- a/src/activate.c +++ b/src/activate.c @@ -69,6 +69,10 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust struct curl_httppost* last = NULL; activate_response* response = NULL; + plist_t imei_node = NULL; + plist_t imsi_node = NULL; + plist_t iccid_node = NULL; + plist_t serial_number_node = NULL; plist_t activation_info_node = NULL; char* activation_info; @@ -76,14 +80,27 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust activate_info* ainfo; char* device_class = NULL; - device_class=(char*)lockdownd_get_string_value(client, "DeviceClass"); + plist_t device_class_node = NULL; + lockdownd_get_value(client, NULL, "DeviceClass", &device_class_node); + if (!device_class_node || plist_get_node_type(device_class_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get DeviceClass from lockdownd\n"); + return -1; + } + plist_get_string_val(device_class_node, &device_class); + plist_free(device_class_node); if (!strcmp(device_class, "iPhone")) { if (use_cache!=1) { if (cust_iccid==NULL) { - ainfo->iccid=(char*)lockdownd_get_string_value(client, "IntegratedCircuitCardIdentity"); + lockdownd_get_value(client, NULL, "IntegratedCircuitCardIdentity", &iccid_node); + if (!iccid_node || plist_get_node_type(iccid_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get ICCID from lockdownd\n"); + return -1; + } + plist_get_string_val(iccid_node, &ainfo->iccid); + plist_free(iccid_node); } else { info("ICCID specified on the command line..."); @@ -92,7 +109,13 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust if (cust_imei==NULL) { - ainfo->imei=(char*)lockdownd_get_string_value(client, "InternationalMobileEquipmentIdentity"); + lockdownd_get_value(client, NULL, "InternationalMobileEquipmentIdentity", &imei_node); + if (!imei_node || plist_get_node_type(imei_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get IMEI from lockdownd\n"); + return -1; + } + plist_get_string_val(imei_node, &ainfo->imei); + plist_free(imei_node); } else { info("IMEI specified on the command line..."); @@ -101,7 +124,13 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust if (cust_imsi==NULL) { - ainfo->imsi=(char*)lockdownd_get_string_value(client, "InternationalMobileSubscriberIdentity"); + lockdownd_get_value(client, NULL, "InternationalMobileSubscriberIdentity", &imsi_node); + if (!imsi_node || plist_get_node_type(imsi_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get IMSI from lockdownd\n"); + return -1; + } + plist_get_string_val(imsi_node, &ainfo->imsi); + plist_free(imsi_node); } else { info("IMSI specified on the command line..."); @@ -140,7 +169,13 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust { if (use_cache!=1) { - ainfo->serial_number=(char*)lockdownd_get_string_value(client, "SerialNumber"); + lockdownd_get_value(client, NULL, "SerialNumber", &serial_number_node); + if (!serial_number_node || plist_get_node_type(serial_number_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get SerialNumber from lockdownd\n"); + return -1; + } + plist_get_string_val(serial_number_node, &ainfo->serial_number); + plist_free(serial_number_node); } else { ainfo->serial_number=get_from_cache("SerialNumber"); diff --git a/src/cache.c b/src/cache.c index c75c56c..0c55523 100755 --- a/src/cache.c +++ b/src/cache.c @@ -134,7 +134,9 @@ void cache_warning() int check_cache(lockdownd_client_t c) { char* uuid_from_cache=get_from_cache("UUID"); - char* uuid_from_device=(char *)lockdownd_get_string_value(c, "UniqueDeviceID"); + char* uuid_from_device=NULL; + + lockdownd_get_string_value(c, "UniqueDeviceID", &uuid_from_device); return strcmp(uuid_from_cache, uuid_from_device); } diff --git a/src/ideviceactivate.c b/src/ideviceactivate.c index 615256f..43fed9c 100755 --- a/src/ideviceactivate.c +++ b/src/ideviceactivate.c @@ -78,7 +78,7 @@ int main(int argc, char* argv[]) { switch (opt) { case 'h': usage(argc, argv); - break; + return 0; case 'd': debug = 1; diff --git a/src/util.c b/src/util.c index e2ce17d..c6c38e4 100755 --- a/src/util.c +++ b/src/util.c @@ -86,20 +86,17 @@ int plist_read_from_filename(plist_t *plist, const char *filename) { } /* This one is a wrapper for p0sixninja's rather repetetive code... */ -char *lockdownd_get_string_value(lockdownd_client_t client, const char *what) +void lockdownd_get_string_value(lockdownd_client_t client, const char *what, char *val) { plist_t val_node=NULL; - char* val=NULL; lockdownd_get_value(client, NULL, what, &val_node); if (!val_node || plist_get_node_type(val_node) != PLIST_STRING) { fprintf(stderr, "Unable to get %s from lockdownd\n", what); - return NULL; + val=NULL; } plist_get_string_val(val_node, &val); plist_free(val_node); - - return (char *)val; } /* This is really just a function to allow some hooking into Gtk stuff in iDeviceActivator... */ diff --git a/src/util.h b/src/util.h index 5e5132d..51c0774 100755 --- a/src/util.h +++ b/src/util.h @@ -24,7 +24,7 @@ // These just wrap p0sixninja's original code, just trying to clean up... extern int plist_read_from_filename(plist_t *plist, const char *filename); extern int buffer_read_from_filename(const char *filename, char **buffer, uint32_t *length); -extern char *lockdownd_get_string_value(lockdownd_client_t client, const char *what); +extern void lockdownd_get_string_value(lockdownd_client_t client, const char *what, char *val); // The main purpose of these two is to provide a way to mod the behavior, plus a bit of shorthand ;) extern void info(const char *m); diff --git a/xml.txt b/xml.txt new file mode 100644 index 0000000..04215b7 --- /dev/null +++ b/xml.txt @@ -0,0 +1 @@ +PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+CjxwbGlzdCB2ZXJzaW9uPSIxLjAiPgo8ZGljdD4KCTxrZXk+QWN0aXZhdGlvblJhbmRvbW5lc3M8L2tleT4KCTxzdHJpbmc+N0E1REQzQjEtOUMyNC00NkYzLUI3MEQtRTdGMDZFMzVEMzFGPC9zdHJpbmc+Cgk8a2V5PkFjdGl2YXRpb25TdGF0ZTwva2V5PgoJPHN0cmluZz5BY3RpdmF0ZWQ8L3N0cmluZz4KCTxrZXk+QnVpbGRWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjdCNDA1PC9zdHJpbmc+Cgk8a2V5PkRldmljZUNlcnRSZXF1ZXN0PC9rZXk+Cgk8ZGF0YT4KCUxTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSU0JTUlZGVlJWTlVMUzB0TFMwS1RVbEpRbmhFUTBOQlV6QkRRVkZCCglkMmRaVFhoTVZFRnlRbWRPVmtKQlRWUktSRUY2VDFSTmVFMTZRa1pNVkdjeFQwUmpkRTVGUlhsU2FUQTBUbFJyZUFwTQoJVkZGNlRVUk5lazVGUlhwTlZGWkVVa1JGVEUxQmEwZEJNVlZGUW1oTlExWldUWGhEZWtGS1FtZE9Wa0pCWjFSQmEwNUMKCVRWSkpkMFZCV1VSV1VWRklDa1YzYkVSa1dFSnNZMjVTY0dKdE9IaEZla0ZTUW1kT1ZrSkJiMVJEYTBaM1kwZDRiRWxGCgliSFZaZVRSNFJIcEJUa0puVGxaQ1FYTlVRbTFzVVdGSE9YVUtXbFJEUW01NlFVNUNaMnR4YUd0cFJ6bDNNRUpCVVVWRwoJUVVGUFFtcFJRWGRuV1d0RFoxbEZRV3RtTUdwVlVrRlZiR0Z4Y1c5RVJWWmplWFpCUkhScFJRcFBOMVJxWWpCRkszbzQKCVlrNXBTVFZhU1VGS2JWQmhkV0V4ZFhaaVZXNVFSRkJ4WTFCclNubEhhMk4zS3pNMVVtVnVhbmgwVW1VME1XaHZNamxJCglhVGd4Q2pKeVdtZDJURFF2Unk5Q1NVbEpWVWRWTldGaFRYQlFRbFZhYjJ0bFFXNXhZaXRpVG1KeVZHZHNibUZtUkdGTAoJTjBsb1pFUlBaRVpCVnl0WFVsTnBaMjBLY2tabmMxTmxjMDVwYW5wdGRHUlVSbTlzWTBOQmQwVkJRV0ZCUVUxQk1FZEQKCVUzRkhVMGxpTTBSUlJVSkNVVlZCUVRSSFFrRkRlV3A2T1ZOWVJWbG9iUW9yTVRobWQydzJVWFpuYjJSdk5ITldLMGhDCglWMEZOUTFGMFRVaFhNRkkyYTI1cU4yRlpNVTlTYVVZM2VuZEZXVXBqZWt4UFZVMW9WVUkzVWtrMU0xcHRDblV4UlZWWAoJWkV0VmMxTlFRMHRMVXpGV2JtSktVR3B2VG1kcE5GSXdhVFZSTHpKNmJVMW9WRVJVUWs5Q09GZGlXR0ZGVEdodE1VeHUKCVJHTnpUblJ1UVZnS2N6a3hjRlZ1VGtSNGJubDJaM2g1UlRSTWRVUXlRVFJHYlc1aU5FaDJSVU1LTFMwdExTMUZUa1FnCglRMFZTVkVsR1NVTkJWRVVnVWtWUlZVVlRWQzB0TFMwdENnPT0KCTwvZGF0YT4KCTxrZXk+RGV2aWNlQ2xhc3M8L2tleT4KCTxzdHJpbmc+aVBhZDwvc3RyaW5nPgoJPGtleT5Nb2RlbE51bWJlcjwva2V5PgoJPHN0cmluZz5NQjI5Mzwvc3RyaW5nPgoJPGtleT5Qcm9kdWN0VHlwZTwva2V5PgoJPHN0cmluZz5pUGFkMSwxPC9zdHJpbmc+Cgk8a2V5PlByb2R1Y3RWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjMuMi4xPC9zdHJpbmc+Cgk8a2V5PlNlcmlhbE51bWJlcjwva2V5PgoJPHN0cmluZz5HQjAxNTVKMVozOTwvc3RyaW5nPgoJPGtleT5VbmlxdWVDaGlwSUQ8L2tleT4KCTxpbnRlZ2VyPjE3MjA3NzMxMjM1MzM8L2ludGVnZXI+Cgk8a2V5PlVuaXF1ZURldmljZUlEPC9rZXk+Cgk8c3RyaW5nPmIzMjA4ZThmNGRkZDlkOWE3ZWZiYzQyMWQ1YWZmZjk5NmM1NDQ2ZDg8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo= From 46b704e85ef4bc9b78fc97acf34628deedb78fbc Mon Sep 17 00:00:00 2001 From: boxingsquirrel Date: Fri, 3 Sep 2010 13:59:14 -0400 Subject: [PATCH 2/3] Uploaded a file with gibberish b accident :( --- xml.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 xml.txt diff --git a/xml.txt b/xml.txt deleted file mode 100644 index 04215b7..0000000 --- a/xml.txt +++ /dev/null @@ -1 +0,0 @@ -PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+CjxwbGlzdCB2ZXJzaW9uPSIxLjAiPgo8ZGljdD4KCTxrZXk+QWN0aXZhdGlvblJhbmRvbW5lc3M8L2tleT4KCTxzdHJpbmc+N0E1REQzQjEtOUMyNC00NkYzLUI3MEQtRTdGMDZFMzVEMzFGPC9zdHJpbmc+Cgk8a2V5PkFjdGl2YXRpb25TdGF0ZTwva2V5PgoJPHN0cmluZz5BY3RpdmF0ZWQ8L3N0cmluZz4KCTxrZXk+QnVpbGRWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjdCNDA1PC9zdHJpbmc+Cgk8a2V5PkRldmljZUNlcnRSZXF1ZXN0PC9rZXk+Cgk8ZGF0YT4KCUxTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSU0JTUlZGVlJWTlVMUzB0TFMwS1RVbEpRbmhFUTBOQlV6QkRRVkZCCglkMmRaVFhoTVZFRnlRbWRPVmtKQlRWUktSRUY2VDFSTmVFMTZRa1pNVkdjeFQwUmpkRTVGUlhsU2FUQTBUbFJyZUFwTQoJVkZGNlRVUk5lazVGUlhwTlZGWkVVa1JGVEUxQmEwZEJNVlZGUW1oTlExWldUWGhEZWtGS1FtZE9Wa0pCWjFSQmEwNUMKCVRWSkpkMFZCV1VSV1VWRklDa1YzYkVSa1dFSnNZMjVTY0dKdE9IaEZla0ZTUW1kT1ZrSkJiMVJEYTBaM1kwZDRiRWxGCgliSFZaZVRSNFJIcEJUa0puVGxaQ1FYTlVRbTFzVVdGSE9YVUtXbFJEUW01NlFVNUNaMnR4YUd0cFJ6bDNNRUpCVVVWRwoJUVVGUFFtcFJRWGRuV1d0RFoxbEZRV3RtTUdwVlVrRlZiR0Z4Y1c5RVJWWmplWFpCUkhScFJRcFBOMVJxWWpCRkszbzQKCVlrNXBTVFZhU1VGS2JWQmhkV0V4ZFhaaVZXNVFSRkJ4WTFCclNubEhhMk4zS3pNMVVtVnVhbmgwVW1VME1XaHZNamxJCglhVGd4Q2pKeVdtZDJURFF2Unk5Q1NVbEpWVWRWTldGaFRYQlFRbFZhYjJ0bFFXNXhZaXRpVG1KeVZHZHNibUZtUkdGTAoJTjBsb1pFUlBaRVpCVnl0WFVsTnBaMjBLY2tabmMxTmxjMDVwYW5wdGRHUlVSbTlzWTBOQmQwVkJRV0ZCUVUxQk1FZEQKCVUzRkhVMGxpTTBSUlJVSkNVVlZCUVRSSFFrRkRlV3A2T1ZOWVJWbG9iUW9yTVRobWQydzJVWFpuYjJSdk5ITldLMGhDCglWMEZOUTFGMFRVaFhNRkkyYTI1cU4yRlpNVTlTYVVZM2VuZEZXVXBqZWt4UFZVMW9WVUkzVWtrMU0xcHRDblV4UlZWWAoJWkV0VmMxTlFRMHRMVXpGV2JtSktVR3B2VG1kcE5GSXdhVFZSTHpKNmJVMW9WRVJVUWs5Q09GZGlXR0ZGVEdodE1VeHUKCVJHTnpUblJ1UVZnS2N6a3hjRlZ1VGtSNGJubDJaM2g1UlRSTWRVUXlRVFJHYlc1aU5FaDJSVU1LTFMwdExTMUZUa1FnCglRMFZTVkVsR1NVTkJWRVVnVWtWUlZVVlRWQzB0TFMwdENnPT0KCTwvZGF0YT4KCTxrZXk+RGV2aWNlQ2xhc3M8L2tleT4KCTxzdHJpbmc+aVBhZDwvc3RyaW5nPgoJPGtleT5Nb2RlbE51bWJlcjwva2V5PgoJPHN0cmluZz5NQjI5Mzwvc3RyaW5nPgoJPGtleT5Qcm9kdWN0VHlwZTwva2V5PgoJPHN0cmluZz5pUGFkMSwxPC9zdHJpbmc+Cgk8a2V5PlByb2R1Y3RWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjMuMi4xPC9zdHJpbmc+Cgk8a2V5PlNlcmlhbE51bWJlcjwva2V5PgoJPHN0cmluZz5HQjAxNTVKMVozOTwvc3RyaW5nPgoJPGtleT5VbmlxdWVDaGlwSUQ8L2tleT4KCTxpbnRlZ2VyPjE3MjA3NzMxMjM1MzM8L2ludGVnZXI+Cgk8a2V5PlVuaXF1ZURldmljZUlEPC9rZXk+Cgk8c3RyaW5nPmIzMjA4ZThmNGRkZDlkOWE3ZWZiYzQyMWQ1YWZmZjk5NmM1NDQ2ZDg8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0Pgo= From d474e0182a1f7ac8d0c2516320d64fdc42fbca4b Mon Sep 17 00:00:00 2001 From: boxingsquirrel Date: Tue, 5 Oct 2010 15:55:31 -0400 Subject: [PATCH 3/3] Fixed a bunch of lttle bugs plus at least one SEGFAULT --- src/activate.c | 95 +++++++++++++++++++++++++------------------- src/cache.c | 10 ++--- src/ideviceactivate | Bin 0 -> 54027 bytes 3 files changed, 60 insertions(+), 45 deletions(-) create mode 100755 src/ideviceactivate diff --git a/src/activate.c b/src/activate.c index 9f8fb22..917401b 100755 --- a/src/activate.c +++ b/src/activate.c @@ -75,9 +75,11 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust plist_t serial_number_node = NULL; plist_t activation_info_node = NULL; - char* activation_info; - - activate_info* ainfo; + char* imei=NULL; + char* imsi=NULL; + char* iccid=NULL; + char* serial_number=NULL; + char* activation_info=NULL; char* device_class = NULL; plist_t device_class_node = NULL; @@ -89,6 +91,17 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust plist_get_string_val(device_class_node, &device_class); plist_free(device_class_node); + plist_t uuid_node=NULL; + char* uuid=NULL; + lockdownd_get_value(client, NULL, "UniqueDeviceID", &uuid_node); + if (!uuid_node || plist_get_node_type(uuid_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get UUID from lockdownd\n"); + return -1; + } + plist_get_string_val(uuid_node, &uuid); + plist_free(uuid_node); + cache("UUID", (const char *)uuid); + if (!strcmp(device_class, "iPhone")) { if (use_cache!=1) { @@ -99,12 +112,12 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust fprintf(stderr, "Unable to get ICCID from lockdownd\n"); return -1; } - plist_get_string_val(iccid_node, &ainfo->iccid); + plist_get_string_val(iccid_node, &iccid); plist_free(iccid_node); } else { info("ICCID specified on the command line..."); - ainfo->iccid=cust_iccid; + iccid=cust_iccid; } if (cust_imei==NULL) @@ -114,12 +127,12 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust fprintf(stderr, "Unable to get IMEI from lockdownd\n"); return -1; } - plist_get_string_val(imei_node, &ainfo->imei); + plist_get_string_val(imei_node, &imei); plist_free(imei_node); } else { info("IMEI specified on the command line..."); - ainfo->imei=cust_imei; + imei=cust_imei; } if (cust_imsi==NULL) @@ -129,38 +142,38 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust fprintf(stderr, "Unable to get IMSI from lockdownd\n"); return -1; } - plist_get_string_val(imsi_node, &ainfo->imsi); + plist_get_string_val(imsi_node, &imsi); plist_free(imsi_node); } else { info("IMSI specified on the command line..."); - ainfo->imsi=cust_imsi; + imsi=cust_imsi; } } else { if (cust_iccid==NULL) { - ainfo->iccid=get_from_cache("ICCID"); + iccid=get_from_cache("ICCID"); } else { - ainfo->iccid=cust_iccid; + iccid=cust_iccid; } if (cust_imei==NULL) { - ainfo->imei=get_from_cache("IMEI"); + imei=get_from_cache("IMEI"); } else { - ainfo->imei=cust_imei; + imei=cust_imei; } if (cust_imsi==NULL) { - ainfo->imsi=get_from_cache("IMSI"); + imsi=get_from_cache("IMSI"); } else { - ainfo->imsi=cust_imsi; + imsi=cust_imsi; } } } @@ -169,21 +182,22 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust { if (use_cache!=1) { - lockdownd_get_value(client, NULL, "SerialNumber", &serial_number_node); - if (!serial_number_node || plist_get_node_type(serial_number_node) != PLIST_STRING) { - fprintf(stderr, "Unable to get SerialNumber from lockdownd\n"); + plist_t serial_num_node = NULL; + lockdownd_get_value(client, NULL, "SerialNumber", &serial_num_node); + if (!serial_num_node || plist_get_node_type(serial_num_node) != PLIST_STRING) { + fprintf(stderr, "Unable to get DeviceClass from lockdownd\n"); return -1; } - plist_get_string_val(serial_number_node, &ainfo->serial_number); - plist_free(serial_number_node); + plist_get_string_val(serial_num_node, &serial_number); + plist_free(serial_num_node); } else { - ainfo->serial_number=get_from_cache("SerialNumber"); + serial_number=get_from_cache("SerialNumber"); } } else { info("Serial number specified on the command line..."); - ainfo->serial_number=cust_serial_num; + serial_number=cust_serial_num; } lockdownd_get_value(client, NULL, "ActivationInfo", &activation_info_node); @@ -198,7 +212,7 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust char* activation_info_data = NULL; plist_to_xml(activation_info_node, &activation_info_data, &activation_info_size); plist_free(activation_info_node); - //printf("%s\n\n", activation_info_data); + printf("%s\n\n", activation_info_data); char* activation_info_start = strstr(activation_info_data, ""); if (activation_info_start == NULL) { @@ -229,37 +243,38 @@ int activate_fetch_record(lockdownd_client_t client, plist_t* record, char* cust curl_formadd(&post, &last, CURLFORM_COPYNAME, "machineName", CURLFORM_COPYCONTENTS, "linux", CURLFORM_END); curl_formadd(&post, &last, CURLFORM_COPYNAME, "InStoreActivation", CURLFORM_COPYCONTENTS, "false", CURLFORM_END); - if (ainfo->imei != NULL) { - curl_formadd(&post, &last, CURLFORM_COPYNAME, "IMEI", CURLFORM_COPYCONTENTS, ainfo->imei, CURLFORM_END); - cache("IMEI", (const char *)ainfo->imei); - //free(ainfo->imei); + + if (imei != NULL) { + curl_formadd(&post, &last, CURLFORM_COPYNAME, "IMEI", CURLFORM_COPYCONTENTS, imei, CURLFORM_END); + cache("IMEI", (const char *)imei); + free(imei); } else { cache("IMEI", ""); } - if (ainfo->imsi != NULL) { - curl_formadd(&post, &last, CURLFORM_COPYNAME, "IMSI", CURLFORM_COPYCONTENTS, ainfo->imsi, CURLFORM_END); - cache("IMSI", (const char *)ainfo->imsi); - //free(ainfo->imsi); + if (imsi != NULL) { + curl_formadd(&post, &last, CURLFORM_COPYNAME, "IMSI", CURLFORM_COPYCONTENTS, imsi, CURLFORM_END); + cache("IMSI", (const char *)imsi); + free(imsi); } else { cache("IMSI", ""); } - if (ainfo->iccid != NULL) { - curl_formadd(&post, &last, CURLFORM_COPYNAME, "ICCID", CURLFORM_COPYCONTENTS, ainfo->iccid, CURLFORM_END); - cache("ICCID", (const char *)ainfo->iccid); - //free(ainfo->iccid); + if (iccid != NULL) { + curl_formadd(&post, &last, CURLFORM_COPYNAME, "ICCID", CURLFORM_COPYCONTENTS, iccid, CURLFORM_END); + cache("ICCID", (const char *)iccid); + free(iccid); } else { cache("ICCID", ""); } - if (ainfo->serial_number != NULL) { - curl_formadd(&post, &last, CURLFORM_COPYNAME, "AppleSerialNumber", CURLFORM_COPYCONTENTS, ainfo->serial_number, CURLFORM_END); - cache("SerialNumber", (const char *)ainfo->serial_number); - free(ainfo->serial_number); + if (serial_number != NULL) { + curl_formadd(&post, &last, CURLFORM_COPYNAME, "AppleSerialNumber", CURLFORM_COPYCONTENTS, serial_number, CURLFORM_END); + cache("SerialNumber", (const char *)serial_number); + free(serial_number); } else { cache("SeralNumber", ""); @@ -355,7 +370,7 @@ int do_activation(lockdownd_client_t client, plist_t activation_record) // Just my little dump'n'run exercise with the activation record... uint32_t len=0; - char **xml=NULL; + char *xml=NULL; plist_to_xml(activation_record, &xml, &len); printf("ACTIVATION RECORD:\n\n%s\n\n", xml); diff --git a/src/cache.c b/src/cache.c index 0c55523..1ec28b7 100755 --- a/src/cache.c +++ b/src/cache.c @@ -99,7 +99,7 @@ int cache_plist(const char *fname, plist_t plist) if (backup_to_cache==1) { uint32_t len=0; - char **xml=NULL; + char *xml=NULL; plist_to_xml(plist, &xml, &len); @@ -116,8 +116,8 @@ char* get_from_cache(const char *what) char fname[512]; snprintf(fname, 512, "%s/%s", cachedir, what); - char *d[BUFSIZE]; - read_file((const char *)fname, &d); + char d[BUFSIZE]; + read_file((const char *)fname, d); return (char *)d; } @@ -134,9 +134,9 @@ void cache_warning() int check_cache(lockdownd_client_t c) { char* uuid_from_cache=get_from_cache("UUID"); - char* uuid_from_device=NULL; + char *uuid_from_device=NULL; - lockdownd_get_string_value(c, "UniqueDeviceID", &uuid_from_device); + lockdownd_get_string_value(c, "UniqueDeviceID", uuid_from_device); return strcmp(uuid_from_cache, uuid_from_device); } diff --git a/src/ideviceactivate b/src/ideviceactivate new file mode 100755 index 0000000000000000000000000000000000000000..d2df62747bcd000da8b138ee48da2e3ab9c1c947 GIT binary patch literal 54027 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%0Ds~aR6##{#xWOz$NP{iXr9n!!|}ulupv`Q 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 z%0D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 literal 0 HcmV?d00001