diff options
author | Chris Wilson <chris+github@qwirx.com> | 2012-04-15 13:11:59 +0000 |
---|---|---|
committer | Chris Wilson <chris+github@qwirx.com> | 2012-04-15 13:11:59 +0000 |
commit | 4d26fe1b213426684dc312cf35e6c9bb83c430cf (patch) | |
tree | 91b3912349ca63fa076449ed8f107dd8ee5fd833 /bin | |
parent | cedb54686870fe301de6a4351eeba45c5c25932e (diff) |
Treat corrupt filenames (not decryptable) as not existing, so that
the client will flag them for deletion, and the store will eventually
prune them. We could probably recover better by flagging them for
immediate deletion (Remove_ASAP) but this is a better-tested code path.
Remove unused variable hasMultipleHardLinks.
Diffstat (limited to 'bin')
-rw-r--r-- | bin/bbackupd/BackupClientDirectoryRecord.cpp | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/bin/bbackupd/BackupClientDirectoryRecord.cpp b/bin/bbackupd/BackupClientDirectoryRecord.cpp index 31b0fd86..7ae85fcf 100644 --- a/bin/bbackupd/BackupClientDirectoryRecord.cpp +++ b/bin/bbackupd/BackupClientDirectoryRecord.cpp @@ -18,6 +18,7 @@ #include <string.h> #include "autogen_BackupProtocol.h" +#include "autogen_CipherException.h" #include "autogen_ClientException.h" #include "Archive.h" #include "BackupClientContext.h" @@ -797,9 +798,19 @@ bool BackupClientDirectoryRecord::UpdateItems( BackupStoreDirectory::Entry *en = 0; while((en = i.Next()) != 0) { - std::string filenameClear = DecryptFilename(en, - rRemotePath); - decryptedEntries[filenameClear] = en; + std::string filenameClear; + try + { + filenameClear = DecryptFilename(en, + rRemotePath); + decryptedEntries[filenameClear] = en; + } + catch (CipherException &e) + { + BOX_ERROR("Failed to decrypt a filename, " + "pretending that the file doesn't " + "exist"); + } } } @@ -820,7 +831,6 @@ bool BackupClientDirectoryRecord::UpdateItems( uint64_t attributesHash = 0; int64_t fileSize = 0; InodeRefType inodeNum = 0; - bool hasMultipleHardLinks = true; // BLOCK { // Stat the file @@ -842,7 +852,6 @@ bool BackupClientDirectoryRecord::UpdateItems( modTime = FileModificationTime(st); fileSize = st.st_size; inodeNum = st.st_ino; - hasMultipleHardLinks = (st.st_nlink > 1); attributesHash = BackupClientFileAttributes::GenerateAttributeHash(st, filename, *f); } @@ -861,7 +870,7 @@ bool BackupClientDirectoryRecord::UpdateItems( } // Check that the entry which might have been found is in fact a file - if((en != 0) && ((en->GetFlags() & BackupStoreDirectory::Entry::Flags_File) == 0)) + if((en != 0) && !(en->IsFile())) { // Directory exists in the place of this file -- sort it out RemoveDirectoryInPlaceOfFile(rParams, pDirOnStore, @@ -1324,7 +1333,7 @@ bool BackupClientDirectoryRecord::UpdateItems( } // Check that the entry which might have been found is in fact a directory - if((en != 0) && ((en->GetFlags() & BackupStoreDirectory::Entry::Flags_Dir) == 0)) + if((en != 0) && !(en->IsDir())) { // Entry exists, but is not a directory. Bad. // Get rid of it. @@ -1550,9 +1559,21 @@ bool BackupClientDirectoryRecord::UpdateItems( // If there's an error during the process, it doesn't matter if things // aren't actually deleted, as the whole state will be reset anyway. BackupClientDeleteList &rdel(rContext.GetDeleteList()); + std::string filenameClear; + bool isCorruptFilename = false; - std::string filenameClear = DecryptFilename(en, - rRemotePath); + try + { + filenameClear = DecryptFilename(en, + rRemotePath); + } + catch (CipherException &e) + { + BOX_ERROR("Failed to decrypt a filename, " + "scheduling that file for deletion"); + filenameClear = "<corrupt filename>"; + isCorruptFilename = true; + } std::string localName = MakeFullPath(rLocalPath, filenameClear); @@ -1577,7 +1598,7 @@ bool BackupClientDirectoryRecord::UpdateItems( BackupStoreFilenameClear dirname(en->GetName()); std::map<std::string, BackupClientDirectoryRecord *>::iterator e(mSubDirectories.find(filenameClear)); - if(e != mSubDirectories.end()) + if(e != mSubDirectories.end() && !isCorruptFilename) { // Carefully delete the entry from the map BackupClientDirectoryRecord *rec = e->second; |