Ok, I can reproduce the problem.   Paranoia mode enables iv-chaining, so a 
rename of a directory requires a recursive rename.  And external-iv-chaining 
is also enabled, so a file rename requires a re-encoding of the per-file 
header.  However a symbolic link doesn't have a per-file header, so it fails, 
causing the rename to be aborted and any changes to be undone.

Please try the attached patch.  I've only done a quick sanity check to make 
sure it fixes this particular problem -- I will do more testing on this in a 
few days when I have more time.

thanks,
Valient

On Sunday 26 June 2005 19:05, Tim Freeman wrote:
> Aha.  I left out how I configured the filesystem.  I specified "p" to
> get paranoid mode, and apparently you selected the default option.  On
> my machine (using your recent encfs 1.2.2.2-1 deb), I reliably see the
> problem when I specify paranoid mode, and I don't see it when I take
> the default.
>
> Can you reproduce the problem now?  To save you digging through email,
> here's what I did:
>
> [EMAIL PROTECTED]:/tmp$ rm -rf foo foo.bits
> [EMAIL PROTECTED]:/tmp$ mkdir foo foo.bits
> [EMAIL PROTECTED]:/tmp$ encfs /tmp/foo.bits /tmp/foo
> Creating new encrypted volume.
> Please choose from one of the following options:
>  enter "x" for expert configuration mode,
>  enter "p" for pre-configured paranoia mode,
>  anything else, or an empty line will select standard mode.
> ?> p
>
> Paranoia configuration selected.
>
> Configuration finished.  The filesystem to be created has
> the following properties:
> Filesystem cipher: "ssl/aes", version 2:1:1
> Filename encoding: "nameio/block", version 3:0:1
> Key Size: 256 bits
> Block Size: 512 bytes, including 8 byte MAC header
> Each file contains 8 byte header with unique IV data.
> Filenames encoded using IV chaining mode.
> File data IV is chained to filename IV.
>
> -------------------------- WARNING --------------------------
> The external initialization-vector chaining option has been
> enabled.  This option disables the use of hard links on the
> filesystem. Without hard links, some programs may not work.
> The programs 'mutt' and 'procmail' are known to fail.  For
> more information, please see the encfs mailing list.
> If you would like to choose another configuration setting,
> please press CTRL-C now to abort and start over.
>
> Now you will need to enter a password for your filesystem.
> You will need to remember this password, as there is absolutely
> no recovery mechanism.  However, the password can be changed
> later using encfsctl.
>
> New Encfs Password: x
>
> Verify Encfs Password: x
>
> [EMAIL PROTECTED]:/tmp$ cd foo
> [EMAIL PROTECTED]:/tmp/foo$ mkdir bar
> [EMAIL PROTECTED]:/tmp/foo$ ln -s ../baz bar/baz
> [EMAIL PROTECTED]:/tmp/foo$ mv bar bozzo
> mv: cannot move `bar' to `bozzo': Permission denied
> [EMAIL PROTECTED]:/tmp/foo$
--- old-encfs-1.2/encfs/FileNode.cpp	2005-05-17 21:01:55.000000000 +0200
+++ new-encfs-1.2/encfs/FileNode.cpp	2005-06-28 14:31:26.000000000 +0200
@@ -21,6 +21,7 @@
 
 #include <errno.h>
 #include <sys/stat.h>
+#include <sys/types.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/fsuid.h>
@@ -129,6 +130,19 @@
     return _pname.c_str();
 }
 
+static bool setIV(const Ptr<FileIO> &io, uint64_t iv)
+{
+    struct stat stbuf;
+    if(io->getAttr(&stbuf) < 0)
+	return false;
+
+    // only use setIV if the file is a regular (not link, etc)
+    if(S_ISREG(stbuf.st_mode))
+	return io->setIV( iv );
+    else
+	return true;
+}
+
 bool FileNode::setName( const char *plaintextName_, const char *cipherName_,
 	uint64_t iv, bool setIVFirst )
 {
@@ -137,7 +151,7 @@
     rDebug("calling setIV on %s", cipherName_);
     if(setIVFirst)
     {
-	if(externalIVChaining && !io->setIV( iv ))
+	if(externalIVChaining && !setIV(io, iv))
 	    return false;
 
 	// now change the name..
@@ -161,7 +175,7 @@
 	    io->setFileName( cipherName_ );
 	}
 
-	if(externalIVChaining && !io->setIV( iv ))
+	if(externalIVChaining && !setIV(io, iv))
 	{
 	    _pname = oldPName;
 	    _cname = oldCName;

Attachment: pgpVjdfKgkCth.pgp
Description: PGP signature

Reply via email to