diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2002-05-29 13:45:34 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2002-05-29 13:45:34 +0000 |
commit | a94a06a38eba7665f20c8e67cf2c424cab9ee43c (patch) | |
tree | 24fa935f9cb105f6871168d05f163620ef3cca80 | |
parent | 1d4ef2a9e9c8d8b448bcce7dea36220e220e137b (diff) | |
download | busybox-w32-a94a06a38eba7665f20c8e67cf2c424cab9ee43c.tar.gz busybox-w32-a94a06a38eba7665f20c8e67cf2c424cab9ee43c.tar.bz2 busybox-w32-a94a06a38eba7665f20c8e67cf2c424cab9ee43c.zip |
Patch from Randolfe Averty to fixup package conflict checks, cleanup some memory leaks and reorganise dependency checking.
Some further memory leaks fixed by me.
-rw-r--r-- | archival/dpkg.c | 198 | ||||
-rw-r--r-- | archival/libunarchive/unarchive.c | 4 |
2 files changed, 127 insertions, 75 deletions
diff --git a/archival/dpkg.c b/archival/dpkg.c index 6dee43f50..6cab77f38 100644 --- a/archival/dpkg.c +++ b/archival/dpkg.c | |||
@@ -487,19 +487,17 @@ void add_split_dependencies(common_node_t *parent_node, const char *whole_line, | |||
487 | 487 | ||
488 | void free_package(common_node_t *node) | 488 | void free_package(common_node_t *node) |
489 | { | 489 | { |
490 | int i; | 490 | unsigned short i; |
491 | if (node != NULL) { | 491 | if (node) { |
492 | for (i = 0; i < node->num_of_edges; i++) { | 492 | for (i = 0; i < node->num_of_edges; i++) { |
493 | if (node->edge[i] != NULL) { | 493 | if (node->edge[i]) { |
494 | free(node->edge[i]); | 494 | free(node->edge[i]); |
495 | } | 495 | } |
496 | } | 496 | } |
497 | if (node->edge != NULL) { | 497 | if (node->edge) { |
498 | free(node->edge); | 498 | free(node->edge); |
499 | } | 499 | } |
500 | if (node != NULL) { | 500 | free(node); |
501 | free(node); | ||
502 | } | ||
503 | } | 501 | } |
504 | } | 502 | } |
505 | 503 | ||
@@ -905,9 +903,8 @@ int check_deps(deb_file_t **deb_file, int deb_start, int dep_max_count) | |||
905 | int state_status; | 903 | int state_status; |
906 | int state_flag; | 904 | int state_flag; |
907 | int state_want; | 905 | int state_want; |
908 | unsigned int status_package_num; | ||
909 | int i = deb_start; | 906 | int i = deb_start; |
910 | int j, k; | 907 | int j; |
911 | 908 | ||
912 | /* Check for conflicts | 909 | /* Check for conflicts |
913 | * TODO: TEST if conflicts with other packages to be installed | 910 | * TODO: TEST if conflicts with other packages to be installed |
@@ -948,38 +945,49 @@ int check_deps(deb_file_t **deb_file, int deb_start, int dep_max_count) | |||
948 | } | 945 | } |
949 | 946 | ||
950 | /* Check conflicts */ | 947 | /* Check conflicts */ |
951 | for (i = 0; i < conflicts_num; i++) { | 948 | i = 0; |
952 | /* Check for conflicts */ | 949 | while (deb_file[i] != NULL) { |
953 | for (j = 0; j < STATUS_HASH_PRIME; j++) { | 950 | const common_node_t *package_node = package_hashtable[deb_file[i]->package]; |
954 | if (status_hashtable[j] == NULL) { | 951 | int status_num = 0; |
955 | continue; | 952 | status_num = search_status_hashtable(name_hashtable[package_node->name]); |
956 | } | 953 | |
957 | state_flag = get_status(j, 2); | 954 | if (get_status(status_num, 3) == search_name_hashtable("installed")) { |
958 | state_status = get_status(j, 3); | 955 | i++; |
959 | if ((state_status != search_name_hashtable("installed")) | 956 | continue; |
960 | && (state_flag != search_name_hashtable("want-install"))) { | 957 | } |
961 | continue; | 958 | |
962 | } | 959 | for (j = 0; j < package_node->num_of_edges; j++) { |
963 | status_package_num = status_hashtable[j]->package; | 960 | const edge_t *package_edge = package_node->edge[j]; |
964 | for (k = 0; k < package_hashtable[status_package_num]->num_of_edges; k++) { | 961 | const unsigned int package_num = |
965 | const edge_t *package_edge = package_hashtable[status_package_num]->edge[k]; | 962 | search_package_hashtable(package_edge->name, |
966 | if (package_edge->type != EDGE_CONFLICTS) { | 963 | package_edge->version, package_edge->operator); |
967 | continue; | 964 | |
968 | } | 965 | if (package_edge->type == EDGE_CONFLICTS) { |
969 | if (package_edge->name != package_hashtable[conflicts[i]]->name) { | 966 | int result = 0; |
970 | continue; | 967 | if (package_hashtable[package_num] != NULL) { |
968 | status_num = search_status_hashtable(name_hashtable[package_hashtable[package_num]->name]); | ||
969 | state_status = get_status(status_num, 3); | ||
970 | state_flag = get_status(status_num, 1); | ||
971 | |||
972 | result = (state_status == search_name_hashtable("installed")) || | ||
973 | (state_flag == search_name_hashtable("want-install")); | ||
974 | |||
975 | if (result) { | ||
976 | result = test_version(package_hashtable[deb_file[i]->package]->version, | ||
977 | package_edge->version, package_edge->operator); | ||
978 | } | ||
971 | } | 979 | } |
972 | /* There is a conflict against the package name | 980 | |
973 | * check if version conflict as well */ | 981 | if (result) { |
974 | if (test_version(package_hashtable[deb_file[i]->package]->version, | 982 | error_msg_and_die("Package %s conflicts with %s", |
975 | package_edge->version, package_edge->operator)) { | 983 | name_hashtable[package_node->name], |
976 | error_msg_and_die("Package %s conflict with %s", | 984 | name_hashtable[package_edge->name]); |
977 | name_hashtable[package_hashtable[deb_file[i]->package]->name], | ||
978 | name_hashtable[package_hashtable[status_package_num]->name]); | ||
979 | } | 985 | } |
980 | } | 986 | } |
981 | } | 987 | } |
982 | } | 988 | i++; |
989 | } | ||
990 | |||
983 | 991 | ||
984 | /* Check dependendcies */ | 992 | /* Check dependendcies */ |
985 | i = 0; | 993 | i = 0; |
@@ -987,40 +995,58 @@ int check_deps(deb_file_t **deb_file, int deb_start, int dep_max_count) | |||
987 | const common_node_t *package_node = package_hashtable[deb_file[i]->package]; | 995 | const common_node_t *package_node = package_hashtable[deb_file[i]->package]; |
988 | int status_num = 0; | 996 | int status_num = 0; |
989 | 997 | ||
998 | status_num = search_status_hashtable(name_hashtable[package_node->name]); | ||
999 | state_status = get_status(status_num, 3); | ||
1000 | state_want = get_status(status_num, 1); | ||
1001 | |||
1002 | if (state_status == search_name_hashtable("installed")) { | ||
1003 | i++; | ||
1004 | continue; | ||
1005 | } | ||
1006 | |||
990 | for (j = 0; j < package_hashtable[deb_file[i]->package]->num_of_edges; j++) { | 1007 | for (j = 0; j < package_hashtable[deb_file[i]->package]->num_of_edges; j++) { |
991 | const edge_t *package_edge = package_node->edge[j]; | 1008 | const edge_t *package_edge = package_node->edge[j]; |
992 | unsigned int package_num; | 1009 | unsigned int package_num; |
993 | 1010 | ||
994 | package_num = search_package_hashtable(package_edge->name, package_edge->version, package_edge->operator); | 1011 | package_num = search_package_hashtable(package_edge->name, package_edge->version, package_edge->operator); |
995 | if (package_hashtable[package_num] == NULL) { | ||
996 | error_msg_and_die("Dependency checking failed for package %s\nNOTE: This may be due to busybox dpkg's inability to handle the Provides field, you may avoid dependency checking using the \"-F depends\" option ", name_hashtable[package_edge->name]); | ||
997 | } | ||
998 | status_num = search_status_hashtable(name_hashtable[package_hashtable[package_num]->name]); | ||
999 | 1012 | ||
1000 | state_status = get_status(status_num, 3); | ||
1001 | state_want = get_status(status_num, 1); | ||
1002 | switch (package_edge->type) { | 1013 | switch (package_edge->type) { |
1003 | case(EDGE_PRE_DEPENDS): | 1014 | case(EDGE_PRE_DEPENDS): |
1004 | case(EDGE_OR_PRE_DEPENDS): | 1015 | case(EDGE_OR_PRE_DEPENDS): { |
1016 | int result=1; | ||
1005 | /* It must be already installed */ | 1017 | /* It must be already installed */ |
1006 | /* NOTE: This is untested, nothing apropriate in my status file */ | 1018 | /* NOTE: This is untested, nothing apropriate in my status file */ |
1007 | if ((package_hashtable[package_num] == NULL) || (state_status != search_name_hashtable("installed"))) { | 1019 | if (package_hashtable[package_num] != NULL) { |
1020 | status_num = search_status_hashtable(name_hashtable[package_hashtable[package_num]->name]); | ||
1021 | state_status = get_status(status_num, 3); | ||
1022 | state_want = get_status(status_num, 1); | ||
1023 | result = (state_status != search_name_hashtable("installed")); | ||
1024 | } | ||
1025 | |||
1026 | if (result) { | ||
1008 | error_msg_and_die("Package %s pre-depends on %s, but it is not installed", | 1027 | error_msg_and_die("Package %s pre-depends on %s, but it is not installed", |
1009 | name_hashtable[package_node->name], | 1028 | name_hashtable[package_node->name], |
1010 | name_hashtable[package_edge->name]); | 1029 | name_hashtable[package_edge->name]); |
1011 | } | 1030 | } |
1012 | break; | 1031 | break; |
1032 | } | ||
1013 | case(EDGE_DEPENDS): | 1033 | case(EDGE_DEPENDS): |
1014 | case(EDGE_OR_DEPENDS): | 1034 | case(EDGE_OR_DEPENDS): { |
1035 | int result=1; | ||
1036 | if (package_hashtable[package_num] != NULL) { | ||
1037 | status_num = search_status_hashtable(name_hashtable[package_hashtable[package_num]->name]); | ||
1038 | state_status = get_status(status_num, 3); | ||
1039 | state_want = get_status(status_num, 1); | ||
1040 | result=(state_status != search_name_hashtable("installed")) && (state_want != search_name_hashtable("want-install")); | ||
1041 | } | ||
1015 | /* It must be already installed, or to be installed */ | 1042 | /* It must be already installed, or to be installed */ |
1016 | if ((package_hashtable[package_num] == NULL) || | 1043 | if (result) { |
1017 | ((state_status != search_name_hashtable("installed")) && | ||
1018 | (state_want != search_name_hashtable("want_install")))) { | ||
1019 | error_msg_and_die("Package %s depends on %s, but it is not installed, or flaged to be installed", | 1044 | error_msg_and_die("Package %s depends on %s, but it is not installed, or flaged to be installed", |
1020 | name_hashtable[package_node->name], | 1045 | name_hashtable[package_node->name], |
1021 | name_hashtable[package_edge->name]); | 1046 | name_hashtable[package_edge->name]); |
1022 | } | 1047 | } |
1023 | break; | 1048 | break; |
1049 | } | ||
1024 | } | 1050 | } |
1025 | } | 1051 | } |
1026 | i++; | 1052 | i++; |
@@ -1032,7 +1058,7 @@ int check_deps(deb_file_t **deb_file, int deb_start, int dep_max_count) | |||
1032 | char **create_list(const char *filename) | 1058 | char **create_list(const char *filename) |
1033 | { | 1059 | { |
1034 | FILE *list_stream; | 1060 | FILE *list_stream; |
1035 | char **file_list = xmalloc(sizeof(char *)); | 1061 | char **file_list = NULL; |
1036 | char *line = NULL; | 1062 | char *line = NULL; |
1037 | int length = 0; | 1063 | int length = 0; |
1038 | int count = 0; | 1064 | int count = 0; |
@@ -1040,12 +1066,11 @@ char **create_list(const char *filename) | |||
1040 | /* dont use [xw]fopen here, handle error ourself */ | 1066 | /* dont use [xw]fopen here, handle error ourself */ |
1041 | list_stream = fopen(filename, "r"); | 1067 | list_stream = fopen(filename, "r"); |
1042 | if (list_stream == NULL) { | 1068 | if (list_stream == NULL) { |
1043 | *file_list = NULL; | 1069 | return(NULL); |
1044 | return(file_list); | ||
1045 | } | 1070 | } |
1071 | |||
1046 | while (getline(&line, &length, list_stream) != -1) { | 1072 | while (getline(&line, &length, list_stream) != -1) { |
1047 | /* +2 as we need to include space for the terminating NULL pointer */ | 1073 | file_list = xrealloc(file_list, sizeof(char *) * (count + 2)); |
1048 | file_list = xrealloc(file_list, sizeof(char *) * (length + 2)); | ||
1049 | chomp(line); | 1074 | chomp(line); |
1050 | file_list[count] = xstrdup(line); | 1075 | file_list[count] = xstrdup(line); |
1051 | count++; | 1076 | count++; |
@@ -1119,20 +1144,37 @@ int run_package_script(const char *package_name, const char *script_type) | |||
1119 | return(result); | 1144 | return(result); |
1120 | } | 1145 | } |
1121 | 1146 | ||
1122 | void all_control_list(char **remove_files, const char *package_name) | 1147 | char **all_control_list(const char *package_name) |
1123 | { | 1148 | { |
1124 | const char *all_extensions[11] = {"preinst", "postinst", "prerm", "postrm", | 1149 | const char *extensions[11] = {"preinst", "postinst", "prerm", "postrm", |
1125 | "list", "md5sums", "shlibs", "conffiles", "config", "templates", NULL }; | 1150 | "list", "md5sums", "shlibs", "conffiles", "config", "templates", NULL }; |
1126 | int i; | 1151 | unsigned short i = 0; |
1152 | char **remove_files; | ||
1127 | 1153 | ||
1128 | /* Create a list of all /var/lib/dpkg/info/<package> files */ | 1154 | /* Create a list of all /var/lib/dpkg/info/<package> files */ |
1129 | for(i = 0; i < 10; i++) { | 1155 | remove_files = malloc(sizeof(char *) * 11); |
1130 | remove_files[i] = xmalloc(strlen(package_name) + strlen(all_extensions[i]) + 21); | 1156 | while (extensions[i]) { |
1131 | sprintf(remove_files[i], "/var/lib/dpkg/info/%s.%s", package_name, all_extensions[i]); | 1157 | remove_files[i] = xmalloc(strlen(package_name) + strlen(extensions[i]) + 21); |
1158 | sprintf(remove_files[i], "/var/lib/dpkg/info/%s.%s", package_name, extensions[i]); | ||
1159 | i++; | ||
1132 | } | 1160 | } |
1133 | remove_files[10] = NULL; | 1161 | remove_files[10] = NULL; |
1162 | |||
1163 | return(remove_files); | ||
1134 | } | 1164 | } |
1135 | 1165 | ||
1166 | void free_array(char **array) | ||
1167 | { | ||
1168 | |||
1169 | if (array) { | ||
1170 | unsigned short i = 0; | ||
1171 | while (array[i]) { | ||
1172 | free(array[i]); | ||
1173 | i++; | ||
1174 | } | ||
1175 | free(array); | ||
1176 | } | ||
1177 | } | ||
1136 | 1178 | ||
1137 | /* This function lists information on the installed packages. It loops through | 1179 | /* This function lists information on the installed packages. It loops through |
1138 | * the status_hashtable to retrieve the info. This results in smaller code than | 1180 | * the status_hashtable to retrieve the info. This results in smaller code than |
@@ -1203,10 +1245,8 @@ void remove_package(const unsigned int package_num) | |||
1203 | 1245 | ||
1204 | /* Some directories cant be removed straight away, so do multiple passes */ | 1246 | /* Some directories cant be removed straight away, so do multiple passes */ |
1205 | while (remove_file_array(remove_files, exclude_files)); | 1247 | while (remove_file_array(remove_files, exclude_files)); |
1206 | 1248 | free_array(exclude_files); | |
1207 | /* Create a list of all /var/lib/dpkg/info/<package> files */ | 1249 | free_array(remove_files); |
1208 | remove_files = xmalloc(sizeof(char *) * 11); | ||
1209 | all_control_list(remove_files, package_name); | ||
1210 | 1250 | ||
1211 | /* Create a list of files in /var/lib/dpkg/info/<package>.* to keep */ | 1251 | /* Create a list of files in /var/lib/dpkg/info/<package>.* to keep */ |
1212 | exclude_files = xmalloc(sizeof(char*) * 3); | 1252 | exclude_files = xmalloc(sizeof(char*) * 3); |
@@ -1215,7 +1255,12 @@ void remove_package(const unsigned int package_num) | |||
1215 | sprintf(exclude_files[1], "/var/lib/dpkg/info/%s.postrm", package_name); | 1255 | sprintf(exclude_files[1], "/var/lib/dpkg/info/%s.postrm", package_name); |
1216 | exclude_files[2] = NULL; | 1256 | exclude_files[2] = NULL; |
1217 | 1257 | ||
1258 | /* Create a list of all /var/lib/dpkg/info/<package> files */ | ||
1259 | remove_files = all_control_list(package_name); | ||
1260 | |||
1218 | remove_file_array(remove_files, exclude_files); | 1261 | remove_file_array(remove_files, exclude_files); |
1262 | free_array(remove_files); | ||
1263 | free_array(exclude_files); | ||
1219 | 1264 | ||
1220 | /* rename <package>.conffile to <package>.list */ | 1265 | /* rename <package>.conffile to <package>.list */ |
1221 | rename(conffile_name, list_name); | 1266 | rename(conffile_name, list_name); |
@@ -1242,16 +1287,18 @@ void purge_package(const unsigned int package_num) | |||
1242 | sprintf(list_name, "/var/lib/dpkg/info/%s.list", package_name); | 1287 | sprintf(list_name, "/var/lib/dpkg/info/%s.list", package_name); |
1243 | remove_files = create_list(list_name); | 1288 | remove_files = create_list(list_name); |
1244 | 1289 | ||
1245 | exclude_files = xmalloc(1); | 1290 | exclude_files = xmalloc(sizeof(char*)); |
1246 | exclude_files[0] = NULL; | 1291 | exclude_files[0] = NULL; |
1247 | 1292 | ||
1248 | /* Some directories cant be removed straight away, so do multiple passes */ | 1293 | /* Some directories cant be removed straight away, so do multiple passes */ |
1249 | while (remove_file_array(remove_files, exclude_files)); | 1294 | while (remove_file_array(remove_files, exclude_files)); |
1295 | free_array(remove_files); | ||
1250 | 1296 | ||
1251 | /* Create a list of all /var/lib/dpkg/info/<package> files */ | 1297 | /* Create a list of all /var/lib/dpkg/info/<package> files */ |
1252 | remove_files = xmalloc(sizeof(char *) * 11); | 1298 | remove_files = all_control_list(package_name); |
1253 | all_control_list(remove_files, package_name); | ||
1254 | remove_file_array(remove_files, exclude_files); | 1299 | remove_file_array(remove_files, exclude_files); |
1300 | free_array(remove_files); | ||
1301 | free(exclude_files); | ||
1255 | 1302 | ||
1256 | /* run postrm script */ | 1303 | /* run postrm script */ |
1257 | if (run_package_script(package_name, "postrm") == -1) { | 1304 | if (run_package_script(package_name, "postrm") == -1) { |
@@ -1284,7 +1331,7 @@ void unpack_package(deb_file_t *deb_file) | |||
1284 | } | 1331 | } |
1285 | 1332 | ||
1286 | /* Extract control.tar.gz to /var/lib/dpkg/info/<package>.filename */ | 1333 | /* Extract control.tar.gz to /var/lib/dpkg/info/<package>.filename */ |
1287 | info_prefix = (char *) xmalloc(sizeof(package_name) + 20 + 4 + 2); | 1334 | info_prefix = (char *) xmalloc(strlen(package_name) + 20 + 4 + 2); |
1288 | sprintf(info_prefix, "/var/lib/dpkg/info/%s.", package_name); | 1335 | sprintf(info_prefix, "/var/lib/dpkg/info/%s.", package_name); |
1289 | deb_extract(deb_file->filename, stdout, (extract_quiet | extract_control_tar_gz | extract_all_to_fs | extract_unconditional), info_prefix, NULL); | 1336 | deb_extract(deb_file->filename, stdout, (extract_quiet | extract_control_tar_gz | extract_all_to_fs | extract_unconditional), info_prefix, NULL); |
1290 | 1337 | ||
@@ -1328,7 +1375,7 @@ void configure_package(deb_file_t *deb_file) | |||
1328 | set_status(status_num, "installed", 3); | 1375 | set_status(status_num, "installed", 3); |
1329 | } | 1376 | } |
1330 | 1377 | ||
1331 | extern int dpkg_main(int argc, char **argv) | 1378 | int dpkg_main(int argc, char **argv) |
1332 | { | 1379 | { |
1333 | deb_file_t **deb_file = NULL; | 1380 | deb_file_t **deb_file = NULL; |
1334 | status_node_t *status_node; | 1381 | status_node_t *status_node; |
@@ -1388,8 +1435,9 @@ extern int dpkg_main(int argc, char **argv) | |||
1388 | } | 1435 | } |
1389 | 1436 | ||
1390 | /* Read arguments and store relevant info in structs */ | 1437 | /* Read arguments and store relevant info in structs */ |
1391 | deb_file = xmalloc(sizeof(deb_file_t)); | ||
1392 | while (optind < argc) { | 1438 | while (optind < argc) { |
1439 | /* deb_count = nb_elem - 1 and we need nb_elem + 1 to allocate terminal node [NULL pointer] */ | ||
1440 | deb_file = xrealloc(deb_file, sizeof(deb_file_t *) * (deb_count + 2)); | ||
1393 | deb_file[deb_count] = (deb_file_t *) xmalloc(sizeof(deb_file_t)); | 1441 | deb_file[deb_count] = (deb_file_t *) xmalloc(sizeof(deb_file_t)); |
1394 | if (dpkg_opt & dpkg_opt_filename) { | 1442 | if (dpkg_opt & dpkg_opt_filename) { |
1395 | deb_file[deb_count]->filename = xstrdup(argv[optind]); | 1443 | deb_file[deb_count]->filename = xstrdup(argv[optind]); |
@@ -1408,7 +1456,6 @@ extern int dpkg_main(int argc, char **argv) | |||
1408 | if ((dpkg_opt & dpkg_opt_unpack) || (dpkg_opt & dpkg_opt_install)) { | 1456 | if ((dpkg_opt & dpkg_opt_unpack) || (dpkg_opt & dpkg_opt_install)) { |
1409 | status_node = (status_node_t *) xmalloc(sizeof(status_node_t)); | 1457 | status_node = (status_node_t *) xmalloc(sizeof(status_node_t)); |
1410 | status_node->package = deb_file[deb_count]->package; | 1458 | status_node->package = deb_file[deb_count]->package; |
1411 | |||
1412 | /* Try and find a currently installed version of this package */ | 1459 | /* Try and find a currently installed version of this package */ |
1413 | status_num = search_status_hashtable(name_hashtable[package_hashtable[deb_file[deb_count]->package]->name]); | 1460 | status_num = search_status_hashtable(name_hashtable[package_hashtable[deb_file[deb_count]->package]->name]); |
1414 | /* If no previous entry was found initialise a new entry */ | 1461 | /* If no previous entry was found initialise a new entry */ |
@@ -1416,10 +1463,10 @@ extern int dpkg_main(int argc, char **argv) | |||
1416 | (status_hashtable[status_num]->status == 0)) { | 1463 | (status_hashtable[status_num]->status == 0)) { |
1417 | /* reinstreq isnt changed to "ok" until the package control info | 1464 | /* reinstreq isnt changed to "ok" until the package control info |
1418 | * is written to the status file*/ | 1465 | * is written to the status file*/ |
1419 | status_node->status = search_name_hashtable("install reinstreq not-installed"); | 1466 | status_node->status = search_name_hashtable("want-install reinstreq not-installed"); |
1420 | status_hashtable[status_num] = status_node; | 1467 | status_hashtable[status_num] = status_node; |
1421 | } else { | 1468 | } else { |
1422 | status_hashtable[status_num]->status = search_name_hashtable("install reinstreq installed"); | 1469 | status_hashtable[status_num]->status = search_name_hashtable("want-install reinstreq not-installed"); |
1423 | } | 1470 | } |
1424 | } | 1471 | } |
1425 | } | 1472 | } |
@@ -1488,6 +1535,7 @@ extern int dpkg_main(int argc, char **argv) | |||
1488 | free(deb_file[i]->filename); | 1535 | free(deb_file[i]->filename); |
1489 | free(deb_file[i]); | 1536 | free(deb_file[i]); |
1490 | } | 1537 | } |
1538 | |||
1491 | free(deb_file); | 1539 | free(deb_file); |
1492 | 1540 | ||
1493 | for (i = 0; i < NAME_HASH_PRIME; i++) { | 1541 | for (i = 0; i < NAME_HASH_PRIME; i++) { |
@@ -1497,7 +1545,9 @@ extern int dpkg_main(int argc, char **argv) | |||
1497 | } | 1545 | } |
1498 | 1546 | ||
1499 | for (i = 0; i < PACKAGE_HASH_PRIME; i++) { | 1547 | for (i = 0; i < PACKAGE_HASH_PRIME; i++) { |
1500 | free_package(package_hashtable[i]); | 1548 | if (package_hashtable[i] != NULL) { |
1549 | free_package(package_hashtable[i]); | ||
1550 | } | ||
1501 | } | 1551 | } |
1502 | 1552 | ||
1503 | for (i = 0; i < STATUS_HASH_PRIME; i++) { | 1553 | for (i = 0; i < STATUS_HASH_PRIME; i++) { |
diff --git a/archival/libunarchive/unarchive.c b/archival/libunarchive/unarchive.c index 49908affb..312b498a1 100644 --- a/archival/libunarchive/unarchive.c +++ b/archival/libunarchive/unarchive.c | |||
@@ -192,7 +192,9 @@ char *extract_archive(FILE *src_stream, FILE *out_stream, const file_header_t *f | |||
192 | fprintf(out_stream, "%s\n", full_name); | 192 | fprintf(out_stream, "%s\n", full_name); |
193 | } | 193 | } |
194 | 194 | ||
195 | free(full_name); | 195 | if (prefix != NULL) { |
196 | free(full_name); | ||
197 | } | ||
196 | 198 | ||
197 | return(NULL); /* Maybe we should say if failed */ | 199 | return(NULL); /* Maybe we should say if failed */ |
198 | } | 200 | } |