Commit d5e52dbd authored by Jonathan Beck's avatar Jonathan Beck

fix AFC memory leak and errors (from iphoneclient valgrind analysis).

parent 89f0fd84
...@@ -239,6 +239,7 @@ static int receive_AFC_data(AFClient *client, char **dump_here) { ...@@ -239,6 +239,7 @@ static int receive_AFC_data(AFClient *client, char **dump_here) {
if(param1 == 0) { if(param1 == 0) {
if (debug) fprintf(stderr, "... false alarm, but still\n"); if (debug) fprintf(stderr, "... false alarm, but still\n");
*dump_here = NULL; *dump_here = NULL;
free(r_packet);
return 0; return 0;
} }
else { if (debug) fprintf(stderr, "Errno %i\n", param1); } else { if (debug) fprintf(stderr, "Errno %i\n", param1); }
...@@ -253,6 +254,7 @@ static int receive_AFC_data(AFClient *client, char **dump_here) { ...@@ -253,6 +254,7 @@ static int receive_AFC_data(AFClient *client, char **dump_here) {
if (!recv_len && r_packet->operation == AFC_SUCCESS_RESPONSE) if (!recv_len && r_packet->operation == AFC_SUCCESS_RESPONSE)
{ {
*dump_here = NULL; *dump_here = NULL;
free(r_packet);
return 0; return 0;
} }
...@@ -272,7 +274,7 @@ static int receive_AFC_data(AFClient *client, char **dump_here) { ...@@ -272,7 +274,7 @@ static int receive_AFC_data(AFClient *client, char **dump_here) {
if(debug) fprintf(stderr, "receive_AFC_data: mux_recv delivered too much data\n"); if(debug) fprintf(stderr, "receive_AFC_data: mux_recv delivered too much data\n");
break; break;
} }
if (strstr(buffer, "CFA6LPAA")) { if (bytes > 7 && strstr(buffer, "CFA6LPAA")) {
if (debug) fprintf(stderr, "receive_AFC_data: WARNING: there is AFC data in this packet at %ti\n", strstr(buffer, "CFA6LPAA") - buffer); if (debug) fprintf(stderr, "receive_AFC_data: WARNING: there is AFC data in this packet at %ti\n", strstr(buffer, "CFA6LPAA") - buffer);
if (debug) fprintf(stderr, "receive_AFC_data: the total packet length is %i\n", bytes); if (debug) fprintf(stderr, "receive_AFC_data: the total packet length is %i\n", bytes);
} }
...@@ -308,7 +310,7 @@ static char **make_strings_list(char *tokens, int true_length) { ...@@ -308,7 +310,7 @@ static char **make_strings_list(char *tokens, int true_length) {
list[i] = strdup(tokens+j); list[i] = strdup(tokens+j);
j += strlen(list[i]) + 1; j += strlen(list[i]) + 1;
} }
list[i] = strdup(""); list[i] = NULL;
return list; return list;
} }
...@@ -455,6 +457,7 @@ int afc_rename_file(AFClient *client, const char *from, const char *to) { ...@@ -455,6 +457,7 @@ int afc_rename_file(AFClient *client, const char *from, const char *to) {
client->afc_packet->entire_length = client->afc_packet->this_length = 0; client->afc_packet->entire_length = client->afc_packet->this_length = 0;
client->afc_packet->operation = AFC_RENAME; client->afc_packet->operation = AFC_RENAME;
bytes = dispatch_AFC_packet(client, send, strlen(to) + strlen(from) + 2); bytes = dispatch_AFC_packet(client, send, strlen(to) + strlen(from) + 2);
free(send);
if (bytes <= 0) { if (bytes <= 0) {
afc_unlock(client); afc_unlock(client);
return 0; return 0;
...@@ -547,7 +550,7 @@ AFCFile *afc_get_file_info(AFClient *client, const char *path) { ...@@ -547,7 +550,7 @@ AFCFile *afc_get_file_info(AFClient *client, const char *path) {
// Parse the data // Parse the data
if (list) { if (list) {
my_file = (AFCFile *)malloc(sizeof(AFCFile)); my_file = (AFCFile *)malloc(sizeof(AFCFile));
for (i = 0; strcmp(list[i], ""); i++) { for (i = 0; list[i]; i++) {
if (!strcmp(list[i], "st_size")) { if (!strcmp(list[i], "st_size")) {
my_file->size = atoi(list[i+1]); my_file->size = atoi(list[i+1]);
} }
...@@ -564,7 +567,7 @@ AFCFile *afc_get_file_info(AFClient *client, const char *path) { ...@@ -564,7 +567,7 @@ AFCFile *afc_get_file_info(AFClient *client, const char *path) {
} }
} }
} }
free_dictionary(list); g_strfreev(list);
return my_file; return my_file;
} else { } else {
return NULL; return NULL;
...@@ -618,6 +621,7 @@ AFCFile *afc_open_file(AFClient *client, const char *filename, uint32 file_mode) ...@@ -618,6 +621,7 @@ AFCFile *afc_open_file(AFClient *client, const char *filename, uint32 file_mode)
// Get the file info and return it // Get the file info and return it
file_infos = afc_get_file_info(client, filename); file_infos = afc_get_file_info(client, filename);
memcpy(&file_infos->filehandle, data, 4); memcpy(&file_infos->filehandle, data, 4);
free(data);
return file_infos; return file_infos;
} else { } else {
if (debug) fprintf(stderr, "afc_open_file: Didn't get any further data\n"); if (debug) fprintf(stderr, "afc_open_file: Didn't get any further data\n");
...@@ -661,6 +665,7 @@ int afc_read_file(AFClient *client, AFCFile *file, char *data, int length) { ...@@ -661,6 +665,7 @@ int afc_read_file(AFClient *client, AFCFile *file, char *data, int length) {
client->afc_packet->operation = AFC_READ; client->afc_packet->operation = AFC_READ;
client->afc_packet->entire_length = client->afc_packet->this_length = 0; client->afc_packet->entire_length = client->afc_packet->this_length = 0;
bytes = dispatch_AFC_packet(client, (char*)packet, sizeof(AFCFilePacket)); bytes = dispatch_AFC_packet(client, (char*)packet, sizeof(AFCFilePacket));
free(packet);
if (bytes <= 0) { if (bytes <= 0) {
afc_unlock(client); afc_unlock(client);
......
...@@ -66,17 +66,18 @@ int main(int argc, char *argv[]) { ...@@ -66,17 +66,18 @@ int main(int argc, char *argv[]) {
dirs = afc_get_dir_list(afc, "/eafaedf"); dirs = afc_get_dir_list(afc, "/eafaedf");
if (!dirs) dirs = afc_get_dir_list(afc, "/"); if (!dirs) dirs = afc_get_dir_list(afc, "/");
printf("Directory time.\n"); printf("Directory time.\n");
for (i = 0; strcmp(dirs[i], ""); i++) { for (i = 0; dirs[i]; i++) {
printf("/%s\n", dirs[i]); printf("/%s\n", dirs[i]);
} }
free_dictionary(dirs); g_strfreev(dirs);
dirs = afc_get_devinfo(afc); dirs = afc_get_devinfo(afc);
if (dirs) { if (dirs) {
for (i = 0; strcmp(dirs[i], ""); i+=2) { for (i = 0; dirs[i]; i+=2) {
printf("%s: %s\n", dirs[i], dirs[i+1]); printf("%s: %s\n", dirs[i], dirs[i+1]);
} }
} }
g_strfreev(dirs);
AFCFile *my_file = afc_open_file(afc, "/iTunesOnTheGoPlaylist.plist", AFC_FILE_READ); AFCFile *my_file = afc_open_file(afc, "/iTunesOnTheGoPlaylist.plist", AFC_FILE_READ);
if (my_file) { if (my_file) {
...@@ -124,6 +125,7 @@ int main(int argc, char *argv[]) { ...@@ -124,6 +125,7 @@ int main(int argc, char *argv[]) {
else printf("Couldn't read!\n"); else printf("Couldn't read!\n");
free(threeletterword); free(threeletterword);
afc_close_file(afc, my_file); afc_close_file(afc, my_file);
free(my_file);
} }
afc_disconnect(afc); afc_disconnect(afc);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment