]> git.saurik.com Git - apt.git/commitdiff
support dash-escaped text in clearsigned files as implementations are
authorDavid Kalnischkies <kalnischkies@gmail.com>
Tue, 19 Mar 2013 11:37:50 +0000 (12:37 +0100)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Tue, 19 Mar 2013 11:37:50 +0000 (12:37 +0100)
free to escape all lines (we have no lines in our files which need
 to be escaped as these would be invalid fieldnames) and while ExecGPGV
would detect dash-escaped text as invalid (as its not expected in
 messages with detached signatures) it would be possible to "comment"
lines in (signed) dsc files which are only parsed but not verified

apt-pkg/contrib/gpgv.cc
apt-pkg/contrib/gpgv.h

index 54cc4c6d0cd435dfa2822efbe2068401515c1a28..ba059dd87f85c6e6755e48b9ef68e0068e60eed8 100644 (file)
@@ -298,20 +298,21 @@ bool SplitClearSignedFile(std::string const &InFile, FileFd * const ContentFile,
               SignatureFile->Write("\n", 1);
            }
         }
-        else if (found_message_end == false)
+        else if (found_message_end == false) // we are in the message block
         {
-           // we are in the message block
+           // we don't have any fields which need dash-escaped,
+           // but implementations are free to encode all lines …
+           char const * dashfree = buf;
+           if (strncmp(dashfree, "- ", 2) == 0)
+              dashfree += 2;
            if(first_line == true) // first line does not need a newline
-           {
-              if (ContentFile != NULL)
-                 ContentFile->Write(buf, strlen(buf));
               first_line = false;
-           }
            else if (ContentFile != NULL)
-           {
               ContentFile->Write("\n", 1);
-              ContentFile->Write(buf, strlen(buf));
-           }
+           else
+              continue;
+           if (ContentFile != NULL)
+              ContentFile->Write(dashfree, strlen(dashfree));
         }
       }
       else if (found_signature == true)
@@ -333,10 +334,10 @@ bool SplitClearSignedFile(std::string const &InFile, FileFd * const ContentFile,
 
    // if we haven't found any of them, this an unsigned file,
    // so don't generate an error, but splitting was unsuccessful none-the-less
-   if (found_message_start == false && found_message_end == false)
+   if (first_line == true && found_message_start == false && found_message_end == false)
       return false;
    // otherwise one missing indicates a syntax error
-   else if (found_message_start == false || found_message_end == false)
+   else if (first_line == false || found_message_start == false || found_message_end == false)
       return _error->Error("Splitting of file %s failed as it doesn't contain all expected parts", InFile.c_str());
 
    return true;
index 1f877fc2dd0a3e003a0721f12c7dc443eba2fe7c..08b10a97ac123c44d6555281c46710fc48cdd2a9 100644 (file)
@@ -51,9 +51,6 @@ inline void ExecGPGV(std::string const &File, std::string const &FileSig,
  *  If a FileFd pointers is NULL it will not be used and the content
  *  which would have been written to it is silently discarded.
  *
- *  The code doesn't support dash-encoded lines as these are not
- *  expected to be present in files we have to deal with.
- *
  *  The content of the split files is undefined if the splitting was
  *  unsuccessful.
  *