]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/contrib/strutl.cc
fix partial (206 and 416) support in https
[apt.git] / apt-pkg / contrib / strutl.cc
index 03b98e93ec4265ec6eb890483f4d065f8660693c..0955b69f79a67f538e1af0f59359f543cc3f5bb5 100644 (file)
@@ -758,7 +758,8 @@ bool ReadMessages(int Fd, vector<string> &List)
       // Look for the end of the message
       for (char *I = Buffer; I + 1 < End; I++)
       {
-        if (I[0] != '\n' || I[1] != '\n')
+        if (I[1] != '\n' ||
+              (I[0] != '\n' && strncmp(I, "\r\n\r\n", 4) != 0))
            continue;
         
         // Pull the message out
@@ -766,7 +767,7 @@ bool ReadMessages(int Fd, vector<string> &List)
         PartialMessage += Message;
 
         // Fix up the buffer
-        for (; I < End && *I == '\n'; I++);
+        for (; I < End && (*I == '\n' || *I == '\r'); ++I);
         End -= I-Buffer;        
         memmove(Buffer,I,End-Buffer);
         I = Buffer;
@@ -942,6 +943,8 @@ bool StrToTime(const string &Val,time_t &Result)
    Tm.tm_isdst = 0;
    if (Month[0] != 0)
       Tm.tm_mon = MonthConv(Month);
+   else
+      Tm.tm_mon = 0; // we don't have a month, so pick something
    Tm.tm_year -= 1900;
    
    // Convert to local time and then to GMT
@@ -1232,12 +1235,12 @@ char *safe_snprintf(char *Buffer,char *End,const char *Format,...)
    va_list args;
    int Did;
 
-   va_start(args,Format);
-
    if (End <= Buffer)
       return End;
-
+   va_start(args,Format);
    Did = vsnprintf(Buffer,End - Buffer,Format,args);
+   va_end(args);
+
    if (Did < 0 || Buffer + Did > End)
       return End;
    return Buffer + Did;
@@ -1290,6 +1293,18 @@ bool CheckDomainList(const string &Host,const string &List)
    return false;
 }
                                                                        /*}}}*/
+// strv_length - Return the length of a NULL-terminated string array   /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+size_t strv_length(const char **str_array)
+{
+   size_t i;
+   for (i=0; str_array[i] != NULL; i++)
+      /* nothing */
+      ;
+   return i;
+}
+
 // DeEscapeString - unescape (\0XX and \xXX) from a string             /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -1483,9 +1498,12 @@ URI::operator string()
           
       if (User.empty() == false)
       {
-        Res +=  User;
+        // FIXME: Technically userinfo is permitted even less
+        // characters than these, but this is not conveniently
+        // expressed with a blacklist.
+        Res += QuoteString(User, ":/?#[]@");
         if (Password.empty() == false)
-           Res += ":" + Password;
+           Res += ":" + QuoteString(Password, ":/?#[]@");
         Res += "@";
       }
       
@@ -1524,7 +1542,6 @@ string URI::SiteOnly(const string &URI)
    U.User.clear();
    U.Password.clear();
    U.Path.clear();
-   U.Port = 0;
    return U;
 }
                                                                        /*}}}*/
@@ -1536,7 +1553,6 @@ string URI::NoUserPassword(const string &URI)
    ::URI U(URI);
    U.User.clear();
    U.Password.clear();
-   U.Port = 0;
    return U;
 }
                                                                        /*}}}*/