Cleanup (most) memory leaks

This commit is contained in:
Glenn L McGrath
2001-07-19 12:15:13 +00:00
parent c3fbec73fb
commit 81108e7653
2 changed files with 114 additions and 64 deletions

View File

@@ -161,6 +161,7 @@ int search_name_hashtable(const char *key)
{ {
unsigned int probe_address = 0; unsigned int probe_address = 0;
unsigned int probe_decrement = 0; unsigned int probe_decrement = 0;
// char *temp;
make_hash(key, &probe_address, &probe_decrement, NAME_HASH_PRIME); make_hash(key, &probe_address, &probe_decrement, NAME_HASH_PRIME);
while(name_hashtable[probe_address] != NULL) { while(name_hashtable[probe_address] != NULL) {
@@ -174,7 +175,6 @@ int search_name_hashtable(const char *key)
} }
} }
name_hashtable[probe_address] = xstrdup(key); name_hashtable[probe_address] = xstrdup(key);
return(probe_address); return(probe_address);
} }
@@ -212,6 +212,7 @@ int version_compare_part(const char *version1, const char *version2)
int tmp_int; int tmp_int;
int ver_num1; int ver_num1;
int ver_num2; int ver_num2;
int ret;
if (version1 == NULL) { if (version1 == NULL) {
version1 = xstrdup(""); version1 = xstrdup("");
@@ -234,7 +235,8 @@ int version_compare_part(const char *version1, const char *version2)
free(name1_char); free(name1_char);
free(name2_char); free(name2_char);
if (tmp_int != 0) { if (tmp_int != 0) {
return(tmp_int); ret = tmp_int;
goto cleanup_version_compare_part;
} }
/* Compare digits */ /* Compare digits */
@@ -249,13 +251,17 @@ int version_compare_part(const char *version1, const char *version2)
free(name1_char); free(name1_char);
free(name2_char); free(name2_char);
if (ver_num1 < ver_num2) { if (ver_num1 < ver_num2) {
return(-1); ret = -1;
goto cleanup_version_compare_part;
} }
else if (ver_num1 > ver_num2) { else if (ver_num1 > ver_num2) {
return(1); ret = 1;
goto cleanup_version_compare_part;
} }
} }
return(0); ret = 0;
cleanup_version_compare_part:
return(ret);
} }
/* if ver1 < ver2 return -1, /* if ver1 < ver2 return -1,
@@ -499,54 +505,61 @@ unsigned int fill_package_struct(char *control_buffer)
{ {
common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t)); common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t));
char *field_name = xmalloc(sizeof(char *)); char **field_name = xmalloc(sizeof(char *));
char *field_value = xmalloc(sizeof(char *)); char **field_value = xmalloc(sizeof(char *));
int field_start = 0; int field_start = 0;
int num = -1; int num = -1;
int buffer_length = strlen(control_buffer); int buffer_length = strlen(control_buffer);
new_node->version = search_name_hashtable("unknown"); new_node->version = search_name_hashtable("unknown");
while (field_start < buffer_length) { while (field_start < buffer_length) {
field_start += read_package_field(&control_buffer[field_start], &field_name, &field_value); field_start += read_package_field(&control_buffer[field_start], field_name, field_value);
if (field_name == NULL) { if (*field_name == NULL) {
goto fill_package_struct_cleanup; // Oh no, the dreaded goto statement !! goto fill_package_struct_cleanup; // Oh no, the dreaded goto statement !!
} }
if (strcmp(field_name, "Package") == 0) { if (strcmp(*field_name, "Package") == 0) {
new_node->name = search_name_hashtable(field_value); new_node->name = search_name_hashtable(*field_value);
} }
else if (strcmp(field_name, "Version") == 0) { else if (strcmp(*field_name, "Version") == 0) {
new_node->version = search_name_hashtable(field_value); new_node->version = search_name_hashtable(*field_value);
} }
else if (strcmp(field_name, "Pre-Depends") == 0) { else if (strcmp(*field_name, "Pre-Depends") == 0) {
add_split_dependencies(new_node, field_value, EDGE_PRE_DEPENDS); add_split_dependencies(new_node, *field_value, EDGE_PRE_DEPENDS);
} }
else if (strcmp(field_name, "Depends") == 0) { else if (strcmp(*field_name, "Depends") == 0) {
add_split_dependencies(new_node, field_value, EDGE_DEPENDS); add_split_dependencies(new_node, *field_value, EDGE_DEPENDS);
} }
else if (strcmp(field_name, "Replaces") == 0) { else if (strcmp(*field_name, "Replaces") == 0) {
add_split_dependencies(new_node, field_value, EDGE_REPLACES); add_split_dependencies(new_node, *field_value, EDGE_REPLACES);
} }
else if (strcmp(field_name, "Provides") == 0) { else if (strcmp(*field_name, "Provides") == 0) {
add_split_dependencies(new_node, field_value, EDGE_PROVIDES); add_split_dependencies(new_node, *field_value, EDGE_PROVIDES);
} }
else if (strcmp(field_name, "Conflicts") == 0) { else if (strcmp(*field_name, "Conflicts") == 0) {
add_split_dependencies(new_node, field_value, EDGE_CONFLICTS); add_split_dependencies(new_node, *field_value, EDGE_CONFLICTS);
} }
else if (strcmp(field_name, "Suggests") == 0) { else if (strcmp(*field_name, "Suggests") == 0) {
add_split_dependencies(new_node, field_value, EDGE_SUGGESTS); add_split_dependencies(new_node, *field_value, EDGE_SUGGESTS);
} }
else if (strcmp(field_name, "Recommends") == 0) { else if (strcmp(*field_name, "Recommends") == 0) {
add_split_dependencies(new_node, field_value, EDGE_RECOMMENDS); add_split_dependencies(new_node, *field_value, EDGE_RECOMMENDS);
} }
else if (strcmp(field_name, "Enhances") == 0) { else if (strcmp(*field_name, "Enhances") == 0) {
add_split_dependencies(new_node, field_value, EDGE_ENHANCES); add_split_dependencies(new_node, *field_value, EDGE_ENHANCES);
} }
fill_package_struct_cleanup: fill_package_struct_cleanup:
free(field_name); if (*field_name) {
free(field_value); free(*field_name);
}
if (*field_value) {
free(*field_value);
}
} }
free(field_name);
free(field_value);
if (new_node->version == search_name_hashtable("unknown")) { if (new_node->version == search_name_hashtable("unknown")) {
free_package(new_node); free_package(new_node);
return(-1); return(-1);
@@ -615,6 +628,7 @@ void set_status(const unsigned int status_node_num, const char *new_value, const
new_status = (char *) xmalloc(want_len + flag_len + status_len + 3); new_status = (char *) xmalloc(want_len + flag_len + status_len + 3);
sprintf(new_status, "%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]); sprintf(new_status, "%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]);
status_hashtable[status_node_num]->status = search_name_hashtable(new_status); status_hashtable[status_node_num]->status = search_name_hashtable(new_status);
free(new_status);
return; return;
} }
@@ -819,7 +833,6 @@ void write_status_file(deb_file_t **deb_file)
} }
else if (strcmp("config-files", name_hashtable[state_status]) == 0) { else if (strcmp("config-files", name_hashtable[state_status]) == 0) {
/* only change the status line */ /* only change the status line */
// buffer_length = strlen(control_buffer);
while (1) { while (1) {
char *field_name; char *field_name;
char *field_value; char *field_value;
@@ -1003,6 +1016,7 @@ int check_deps(deb_file_t **deb_file, int deb_start, int dep_max_count)
} }
i++; i++;
} }
free(conflicts);
return(TRUE); return(TRUE);
} }
@@ -1091,8 +1105,10 @@ int run_package_script(const char *package_name, const char *script_type)
/* If the file doesnt exist is isnt a fatal */ /* If the file doesnt exist is isnt a fatal */
if (lstat(script_path, &path_stat) < 0) { if (lstat(script_path, &path_stat) < 0) {
free(script_path);
return(EXIT_SUCCESS); return(EXIT_SUCCESS);
} else { } else {
free(script_path);
return(system(script_path)); return(system(script_path));
} }
} }
@@ -1236,6 +1252,8 @@ void unpack_package(deb_file_t *deb_file)
/* change status */ /* change status */
set_status(status_num, "install", 1); set_status(status_num, "install", 1);
set_status(status_num, "unpacked", 3); set_status(status_num, "unpacked", 3);
free(info_prefix);
} }
void configure_package(deb_file_t *deb_file) void configure_package(deb_file_t *deb_file)
@@ -1399,6 +1417,13 @@ extern int dpkg_main(int argc, char **argv)
write_status_file(deb_file); write_status_file(deb_file);
for (i = 0; i < deb_count; i++) {
free(deb_file[i]->control_file);
free(deb_file[i]->filename);
free(deb_file[i]);
}
free(deb_file);
for (i = 0; i < NAME_HASH_PRIME; i++) { for (i = 0; i < NAME_HASH_PRIME; i++) {
if (name_hashtable[i] != NULL) { if (name_hashtable[i] != NULL) {
free(name_hashtable[i]); free(name_hashtable[i]);

89
dpkg.c
View File

@@ -161,6 +161,7 @@ int search_name_hashtable(const char *key)
{ {
unsigned int probe_address = 0; unsigned int probe_address = 0;
unsigned int probe_decrement = 0; unsigned int probe_decrement = 0;
// char *temp;
make_hash(key, &probe_address, &probe_decrement, NAME_HASH_PRIME); make_hash(key, &probe_address, &probe_decrement, NAME_HASH_PRIME);
while(name_hashtable[probe_address] != NULL) { while(name_hashtable[probe_address] != NULL) {
@@ -174,7 +175,6 @@ int search_name_hashtable(const char *key)
} }
} }
name_hashtable[probe_address] = xstrdup(key); name_hashtable[probe_address] = xstrdup(key);
return(probe_address); return(probe_address);
} }
@@ -212,6 +212,7 @@ int version_compare_part(const char *version1, const char *version2)
int tmp_int; int tmp_int;
int ver_num1; int ver_num1;
int ver_num2; int ver_num2;
int ret;
if (version1 == NULL) { if (version1 == NULL) {
version1 = xstrdup(""); version1 = xstrdup("");
@@ -234,7 +235,8 @@ int version_compare_part(const char *version1, const char *version2)
free(name1_char); free(name1_char);
free(name2_char); free(name2_char);
if (tmp_int != 0) { if (tmp_int != 0) {
return(tmp_int); ret = tmp_int;
goto cleanup_version_compare_part;
} }
/* Compare digits */ /* Compare digits */
@@ -249,13 +251,17 @@ int version_compare_part(const char *version1, const char *version2)
free(name1_char); free(name1_char);
free(name2_char); free(name2_char);
if (ver_num1 < ver_num2) { if (ver_num1 < ver_num2) {
return(-1); ret = -1;
goto cleanup_version_compare_part;
} }
else if (ver_num1 > ver_num2) { else if (ver_num1 > ver_num2) {
return(1); ret = 1;
goto cleanup_version_compare_part;
} }
} }
return(0); ret = 0;
cleanup_version_compare_part:
return(ret);
} }
/* if ver1 < ver2 return -1, /* if ver1 < ver2 return -1,
@@ -499,54 +505,61 @@ unsigned int fill_package_struct(char *control_buffer)
{ {
common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t)); common_node_t *new_node = (common_node_t *) xcalloc(1, sizeof(common_node_t));
char *field_name = xmalloc(sizeof(char *)); char **field_name = xmalloc(sizeof(char *));
char *field_value = xmalloc(sizeof(char *)); char **field_value = xmalloc(sizeof(char *));
int field_start = 0; int field_start = 0;
int num = -1; int num = -1;
int buffer_length = strlen(control_buffer); int buffer_length = strlen(control_buffer);
new_node->version = search_name_hashtable("unknown"); new_node->version = search_name_hashtable("unknown");
while (field_start < buffer_length) { while (field_start < buffer_length) {
field_start += read_package_field(&control_buffer[field_start], &field_name, &field_value); field_start += read_package_field(&control_buffer[field_start], field_name, field_value);
if (field_name == NULL) { if (*field_name == NULL) {
goto fill_package_struct_cleanup; // Oh no, the dreaded goto statement !! goto fill_package_struct_cleanup; // Oh no, the dreaded goto statement !!
} }
if (strcmp(field_name, "Package") == 0) { if (strcmp(*field_name, "Package") == 0) {
new_node->name = search_name_hashtable(field_value); new_node->name = search_name_hashtable(*field_value);
} }
else if (strcmp(field_name, "Version") == 0) { else if (strcmp(*field_name, "Version") == 0) {
new_node->version = search_name_hashtable(field_value); new_node->version = search_name_hashtable(*field_value);
} }
else if (strcmp(field_name, "Pre-Depends") == 0) { else if (strcmp(*field_name, "Pre-Depends") == 0) {
add_split_dependencies(new_node, field_value, EDGE_PRE_DEPENDS); add_split_dependencies(new_node, *field_value, EDGE_PRE_DEPENDS);
} }
else if (strcmp(field_name, "Depends") == 0) { else if (strcmp(*field_name, "Depends") == 0) {
add_split_dependencies(new_node, field_value, EDGE_DEPENDS); add_split_dependencies(new_node, *field_value, EDGE_DEPENDS);
} }
else if (strcmp(field_name, "Replaces") == 0) { else if (strcmp(*field_name, "Replaces") == 0) {
add_split_dependencies(new_node, field_value, EDGE_REPLACES); add_split_dependencies(new_node, *field_value, EDGE_REPLACES);
} }
else if (strcmp(field_name, "Provides") == 0) { else if (strcmp(*field_name, "Provides") == 0) {
add_split_dependencies(new_node, field_value, EDGE_PROVIDES); add_split_dependencies(new_node, *field_value, EDGE_PROVIDES);
} }
else if (strcmp(field_name, "Conflicts") == 0) { else if (strcmp(*field_name, "Conflicts") == 0) {
add_split_dependencies(new_node, field_value, EDGE_CONFLICTS); add_split_dependencies(new_node, *field_value, EDGE_CONFLICTS);
} }
else if (strcmp(field_name, "Suggests") == 0) { else if (strcmp(*field_name, "Suggests") == 0) {
add_split_dependencies(new_node, field_value, EDGE_SUGGESTS); add_split_dependencies(new_node, *field_value, EDGE_SUGGESTS);
} }
else if (strcmp(field_name, "Recommends") == 0) { else if (strcmp(*field_name, "Recommends") == 0) {
add_split_dependencies(new_node, field_value, EDGE_RECOMMENDS); add_split_dependencies(new_node, *field_value, EDGE_RECOMMENDS);
} }
else if (strcmp(field_name, "Enhances") == 0) { else if (strcmp(*field_name, "Enhances") == 0) {
add_split_dependencies(new_node, field_value, EDGE_ENHANCES); add_split_dependencies(new_node, *field_value, EDGE_ENHANCES);
} }
fill_package_struct_cleanup: fill_package_struct_cleanup:
free(field_name); if (*field_name) {
free(field_value); free(*field_name);
}
if (*field_value) {
free(*field_value);
}
} }
free(field_name);
free(field_value);
if (new_node->version == search_name_hashtable("unknown")) { if (new_node->version == search_name_hashtable("unknown")) {
free_package(new_node); free_package(new_node);
return(-1); return(-1);
@@ -615,6 +628,7 @@ void set_status(const unsigned int status_node_num, const char *new_value, const
new_status = (char *) xmalloc(want_len + flag_len + status_len + 3); new_status = (char *) xmalloc(want_len + flag_len + status_len + 3);
sprintf(new_status, "%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]); sprintf(new_status, "%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]);
status_hashtable[status_node_num]->status = search_name_hashtable(new_status); status_hashtable[status_node_num]->status = search_name_hashtable(new_status);
free(new_status);
return; return;
} }
@@ -819,7 +833,6 @@ void write_status_file(deb_file_t **deb_file)
} }
else if (strcmp("config-files", name_hashtable[state_status]) == 0) { else if (strcmp("config-files", name_hashtable[state_status]) == 0) {
/* only change the status line */ /* only change the status line */
// buffer_length = strlen(control_buffer);
while (1) { while (1) {
char *field_name; char *field_name;
char *field_value; char *field_value;
@@ -1003,6 +1016,7 @@ int check_deps(deb_file_t **deb_file, int deb_start, int dep_max_count)
} }
i++; i++;
} }
free(conflicts);
return(TRUE); return(TRUE);
} }
@@ -1091,8 +1105,10 @@ int run_package_script(const char *package_name, const char *script_type)
/* If the file doesnt exist is isnt a fatal */ /* If the file doesnt exist is isnt a fatal */
if (lstat(script_path, &path_stat) < 0) { if (lstat(script_path, &path_stat) < 0) {
free(script_path);
return(EXIT_SUCCESS); return(EXIT_SUCCESS);
} else { } else {
free(script_path);
return(system(script_path)); return(system(script_path));
} }
} }
@@ -1236,6 +1252,8 @@ void unpack_package(deb_file_t *deb_file)
/* change status */ /* change status */
set_status(status_num, "install", 1); set_status(status_num, "install", 1);
set_status(status_num, "unpacked", 3); set_status(status_num, "unpacked", 3);
free(info_prefix);
} }
void configure_package(deb_file_t *deb_file) void configure_package(deb_file_t *deb_file)
@@ -1399,6 +1417,13 @@ extern int dpkg_main(int argc, char **argv)
write_status_file(deb_file); write_status_file(deb_file);
for (i = 0; i < deb_count; i++) {
free(deb_file[i]->control_file);
free(deb_file[i]->filename);
free(deb_file[i]);
}
free(deb_file);
for (i = 0; i < NAME_HASH_PRIME; i++) { for (i = 0; i < NAME_HASH_PRIME; i++) {
if (name_hashtable[i] != NULL) { if (name_hashtable[i] != NULL) {
free(name_hashtable[i]); free(name_hashtable[i]);