dpkg: delete postrm script after it's run, not before. closes bug 449
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 25 Jul 2009 09:52:32 +0000 (11:52 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 25 Jul 2009 09:52:32 +0000 (11:52 +0200)
function                                             old     new   delta
purge_package                                        220     252     +32

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
archival/dpkg.c

index 577b77fec617d41c00ad4d53c09b7caa6e46b11c..abeb16238ebb28d85d6e94a550a98814dc104367 100644 (file)
@@ -1354,8 +1354,8 @@ static void remove_package(const unsigned package_num, int noisy)
        free_array(exclude_files);
        free_array(remove_files);
 
-       /* Create a list of files in /var/lib/dpkg/info/<package>.* to keep  */
-       exclude_files = xzalloc(sizeof(char*) * 3);
+       /* Create a list of files in /var/lib/dpkg/info/<package>.* to keep */
+       exclude_files = xzalloc(sizeof(exclude_files[0]) * 3);
        exclude_files[0] = xstrdup(conffile_name);
        exclude_files[1] = xasprintf("/var/lib/dpkg/info/%s.%s", package_name, "postrm");
 
@@ -1393,20 +1393,25 @@ static void purge_package(const unsigned package_num)
        sprintf(list_name, "/var/lib/dpkg/info/%s.%s", package_name, "list");
        remove_files = create_list(list_name);
 
-       exclude_files = xzalloc(sizeof(char*));
-
        /* Some directories cant be removed straight away, so do multiple passes */
-       while (remove_file_array(remove_files, exclude_files)) /* repeat */;
+       while (remove_file_array(remove_files, NULL))
+               continue;
        free_array(remove_files);
 
        /* Create a list of all /var/lib/dpkg/info/<package> files */
        remove_files = all_control_list(package_name);
+
+       /* Delete all of them except the postrm script */
+       exclude_files = xzalloc(sizeof(exclude_files[0]) * 2);
+       exclude_files[0] = xasprintf("/var/lib/dpkg/info/%s.%s", package_name, "postrm");
        remove_file_array(remove_files, exclude_files);
-       free_array(remove_files);
-       free(exclude_files);
+       free_array(exclude_files);
 
-       /* Run postrm script */
+       /* Run and remove postrm script */
        run_package_script_or_die(package_name, "postrm");
+       remove_file_array(remove_files, NULL);
+
+       free_array(remove_files);
 
        /* Change package status */
        set_status(status_num, "not-installed", 3);