mirror of
https://github.com/vgough/encfs.git
synced 2024-11-24 17:03:13 +01:00
fix launchpad bug #201974, encfsctl export failed on symlinks
git-svn-id: http://encfs.googlecode.com/svn/trunk@17 db9cf616-1c43-0410-9cb8-a902689de0d6
This commit is contained in:
parent
6d081f5c99
commit
acaa244cbc
44
ChangeLog
44
ChangeLog
@ -1,3 +1,47 @@
|
|||||||
|
|
||||||
|
Sun Apr 13 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* switch to V6 XML config format using boost serialization module
|
||||||
|
* add better boost autoconf detection
|
||||||
|
|
||||||
|
Fri Apr 11 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* bump version to 1.4.2
|
||||||
|
* add zero-block pass-through option, enabling allow-holes code
|
||||||
|
* add error checking to setfsuid/setfsgid calls
|
||||||
|
|
||||||
|
Tue Mar 25 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* check for additional arguments to xattr functions
|
||||||
|
|
||||||
|
Sat Mar 22 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* remove ulockmgr support, since it isn't needed
|
||||||
|
|
||||||
|
Sun Jan 27 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* fix compile problem if ulockmgr isn't available
|
||||||
|
|
||||||
|
Tue Jan 22 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* ensure paths end in '/'. fixes launchpad bug 184905
|
||||||
|
|
||||||
|
Wed Jan 16 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* no arg required for stdinpass, reported by Scott Hendrickson
|
||||||
|
|
||||||
|
Tue Jan 15 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* bump version to 1.4.1.1
|
||||||
|
* dump shared library version
|
||||||
|
* fix directory rename issue (launchpad bug #183358)
|
||||||
|
|
||||||
|
Sat Jan 12 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* more minor changes to password lengths. Accept up to 512 bytes for
|
||||||
|
text password
|
||||||
|
* update man docs
|
||||||
|
|
||||||
|
Fri Jan 11 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* bump version to 1.4.1
|
||||||
|
* make max-password lengths consistent. Fix newline quashing, bug
|
||||||
|
report by mpb
|
||||||
|
|
||||||
|
Tue Jan 8 2008 Valient Gough <vgough@pobox.com>
|
||||||
|
* determine symbolic link size in getAttr call
|
||||||
|
* remove old HAVE_SSL wrappers on MemoryPool
|
||||||
|
|
||||||
Sun Jan 6 22:26:25 PST 2008 Valient Gough <vgough@pobox.com>
|
Sun Jan 6 22:26:25 PST 2008 Valient Gough <vgough@pobox.com>
|
||||||
* fix SSL test to keep -lssl at end of compile line,
|
* fix SSL test to keep -lssl at end of compile line,
|
||||||
found by Kenny Simpson
|
found by Kenny Simpson
|
||||||
|
@ -167,13 +167,17 @@ int _do_getattr(FileNode *fnode, struct stat *stbuf)
|
|||||||
scoped_array<char> buf(new char[stbuf->st_size+1]);
|
scoped_array<char> buf(new char[stbuf->st_size+1]);
|
||||||
|
|
||||||
res = ::readlink( fnode->cipherName(), buf.get(), stbuf->st_size );
|
res = ::readlink( fnode->cipherName(), buf.get(), stbuf->st_size );
|
||||||
// other functions expect c-strings to be null-terminated, which
|
if(res >= 0)
|
||||||
// readlink doesn't provide
|
{
|
||||||
buf[res] = '\0';
|
// other functions expect c-strings to be null-terminated, which
|
||||||
|
// readlink doesn't provide
|
||||||
|
buf[res] = '\0';
|
||||||
|
|
||||||
stbuf->st_size = FSRoot->plainPath( buf.get() ).length();
|
stbuf->st_size = FSRoot->plainPath( buf.get() ).length();
|
||||||
|
|
||||||
res = ESUCCESS;
|
res = ESUCCESS;
|
||||||
|
} else
|
||||||
|
res = -errno;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,6 +42,8 @@
|
|||||||
|
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
|
#include <boost/scoped_array.hpp>
|
||||||
|
|
||||||
#ifdef HAVE_SSL
|
#ifdef HAVE_SSL
|
||||||
#define NO_DES
|
#define NO_DES
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
@ -50,6 +52,7 @@
|
|||||||
using namespace rlog;
|
using namespace rlog;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace gnu;
|
using namespace gnu;
|
||||||
|
using namespace boost;
|
||||||
|
|
||||||
|
|
||||||
static int showInfo( int argc, char **argv );
|
static int showInfo( int argc, char **argv );
|
||||||
@ -333,7 +336,7 @@ int processContents( const shared_ptr<EncFS_Root> &rootInfo,
|
|||||||
O_RDONLY, &errCode );
|
O_RDONLY, &errCode );
|
||||||
if(!node)
|
if(!node)
|
||||||
{
|
{
|
||||||
cerr << "unable to open " << path << endl;
|
cerr << "unable to open " << path << "\n";
|
||||||
return errCode;
|
return errCode;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
@ -379,6 +382,31 @@ static int cmd_cat( int argc, char **argv )
|
|||||||
return errCode;
|
return errCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int copyLink(const struct stat &stBuf,
|
||||||
|
const shared_ptr<EncFS_Root> &rootInfo,
|
||||||
|
const string &cpath, const string &destName )
|
||||||
|
{
|
||||||
|
scoped_array<char> buf(new char[stBuf.st_size+1]);
|
||||||
|
int res = ::readlink( cpath.c_str(), buf.get(), stBuf.st_size );
|
||||||
|
if(res == -1)
|
||||||
|
{
|
||||||
|
cerr << "unable to readlink of " << cpath << "\n";
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[res] = '\0';
|
||||||
|
string decodedLink = rootInfo->root->plainPath(buf.get());
|
||||||
|
|
||||||
|
res = ::symlink( decodedLink.c_str(), destName.c_str() );
|
||||||
|
if(res == -1)
|
||||||
|
{
|
||||||
|
cerr << "unable to create symlink for " << cpath
|
||||||
|
<< " to " << decodedLink << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int copyContents(const shared_ptr<EncFS_Root> &rootInfo,
|
static int copyContents(const shared_ptr<EncFS_Root> &rootInfo,
|
||||||
const char* encfsName, const char* targetName)
|
const char* encfsName, const char* targetName)
|
||||||
{
|
{
|
||||||
@ -387,7 +415,7 @@ static int copyContents(const shared_ptr<EncFS_Root> &rootInfo,
|
|||||||
|
|
||||||
if(!node)
|
if(!node)
|
||||||
{
|
{
|
||||||
cerr << "unable to open " << encfsName << endl;
|
cerr << "unable to open " << encfsName << "\n";
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
@ -403,7 +431,7 @@ static int copyContents(const shared_ptr<EncFS_Root> &rootInfo,
|
|||||||
|
|
||||||
if(readlink (d.c_str(), linkContents, PATH_MAX + 1) <= 0)
|
if(readlink (d.c_str(), linkContents, PATH_MAX + 1) <= 0)
|
||||||
{
|
{
|
||||||
cerr << "unable to read link " << encfsName << endl;
|
cerr << "unable to read link " << encfsName << "\n";
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
symlink(rootInfo->root->plainPath(linkContents).c_str(),
|
symlink(rootInfo->root->plainPath(linkContents).c_str(),
|
||||||
@ -461,17 +489,29 @@ static int traverseDirs(const shared_ptr<EncFS_Root> &rootInfo,
|
|||||||
string cpath = rootInfo->root->cipherPath(plainPath.c_str());
|
string cpath = rootInfo->root->cipherPath(plainPath.c_str());
|
||||||
string destName = destDir + name;
|
string destName = destDir + name;
|
||||||
|
|
||||||
if(isDirectory(cpath.c_str()))
|
int r = EXIT_SUCCESS;
|
||||||
traverseDirs(rootInfo, (plainPath + '/').c_str(),
|
struct stat stBuf;
|
||||||
destName + '/');
|
if( !lstat( cpath.c_str(), &stBuf ))
|
||||||
else
|
|
||||||
{
|
{
|
||||||
int r = copyContents(rootInfo, plainPath.c_str(),
|
if( S_ISDIR( stBuf.st_mode ) )
|
||||||
destName.c_str());
|
{
|
||||||
|
traverseDirs(rootInfo, (plainPath + '/').c_str(),
|
||||||
if(r != EXIT_SUCCESS)
|
destName + '/');
|
||||||
return r;
|
} else if( S_ISLNK( stBuf.st_mode ))
|
||||||
|
{
|
||||||
|
r = copyLink( stBuf, rootInfo, cpath, destName );
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
r = copyContents(rootInfo, plainPath.c_str(),
|
||||||
|
destName.c_str());
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
r = EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(r != EXIT_SUCCESS)
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -707,7 +747,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if(commands[offset].name == 0)
|
if(commands[offset].name == 0)
|
||||||
{
|
{
|
||||||
cerr << autosprintf(_("invalid command: \"%s\""), argv[1]) << endl;
|
cerr << autosprintf(_("invalid command: \"%s\""), argv[1]) << "\n";
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
if((argc-2 < commands[offset].minOptions) ||
|
if((argc-2 < commands[offset].minOptions) ||
|
||||||
@ -715,7 +755,7 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
cerr << autosprintf(
|
cerr << autosprintf(
|
||||||
_("Incorrect number of arguments for command \"%s\""),
|
_("Incorrect number of arguments for command \"%s\""),
|
||||||
argv[1]) << endl;
|
argv[1]) << "\n";
|
||||||
} else
|
} else
|
||||||
return (*commands[offset].func)( argc-1, argv+1 );
|
return (*commands[offset].func)( argc-1, argv+1 );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user