[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: serious bug. Evolution and Microsoft mentality.



On Wed, 2002-01-09 at 16:20, Jonathan Walther wrote:
> On Wed, Jan 09, 2002 at 01:41:28PM -0500, Jeffrey Stedfast wrote:
> >> Unfortunately, no.  I made no changes whatsoever to the mailboxes.  I
> >> just entered them to see if the messages showed up, they did, then I
> >> exited.  Thats when I noticed the symlinks had been blown away, and the
> >> resulting "copied" mailbox was bigger in size than the original!
> >
> >Ah, I bet I know why... Evolution added an X-Evolution header to each
> >message for status purposes. The X-Evolution header contains an encoded
> >UID and message flags. That would also explain why it got bigger than
> >the original file.
> 
> Fair enough.  Pine does something similar.  Can it be gauranteed that
> the Quoted Printable encoding hasn't been decoded then reencoded in
> the process?

not easily. Michael Zucchi and I will have to redesign libcamel to be
able to guarantee this and so must wait until we have time.

> 
> >Actually, this isn't guaranteed to work :-(
> >rename() is unfortunately limited to renaming files on the same file
> >system, once you add symlinks to the equation - you could be leaping
> >across file system boundaries and there isn't a way to tell (well, ok,
> >so you can check st.st_dev and compare the 2).
> >
> >The only way I can think of to get around this is to create the tmp mbox
> >file in the same directory as the original (after being realpath()'d).
> >This may also have problems - what if you don't have write-permission in
> >that directory?
> 
> You solved the problem.  That is the correct solution.  After running
> realpath(), use dirname() and make the tmpfile in the same directory
> as the mailbox.
> 
[snip]

The attached patch will fix this issue.

> 
> >> Again, provided one uses Maildir mailboxes, things will be fine.  But
> >> the thought occurs, Evolution should do its "locking" on the file
> >> returned from realpath() too.
> >
> >You are probably right.
> 
> I've thought about it some more, and I'm upgrading my "maybe" to a
> strong "this is the proper way to do it".  Symlinks should not be
> locked.  They should be followed with realpath() and the real mailbox
> should be locked, like other MUA's do.  This will truly make it
> compatible and play nicely on the Unix system.

It also fixes this.

-- 
Jeffrey Stedfast
Evolution Hacker - Ximian, Inc.
fejj@ximian.com  - www.ximian.com
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/camel/ChangeLog,v
retrieving revision 1.1311.2.11
diff -u -r1.1311.2.11 ChangeLog
--- ChangeLog	2002/01/04 22:17:52	1.1311.2.11
+++ ChangeLog	2002/01/09 21:44:15
@@ -1,3 +1,11 @@
+2002-01-09  Jeffrey Stedfast  <fejj@ximian.com>
+
+	* providers/local/camel-local-folder.c
+	(camel_local_folder_construct): If the mbox file is a symlink,
+	follow the symlink and get the One True Path so that we can
+	rewrite the mbox later without worrying about clobbering the
+	symlink.
+
 2001-12-12  Jeffrey Stedfast  <fejj@ximian.com>
 
 	* camel-folder-summary.c (content_info_load): Don't try setting a
Index: providers/local/camel-local-folder.c
===================================================================
RCS file: /cvs/gnome/evolution/camel/providers/local/camel-local-folder.c,v
retrieving revision 1.22
diff -u -r1.22 camel-local-folder.c
--- providers/local/camel-local-folder.c	2001/10/28 05:10:55	1.22
+++ providers/local/camel-local-folder.c	2002/01/09 21:44:15
@@ -24,6 +24,7 @@
 #endif
 
 #include <stdlib.h>
+#include <limits.h>
 #include <sys/types.h>
 #include <dirent.h>
 #include <sys/stat.h>
@@ -191,7 +192,14 @@
 	lf->folder_path = g_strdup_printf("%s/%s", root_dir_path, full_name);
 	lf->summary_path = g_strdup_printf("%s/%s.ev-summary", root_dir_path, full_name);
 	lf->index_path = g_strdup_printf("%s/%s.ibex", root_dir_path, full_name);
-
+	
+	/* follow any symlinks to the mailbox */
+	if (lstat (lf->folder_path, &st) != -1 && S_ISLNK (st.st_mode) &&
+	    realpath (lf->folder_path, folder_path) != NULL) {
+		g_free (lf->folder_path);
+		lf->folder_path = g_strdup (folder_path);
+	}
+	
 	lf->changes = camel_folder_change_info_new();
 
 	/* if we have no index file, force it */

Reply to: