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