dovecot-2.0: lib-storage: Fixed deleting symlinked mailbox.

dovecot at dovecot.org dovecot at dovecot.org
Thu Dec 30 13:45:13 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/b78e772cf1d2
changeset: 12534:b78e772cf1d2
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Dec 30 13:45:11 2010 +0200
description:
lib-storage: Fixed deleting symlinked mailbox.

diffstat:

 src/lib-storage/list/mailbox-list-delete.c       |  22 ++++++++++++++++++----
 src/lib-storage/list/mailbox-list-delete.h       |   1 +
 src/lib-storage/list/mailbox-list-maildir-iter.c |   3 ++-
 3 files changed, 21 insertions(+), 5 deletions(-)

diffs (87 lines):

diff -r c67f4a2a2253 -r b78e772cf1d2 src/lib-storage/list/mailbox-list-delete.c
--- a/src/lib-storage/list/mailbox-list-delete.c	Thu Dec 30 13:41:10 2010 +0200
+++ b/src/lib-storage/list/mailbox-list-delete.c	Thu Dec 30 13:45:11 2010 +0200
@@ -97,7 +97,7 @@
 		if (trash_dir == trash_dest) {
 			trash_dest = t_strconcat(trash_dir, "/",
 						 unique_fname(), NULL);
-		} else if (unlink_directory(trash_dest, TRUE) < 0 &&
+		} else if (mailbox_list_delete_trash(trash_dest) < 0 &&
 			   (errno != ENOTEMPTY || count >= 5)) {
 			mailbox_list_set_critical(list,
 				"unlink_directory(%s) failed: %m", trash_dest);
@@ -105,7 +105,7 @@
 		}
 	}
 
-	if (unlink_directory(trash_dir, TRUE) < 0 &&
+	if (mailbox_list_delete_trash(trash_dir) < 0 &&
 	    errno != ENOTEMPTY && errno != EBUSY) {
 		mailbox_list_set_critical(list,
 			"unlink_directory(%s) failed: %m", trash_dir);
@@ -189,7 +189,7 @@
 		str_append(full_path, d->d_name);
 
 		if (mailbox_dir) {
-			if (unlink_directory(str_c(full_path), TRUE) < 0) {
+			if (mailbox_list_delete_trash(str_c(full_path)) < 0) {
 				mailbox_list_set_critical(list,
 					"unlink_directory(%s) failed: %m",
 					str_c(full_path));
@@ -297,7 +297,7 @@
 							     rmdir_path) < 0)
 			return;
 	} else {
-		if (unlink_directory(path, TRUE) < 0 &&
+		if (mailbox_list_delete_trash(path) < 0 &&
 		    errno != ENOENT && errno != ENOTEMPTY) {
 			mailbox_list_set_critical(list,
 				"unlink_directory(%s) failed: %m", path);
@@ -314,3 +314,17 @@
 	mailbox_list_try_delete(list, name, MAILBOX_LIST_PATH_TYPE_CONTROL);
 	mailbox_list_try_delete(list, name, MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX);
 }
+
+int mailbox_list_delete_trash(const char *path)
+{
+	if (unlink_directory(path, TRUE) < 0) {
+		if (errno == ELOOP) {
+			/* it's a symlink? try just deleting it */
+			if (unlink(path) == 0)
+				return 0;
+			errno = ELOOP;
+			return -1;
+		}
+	}
+	return 0;
+}
diff -r c67f4a2a2253 -r b78e772cf1d2 src/lib-storage/list/mailbox-list-delete.h
--- a/src/lib-storage/list/mailbox-list-delete.h	Thu Dec 30 13:41:10 2010 +0200
+++ b/src/lib-storage/list/mailbox-list-delete.h	Thu Dec 30 13:45:11 2010 +0200
@@ -15,5 +15,6 @@
 
 void mailbox_list_delete_until_root(struct mailbox_list *list, const char *path,
 				    enum mailbox_list_path_type type);
+int mailbox_list_delete_trash(const char *path);
 
 #endif
diff -r c67f4a2a2253 -r b78e772cf1d2 src/lib-storage/list/mailbox-list-maildir-iter.c
--- a/src/lib-storage/list/mailbox-list-maildir-iter.c	Thu Dec 30 13:41:10 2010 +0200
+++ b/src/lib-storage/list/mailbox-list-maildir-iter.c	Thu Dec 30 13:45:11 2010 +0200
@@ -6,6 +6,7 @@
 #include "unlink-directory.h"
 #include "imap-match.h"
 #include "mailbox-tree.h"
+#include "mailbox-list-delete.h"
 #include "mailbox-list-subscriptions.h"
 #include "mailbox-list-maildir.h"
 
@@ -256,7 +257,7 @@
 	path = t_strdup_printf("%s/%s", ctx->dir, fname);
 	if (stat(path, &st) == 0 &&
 	    st.st_mtime < ioloop_time - 3600)
-		(void)unlink_directory(path, TRUE);
+		(void)mailbox_list_delete_trash(path);
 
 	return TRUE;
 }


More information about the dovecot-cvs mailing list