aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2001-07-19 12:15:13 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2001-07-19 12:15:13 +0000
commit81108e7653583508bfc541748845183c56e0e378 (patch)
treeccfe4b6c710253dd5944960868487b2c54c6ec7d
parentc3fbec73fb45997918bef927cea519866e1e1c9d (diff)
downloadbusybox-w32-81108e7653583508bfc541748845183c56e0e378.tar.gz
busybox-w32-81108e7653583508bfc541748845183c56e0e378.tar.bz2
busybox-w32-81108e7653583508bfc541748845183c56e0e378.zip
Cleanup (most) memory leaks
-rw-r--r--archival/dpkg.c89
-rw-r--r--dpkg.c89
2 files changed, 114 insertions, 64 deletions
diff --git a/archival/dpkg.c b/archival/dpkg.c
index f207b23ac..48c392894 100644
--- a/archival/dpkg.c
+++ b/archival/dpkg.c
@@ -161,6 +161,7 @@ int search_name_hashtable(const char *key)
161{ 161{
162 unsigned int probe_address = 0; 162 unsigned int probe_address = 0;
163 unsigned int probe_decrement = 0; 163 unsigned int probe_decrement = 0;
164// char *temp;
164 165
165 make_hash(key, &probe_address, &probe_decrement, NAME_HASH_PRIME); 166 make_hash(key, &probe_address, &probe_decrement, NAME_HASH_PRIME);
166 while(name_hashtable[probe_address] != NULL) { 167 while(name_hashtable[probe_address] != NULL) {
@@ -174,7 +175,6 @@ int search_name_hashtable(const char *key)
174 } 175 }
175 } 176 }
176 name_hashtable[probe_address] = xstrdup(key); 177 name_hashtable[probe_address] = xstrdup(key);
177
178 return(probe_address); 178 return(probe_address);
179} 179}
180 180
@@ -212,6 +212,7 @@ int version_compare_part(const char *version1, const char *version2)
212 int tmp_int; 212 int tmp_int;
213 int ver_num1; 213 int ver_num1;
214 int ver_num2; 214 int ver_num2;
215 int ret;
215 216
216 if (version1 == NULL) { 217 if (version1 == NULL) {
217 version1 = xstrdup(""); 218 version1 = xstrdup("");
@@ -234,7 +235,8 @@ int version_compare_part(const char *version1, const char *version2)
234 free(name1_char); 235 free(name1_char);
235 free(name2_char); 236 free(name2_char);
236 if (tmp_int != 0) { 237 if (tmp_int != 0) {
237 return(tmp_int); 238 ret = tmp_int;
239 goto cleanup_version_compare_part;
238 } 240 }
239 241
240 /* Compare digits */ 242 /* Compare digits */
@@ -249,13 +251,17 @@ int version_compare_part(const char *version1, const char *version2)
249 free(name1_char); 251 free(name1_char);
250 free(name2_char); 252 free(name2_char);
251 if (ver_num1 < ver_num2) { 253 if (ver_num1 < ver_num2) {
252 return(-1); 254 ret = -1;
255 goto cleanup_version_compare_part;
253 } 256 }
254 else if (ver_num1 > ver_num2) { 257 else if (ver_num1 > ver_num2) {
255 return(1); 258 ret = 1;
259 goto cleanup_version_compare_part;
256 } 260 }
257 } 261 }
258 return(0); 262 ret = 0;
263cleanup_version_compare_part:
264 return(ret);
259} 265}
260 266
261/* if ver1 < ver2 return -1, 267/* if ver1 < ver2 return -1,
@@ -499,54 +505,61 @@ unsigned int fill_package_struct(char *control_buffer)
499{ 505{
500 common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t)); 506 common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t));
501 507
502 char *field_name = xmalloc(sizeof(char *)); 508 char **field_name = xmalloc(sizeof(char *));
503 char *field_value = xmalloc(sizeof(char *)); 509 char **field_value = xmalloc(sizeof(char *));
504 int field_start = 0; 510 int field_start = 0;
505 int num = -1; 511 int num = -1;
506 int buffer_length = strlen(control_buffer); 512 int buffer_length = strlen(control_buffer);
507 513
508 new_node->version = search_name_hashtable("unknown"); 514 new_node->version = search_name_hashtable("unknown");
509 while (field_start < buffer_length) { 515 while (field_start < buffer_length) {
510 field_start += read_package_field(&control_buffer[field_start], &field_name, &field_value); 516 field_start += read_package_field(&control_buffer[field_start], field_name, field_value);
511 517
512 if (field_name == NULL) { 518 if (*field_name == NULL) {
513 goto fill_package_struct_cleanup; // Oh no, the dreaded goto statement !! 519 goto fill_package_struct_cleanup; // Oh no, the dreaded goto statement !!
514 } 520 }
515 521
516 if (strcmp(field_name, "Package") == 0) { 522 if (strcmp(*field_name, "Package") == 0) {
517 new_node->name = search_name_hashtable(field_value); 523 new_node->name = search_name_hashtable(*field_value);
518 } 524 }
519 else if (strcmp(field_name, "Version") == 0) { 525 else if (strcmp(*field_name, "Version") == 0) {
520 new_node->version = search_name_hashtable(field_value); 526 new_node->version = search_name_hashtable(*field_value);
521 } 527 }
522 else if (strcmp(field_name, "Pre-Depends") == 0) { 528 else if (strcmp(*field_name, "Pre-Depends") == 0) {
523 add_split_dependencies(new_node, field_value, EDGE_PRE_DEPENDS); 529 add_split_dependencies(new_node, *field_value, EDGE_PRE_DEPENDS);
524 } 530 }
525 else if (strcmp(field_name, "Depends") == 0) { 531 else if (strcmp(*field_name, "Depends") == 0) {
526 add_split_dependencies(new_node, field_value, EDGE_DEPENDS); 532 add_split_dependencies(new_node, *field_value, EDGE_DEPENDS);
527 } 533 }
528 else if (strcmp(field_name, "Replaces") == 0) { 534 else if (strcmp(*field_name, "Replaces") == 0) {
529 add_split_dependencies(new_node, field_value, EDGE_REPLACES); 535 add_split_dependencies(new_node, *field_value, EDGE_REPLACES);
530 } 536 }
531 else if (strcmp(field_name, "Provides") == 0) { 537 else if (strcmp(*field_name, "Provides") == 0) {
532 add_split_dependencies(new_node, field_value, EDGE_PROVIDES); 538 add_split_dependencies(new_node, *field_value, EDGE_PROVIDES);
533 } 539 }
534 else if (strcmp(field_name, "Conflicts") == 0) { 540 else if (strcmp(*field_name, "Conflicts") == 0) {
535 add_split_dependencies(new_node, field_value, EDGE_CONFLICTS); 541 add_split_dependencies(new_node, *field_value, EDGE_CONFLICTS);
536 } 542 }
537 else if (strcmp(field_name, "Suggests") == 0) { 543 else if (strcmp(*field_name, "Suggests") == 0) {
538 add_split_dependencies(new_node, field_value, EDGE_SUGGESTS); 544 add_split_dependencies(new_node, *field_value, EDGE_SUGGESTS);
539 } 545 }
540 else if (strcmp(field_name, "Recommends") == 0) { 546 else if (strcmp(*field_name, "Recommends") == 0) {
541 add_split_dependencies(new_node, field_value, EDGE_RECOMMENDS); 547 add_split_dependencies(new_node, *field_value, EDGE_RECOMMENDS);
542 } 548 }
543 else if (strcmp(field_name, "Enhances") == 0) { 549 else if (strcmp(*field_name, "Enhances") == 0) {
544 add_split_dependencies(new_node, field_value, EDGE_ENHANCES); 550 add_split_dependencies(new_node, *field_value, EDGE_ENHANCES);
545 } 551 }
546fill_package_struct_cleanup: 552fill_package_struct_cleanup:
547 free(field_name); 553 if (*field_name) {
548 free(field_value); 554 free(*field_name);
555 }
556 if (*field_value) {
557 free(*field_value);
558 }
549 } 559 }
560 free(field_name);
561 free(field_value);
562
550 if (new_node->version == search_name_hashtable("unknown")) { 563 if (new_node->version == search_name_hashtable("unknown")) {
551 free_package(new_node); 564 free_package(new_node);
552 return(-1); 565 return(-1);
@@ -615,6 +628,7 @@ void set_status(const unsigned int status_node_num, const char *new_value, const
615 new_status = (char *) xmalloc(want_len + flag_len + status_len + 3); 628 new_status = (char *) xmalloc(want_len + flag_len + status_len + 3);
616 sprintf(new_status, "%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]); 629 sprintf(new_status, "%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]);
617 status_hashtable[status_node_num]->status = search_name_hashtable(new_status); 630 status_hashtable[status_node_num]->status = search_name_hashtable(new_status);
631 free(new_status);
618 return; 632 return;
619} 633}
620 634
@@ -819,7 +833,6 @@ void write_status_file(deb_file_t **deb_file)
819 } 833 }
820 else if (strcmp("config-files", name_hashtable[state_status]) == 0) { 834 else if (strcmp("config-files", name_hashtable[state_status]) == 0) {
821 /* only change the status line */ 835 /* only change the status line */
822// buffer_length = strlen(control_buffer);
823 while (1) { 836 while (1) {
824 char *field_name; 837 char *field_name;
825 char *field_value; 838 char *field_value;
@@ -1003,6 +1016,7 @@ int check_deps(deb_file_t **deb_file, int deb_start, int dep_max_count)
1003 } 1016 }
1004 i++; 1017 i++;
1005 } 1018 }
1019 free(conflicts);
1006 return(TRUE); 1020 return(TRUE);
1007} 1021}
1008 1022
@@ -1091,8 +1105,10 @@ int run_package_script(const char *package_name, const char *script_type)
1091 1105
1092 /* If the file doesnt exist is isnt a fatal */ 1106 /* If the file doesnt exist is isnt a fatal */
1093 if (lstat(script_path, &path_stat) < 0) { 1107 if (lstat(script_path, &path_stat) < 0) {
1108 free(script_path);
1094 return(EXIT_SUCCESS); 1109 return(EXIT_SUCCESS);
1095 } else { 1110 } else {
1111 free(script_path);
1096 return(system(script_path)); 1112 return(system(script_path));
1097 } 1113 }
1098} 1114}
@@ -1236,6 +1252,8 @@ void unpack_package(deb_file_t *deb_file)
1236 /* change status */ 1252 /* change status */
1237 set_status(status_num, "install", 1); 1253 set_status(status_num, "install", 1);
1238 set_status(status_num, "unpacked", 3); 1254 set_status(status_num, "unpacked", 3);
1255
1256 free(info_prefix);
1239} 1257}
1240 1258
1241void configure_package(deb_file_t *deb_file) 1259void configure_package(deb_file_t *deb_file)
@@ -1399,6 +1417,13 @@ extern int dpkg_main(int argc, char **argv)
1399 1417
1400 write_status_file(deb_file); 1418 write_status_file(deb_file);
1401 1419
1420 for (i = 0; i < deb_count; i++) {
1421 free(deb_file[i]->control_file);
1422 free(deb_file[i]->filename);
1423 free(deb_file[i]);
1424 }
1425 free(deb_file);
1426
1402 for (i = 0; i < NAME_HASH_PRIME; i++) { 1427 for (i = 0; i < NAME_HASH_PRIME; i++) {
1403 if (name_hashtable[i] != NULL) { 1428 if (name_hashtable[i] != NULL) {
1404 free(name_hashtable[i]); 1429 free(name_hashtable[i]);
diff --git a/dpkg.c b/dpkg.c
index f207b23ac..48c392894 100644
--- a/dpkg.c
+++ b/dpkg.c
@@ -161,6 +161,7 @@ int search_name_hashtable(const char *key)
161{ 161{
162 unsigned int probe_address = 0; 162 unsigned int probe_address = 0;
163 unsigned int probe_decrement = 0; 163 unsigned int probe_decrement = 0;
164// char *temp;
164 165
165 make_hash(key, &probe_address, &probe_decrement, NAME_HASH_PRIME); 166 make_hash(key, &probe_address, &probe_decrement, NAME_HASH_PRIME);
166 while(name_hashtable[probe_address] != NULL) { 167 while(name_hashtable[probe_address] != NULL) {
@@ -174,7 +175,6 @@ int search_name_hashtable(const char *key)
174 } 175 }
175 } 176 }
176 name_hashtable[probe_address] = xstrdup(key); 177 name_hashtable[probe_address] = xstrdup(key);
177
178 return(probe_address); 178 return(probe_address);
179} 179}
180 180
@@ -212,6 +212,7 @@ int version_compare_part(const char *version1, const char *version2)
212 int tmp_int; 212 int tmp_int;
213 int ver_num1; 213 int ver_num1;
214 int ver_num2; 214 int ver_num2;
215 int ret;
215 216
216 if (version1 == NULL) { 217 if (version1 == NULL) {
217 version1 = xstrdup(""); 218 version1 = xstrdup("");
@@ -234,7 +235,8 @@ int version_compare_part(const char *version1, const char *version2)
234 free(name1_char); 235 free(name1_char);
235 free(name2_char); 236 free(name2_char);
236 if (tmp_int != 0) { 237 if (tmp_int != 0) {
237 return(tmp_int); 238 ret = tmp_int;
239 goto cleanup_version_compare_part;
238 } 240 }
239 241
240 /* Compare digits */ 242 /* Compare digits */
@@ -249,13 +251,17 @@ int version_compare_part(const char *version1, const char *version2)
249 free(name1_char); 251 free(name1_char);
250 free(name2_char); 252 free(name2_char);
251 if (ver_num1 < ver_num2) { 253 if (ver_num1 < ver_num2) {
252 return(-1); 254 ret = -1;
255 goto cleanup_version_compare_part;
253 } 256 }
254 else if (ver_num1 > ver_num2) { 257 else if (ver_num1 > ver_num2) {
255 return(1); 258 ret = 1;
259 goto cleanup_version_compare_part;
256 } 260 }
257 } 261 }
258 return(0); 262 ret = 0;
263cleanup_version_compare_part:
264 return(ret);
259} 265}
260 266
261/* if ver1 < ver2 return -1, 267/* if ver1 < ver2 return -1,
@@ -499,54 +505,61 @@ unsigned int fill_package_struct(char *control_buffer)
499{ 505{
500 common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t)); 506 common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t));
501 507
502 char *field_name = xmalloc(sizeof(char *)); 508 char **field_name = xmalloc(sizeof(char *));
503 char *field_value = xmalloc(sizeof(char *)); 509 char **field_value = xmalloc(sizeof(char *));
504 int field_start = 0; 510 int field_start = 0;
505 int num = -1; 511 int num = -1;
506 int buffer_length = strlen(control_buffer); 512 int buffer_length = strlen(control_buffer);
507 513
508 new_node->version = search_name_hashtable("unknown"); 514 new_node->version = search_name_hashtable("unknown");
509 while (field_start < buffer_length) { 515 while (field_start < buffer_length) {
510 field_start += read_package_field(&control_buffer[field_start], &field_name, &field_value); 516 field_start += read_package_field(&control_buffer[field_start], field_name, field_value);
511 517
512 if (field_name == NULL) { 518 if (*field_name == NULL) {
513 goto fill_package_struct_cleanup; // Oh no, the dreaded goto statement !! 519 goto fill_package_struct_cleanup; // Oh no, the dreaded goto statement !!
514 } 520 }
515 521
516 if (strcmp(field_name, "Package") == 0) { 522 if (strcmp(*field_name, "Package") == 0) {
517 new_node->name = search_name_hashtable(field_value); 523 new_node->name = search_name_hashtable(*field_value);
518 } 524 }
519 else if (strcmp(field_name, "Version") == 0) { 525 else if (strcmp(*field_name, "Version") == 0) {
520 new_node->version = search_name_hashtable(field_value); 526 new_node->version = search_name_hashtable(*field_value);
521 } 527 }
522 else if (strcmp(field_name, "Pre-Depends") == 0) { 528 else if (strcmp(*field_name, "Pre-Depends") == 0) {
523 add_split_dependencies(new_node, field_value, EDGE_PRE_DEPENDS); 529 add_split_dependencies(new_node, *field_value, EDGE_PRE_DEPENDS);
524 } 530 }
525 else if (strcmp(field_name, "Depends") == 0) { 531 else if (strcmp(*field_name, "Depends") == 0) {
526 add_split_dependencies(new_node, field_value, EDGE_DEPENDS); 532 add_split_dependencies(new_node, *field_value, EDGE_DEPENDS);
527 } 533 }
528 else if (strcmp(field_name, "Replaces") == 0) { 534 else if (strcmp(*field_name, "Replaces") == 0) {
529 add_split_dependencies(new_node, field_value, EDGE_REPLACES); 535 add_split_dependencies(new_node, *field_value, EDGE_REPLACES);
530 } 536 }
531 else if (strcmp(field_name, "Provides") == 0) { 537 else if (strcmp(*field_name, "Provides") == 0) {
532 add_split_dependencies(new_node, field_value, EDGE_PROVIDES); 538 add_split_dependencies(new_node, *field_value, EDGE_PROVIDES);
533 } 539 }
534 else if (strcmp(field_name, "Conflicts") == 0) { 540 else if (strcmp(*field_name, "Conflicts") == 0) {
535 add_split_dependencies(new_node, field_value, EDGE_CONFLICTS); 541 add_split_dependencies(new_node, *field_value, EDGE_CONFLICTS);
536 } 542 }
537 else if (strcmp(field_name, "Suggests") == 0) { 543 else if (strcmp(*field_name, "Suggests") == 0) {
538 add_split_dependencies(new_node, field_value, EDGE_SUGGESTS); 544 add_split_dependencies(new_node, *field_value, EDGE_SUGGESTS);
539 } 545 }
540 else if (strcmp(field_name, "Recommends") == 0) { 546 else if (strcmp(*field_name, "Recommends") == 0) {
541 add_split_dependencies(new_node, field_value, EDGE_RECOMMENDS); 547 add_split_dependencies(new_node, *field_value, EDGE_RECOMMENDS);
542 } 548 }
543 else if (strcmp(field_name, "Enhances") == 0) { 549 else if (strcmp(*field_name, "Enhances") == 0) {
544 add_split_dependencies(new_node, field_value, EDGE_ENHANCES); 550 add_split_dependencies(new_node, *field_value, EDGE_ENHANCES);
545 } 551 }
546fill_package_struct_cleanup: 552fill_package_struct_cleanup:
547 free(field_name); 553 if (*field_name) {
548 free(field_value); 554 free(*field_name);
555 }
556 if (*field_value) {
557 free(*field_value);
558 }
549 } 559 }
560 free(field_name);
561 free(field_value);
562
550 if (new_node->version == search_name_hashtable("unknown")) { 563 if (new_node->version == search_name_hashtable("unknown")) {
551 free_package(new_node); 564 free_package(new_node);
552 return(-1); 565 return(-1);
@@ -615,6 +628,7 @@ void set_status(const unsigned int status_node_num, const char *new_value, const
615 new_status = (char *) xmalloc(want_len + flag_len + status_len + 3); 628 new_status = (char *) xmalloc(want_len + flag_len + status_len + 3);
616 sprintf(new_status, "%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]); 629 sprintf(new_status, "%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]);
617 status_hashtable[status_node_num]->status = search_name_hashtable(new_status); 630 status_hashtable[status_node_num]->status = search_name_hashtable(new_status);
631 free(new_status);
618 return; 632 return;
619} 633}
620 634
@@ -819,7 +833,6 @@ void write_status_file(deb_file_t **deb_file)
819 } 833 }
820 else if (strcmp("config-files", name_hashtable[state_status]) == 0) { 834 else if (strcmp("config-files", name_hashtable[state_status]) == 0) {
821 /* only change the status line */ 835 /* only change the status line */
822// buffer_length = strlen(control_buffer);
823 while (1) { 836 while (1) {
824 char *field_name; 837 char *field_name;
825 char *field_value; 838 char *field_value;
@@ -1003,6 +1016,7 @@ int check_deps(deb_file_t **deb_file, int deb_start, int dep_max_count)
1003 } 1016 }
1004 i++; 1017 i++;
1005 } 1018 }
1019 free(conflicts);
1006 return(TRUE); 1020 return(TRUE);
1007} 1021}
1008 1022
@@ -1091,8 +1105,10 @@ int run_package_script(const char *package_name, const char *script_type)
1091 1105
1092 /* If the file doesnt exist is isnt a fatal */ 1106 /* If the file doesnt exist is isnt a fatal */
1093 if (lstat(script_path, &path_stat) < 0) { 1107 if (lstat(script_path, &path_stat) < 0) {
1108 free(script_path);
1094 return(EXIT_SUCCESS); 1109 return(EXIT_SUCCESS);
1095 } else { 1110 } else {
1111 free(script_path);
1096 return(system(script_path)); 1112 return(system(script_path));
1097 } 1113 }
1098} 1114}
@@ -1236,6 +1252,8 @@ void unpack_package(deb_file_t *deb_file)
1236 /* change status */ 1252 /* change status */
1237 set_status(status_num, "install", 1); 1253 set_status(status_num, "install", 1);
1238 set_status(status_num, "unpacked", 3); 1254 set_status(status_num, "unpacked", 3);
1255
1256 free(info_prefix);
1239} 1257}
1240 1258
1241void configure_package(deb_file_t *deb_file) 1259void configure_package(deb_file_t *deb_file)
@@ -1399,6 +1417,13 @@ extern int dpkg_main(int argc, char **argv)
1399 1417
1400 write_status_file(deb_file); 1418 write_status_file(deb_file);
1401 1419
1420 for (i = 0; i < deb_count; i++) {
1421 free(deb_file[i]->control_file);
1422 free(deb_file[i]->filename);
1423 free(deb_file[i]);
1424 }
1425 free(deb_file);
1426
1402 for (i = 0; i < NAME_HASH_PRIME; i++) { 1427 for (i = 0; i < NAME_HASH_PRIME; i++) {
1403 if (name_hashtable[i] != NULL) { 1428 if (name_hashtable[i] != NULL) {
1404 free(name_hashtable[i]); 1429 free(name_hashtable[i]);