Tim Waugh 258119
diff -up cups-1.4.2/CHANGES.txt.str3381 cups-1.4.2/CHANGES.txt
Tim Waugh 258119
--- cups-1.4.2/CHANGES.txt.str3381	2009-11-09 23:01:17.000000000 +0000
Tim Waugh 258119
+++ cups-1.4.2/CHANGES.txt	2009-11-16 10:55:21.518666538 +0000
Tim Waugh 258119
@@ -1,6 +1,11 @@
Tim Waugh 258119
-CHANGES.txt - 2009-11-09
Tim Waugh 258119
+CHANGES.txt - 2009-11-13
Tim Waugh 258119
 ------------------------
Tim Waugh 258119
 
Tim Waugh 258119
+CHANGES IN CUPS V1.4.3
Tim Waugh 258119
+
Tim Waugh 258119
+	- Fixed a GNU TLS error handling bug (STR #3381)
Tim Waugh 258119
+
Tim Waugh 258119
+
Tim Waugh 258119
 CHANGES IN CUPS V1.4.2
Tim Waugh 258119
 
Tim Waugh 258119
 	- SECURITY: The CUPS web interface was vulnerable to several XSS and
Tim Waugh 258119
diff -up cups-1.4.2/cups/http.c.str3381 cups-1.4.2/cups/http.c
Tim Waugh 258119
--- cups-1.4.2/cups/http.c.str3381	2009-07-01 16:23:28.000000000 +0100
Tim Waugh 258119
+++ cups-1.4.2/cups/http.c	2009-11-16 10:55:21.520666380 +0000
Tim Waugh 258119
@@ -26,7 +26,6 @@
Tim Waugh 258119
  *   httpClearCookie()    - Clear the cookie value(s).
Tim Waugh 258119
  *   httpClearFields()    - Clear HTTP request fields.
Tim Waugh 258119
  *   httpClose()          - Close an HTTP connection...
Tim Waugh 258119
- *   httpConnect()        - Connect to a HTTP server.
Tim Waugh 258119
  *   httpConnectEncrypt() - Connect to a HTTP server using encryption.
Tim Waugh 258119
  *   _httpCreate()        - Create an unconnected HTTP connection.
Tim Waugh 258119
  *   httpDelete()         - Send a DELETE request to the server.
Tim Waugh 258119
@@ -721,7 +720,7 @@ httpGetField(http_t       *http,	/* I - 
Tim Waugh 258119
 {
Tim Waugh 258119
   if (!http || field <= HTTP_FIELD_UNKNOWN || field >= HTTP_FIELD_MAX)
Tim Waugh 258119
     return (NULL);
Tim Waugh 258119
-  else if (field == HTTP_FIELD_AUTHORIZATION && 
Tim Waugh 258119
+  else if (field == HTTP_FIELD_AUTHORIZATION &&
Tim Waugh 258119
 	   http->field_authorization)
Tim Waugh 258119
   {
Tim Waugh 258119
    /*
Tim Waugh 258119
@@ -1137,7 +1136,7 @@ httpGets(char   *line,			/* I - Line to 
Tim Waugh 258119
       http->activity = time(NULL);
Tim Waugh 258119
 
Tim Waugh 258119
       *lineptr = '\0';
Tim Waugh 258119
-      
Tim Waugh 258119
+
Tim Waugh 258119
       DEBUG_printf(("3httpGets: Returning \"%s\"", line));
Tim Waugh 258119
 
Tim Waugh 258119
       return (line);
Tim Waugh 258119
@@ -2283,7 +2282,7 @@ httpWait(http_t *http,			/* I - Connecti
Tim Waugh 258119
  *
Tim Waugh 258119
  * @deprecated@
Tim Waugh 258119
  */
Tim Waugh 258119
- 
Tim Waugh 258119
+
Tim Waugh 258119
 int					/* O - Number of bytes written */
Tim Waugh 258119
 httpWrite(http_t     *http,		/* I - Connection to server */
Tim Waugh 258119
           const char *buffer,		/* I - Buffer for data */
Tim Waugh 258119
@@ -2298,7 +2297,7 @@ httpWrite(http_t     *http,		/* I - Conn
Tim Waugh 258119
  *
Tim Waugh 258119
  * @since CUPS 1.2/Mac OS X 10.5@
Tim Waugh 258119
  */
Tim Waugh 258119
- 
Tim Waugh 258119
+
Tim Waugh 258119
 ssize_t					/* O - Number of bytes written */
Tim Waugh 258119
 httpWrite2(http_t     *http,		/* I - Connection to server */
Tim Waugh 258119
            const char *buffer,		/* I - Buffer for data */
Tim Waugh 258119
@@ -2456,7 +2455,7 @@ _httpWriteCDSA(
Tim Waugh 258119
   else
Tim Waugh 258119
   {
Tim Waugh 258119
     *dataLength = 0;
Tim Waugh 258119
-  
Tim Waugh 258119
+
Tim Waugh 258119
     if (errno == EAGAIN)
Tim Waugh 258119
       result = errSSLWouldBlock;
Tim Waugh 258119
     else
Tim Waugh 258119
@@ -2517,7 +2516,7 @@ http_bio_ctrl(BIO  *h,			/* I - BIO data
Tim Waugh 258119
 	}
Tim Waugh 258119
 	else
Tim Waugh 258119
 	  return (0);
Tim Waugh 258119
-        
Tim Waugh 258119
+
Tim Waugh 258119
     case BIO_CTRL_DUP :
Tim Waugh 258119
     case BIO_CTRL_FLUSH :
Tim Waugh 258119
         return (1);
Tim Waugh 258119
@@ -2719,7 +2718,36 @@ http_read_ssl(http_t *http,		/* I - Conn
Tim Waugh 258119
   return (SSL_read((SSL *)(http->tls), buf, len));
Tim Waugh 258119
 
Tim Waugh 258119
 #  elif defined(HAVE_GNUTLS)
Tim Waugh 258119
-  return (gnutls_record_recv(((http_tls_t *)(http->tls))->session, buf, len));
Tim Waugh 258119
+  ssize_t	result;			/* Return value */
Tim Waugh 258119
+
Tim Waugh 258119
+
Tim Waugh 258119
+  result = gnutls_record_recv(((http_tls_t *)(http->tls))->session, buf, len);
Tim Waugh 258119
+
Tim Waugh 258119
+  if (result < 0 && !errno)
Tim Waugh 258119
+  {
Tim Waugh 258119
+   /*
Tim Waugh 258119
+    * Convert GNU TLS error to errno value...
Tim Waugh 258119
+    */
Tim Waugh 258119
+
Tim Waugh 258119
+    switch (result)
Tim Waugh 258119
+    {
Tim Waugh 258119
+      case GNUTLS_E_INTERRUPTED :
Tim Waugh 258119
+	  errno = EINTR;
Tim Waugh 258119
+	  break;
Tim Waugh 258119
+
Tim Waugh 258119
+      case GNUTLS_E_AGAIN :
Tim Waugh 258119
+          errno = EAGAIN;
Tim Waugh 258119
+          break;
Tim Waugh 258119
+
Tim Waugh 258119
+      default :
Tim Waugh 258119
+          errno = EPIPE;
Tim Waugh 258119
+          break;
Tim Waugh 258119
+    }
Tim Waugh 258119
+
Tim Waugh 258119
+    result = -1;
Tim Waugh 258119
+  }
Tim Waugh 258119
+
Tim Waugh 258119
+  return ((int)result);
Tim Waugh 258119
 
Tim Waugh 258119
 #  elif defined(HAVE_CDSASSL)
Tim Waugh 258119
   int		result;			/* Return value */
Tim Waugh 258119
@@ -2857,7 +2885,7 @@ http_send(http_t       *http,	/* I - Con
Tim Waugh 258119
       DEBUG_printf(("9http_send: %s: %s", http_fields[i],
Tim Waugh 258119
                     httpGetField(http, i)));
Tim Waugh 258119
 
Tim Waugh 258119
-      if (httpPrintf(http, "%s: %s\r\n", http_fields[i], 
Tim Waugh 258119
+      if (httpPrintf(http, "%s: %s\r\n", http_fields[i],
Tim Waugh 258119
 		     httpGetField(http, i)) < 1)
Tim Waugh 258119
       {
Tim Waugh 258119
 	http->status = HTTP_ERROR;
Tim Waugh 258119
@@ -2896,15 +2924,15 @@ http_send(http_t       *http,	/* I - Con
Tim Waugh 258119
   * The Kerberos and AuthRef authentication strings can only be used once...
Tim Waugh 258119
   */
Tim Waugh 258119
 
Tim Waugh 258119
-  if (http->field_authorization && http->authstring && 
Tim Waugh 258119
-      (!strncmp(http->authstring, "Negotiate", 9) || 
Tim Waugh 258119
+  if (http->field_authorization && http->authstring &&
Tim Waugh 258119
+      (!strncmp(http->authstring, "Negotiate", 9) ||
Tim Waugh 258119
        !strncmp(http->authstring, "AuthRef", 7)))
Tim Waugh 258119
   {
Tim Waugh 258119
     http->_authstring[0] = '\0';
Tim Waugh 258119
 
Tim Waugh 258119
     if (http->authstring != http->_authstring)
Tim Waugh 258119
       free(http->authstring);
Tim Waugh 258119
-  
Tim Waugh 258119
+
Tim Waugh 258119
     http->authstring = http->_authstring;
Tim Waugh 258119
   }
Tim Waugh 258119
 
Tim Waugh 258119
@@ -3220,7 +3248,7 @@ http_upgrade(http_t *http)		/* I - Conne
Tim Waugh 258119
 /*
Tim Waugh 258119
  * 'http_write()' - Write a buffer to a HTTP connection.
Tim Waugh 258119
  */
Tim Waugh 258119
- 
Tim Waugh 258119
+
Tim Waugh 258119
 static int				/* O - Number of bytes written */
Tim Waugh 258119
 http_write(http_t     *http,		/* I - Connection to server */
Tim Waugh 258119
            const char *buffer,		/* I - Buffer for data */
Tim Waugh 258119
@@ -3335,7 +3363,36 @@ http_write_ssl(http_t     *http,	/* I - 
Tim Waugh 258119
   return (SSL_write((SSL *)(http->tls), buf, len));
Tim Waugh 258119
 
Tim Waugh 258119
 #  elif defined(HAVE_GNUTLS)
Tim Waugh 258119
-  return (gnutls_record_send(((http_tls_t *)(http->tls))->session, buf, len));
Tim Waugh 258119
+  ssize_t	result;			/* Return value */
Tim Waugh 258119
+
Tim Waugh 258119
+  result = gnutls_record_send(((http_tls_t *)(http->tls))->session, buf, len);
Tim Waugh 258119
+
Tim Waugh 258119
+  if (result < 0 && !errno)
Tim Waugh 258119
+  {
Tim Waugh 258119
+   /*
Tim Waugh 258119
+    * Convert GNU TLS error to errno value...
Tim Waugh 258119
+    */
Tim Waugh 258119
+
Tim Waugh 258119
+    switch (result)
Tim Waugh 258119
+    {
Tim Waugh 258119
+      case GNUTLS_E_INTERRUPTED :
Tim Waugh 258119
+	  errno = EINTR;
Tim Waugh 258119
+	  break;
Tim Waugh 258119
+
Tim Waugh 258119
+      case GNUTLS_E_AGAIN :
Tim Waugh 258119
+          errno = EAGAIN;
Tim Waugh 258119
+          break;
Tim Waugh 258119
+
Tim Waugh 258119
+      default :
Tim Waugh 258119
+          errno = EPIPE;
Tim Waugh 258119
+          break;
Tim Waugh 258119
+    }
Tim Waugh 258119
+
Tim Waugh 258119
+    result = -1;
Tim Waugh 258119
+  }
Tim Waugh 258119
+
Tim Waugh 258119
+  return ((int)result);
Tim Waugh 258119
+
Tim Waugh 258119
 #  elif defined(HAVE_CDSASSL)
Tim Waugh 258119
   int		result;			/* Return value */
Tim Waugh 258119
   OSStatus	error;			/* Error info */
Tim Waugh 258119
@@ -3358,11 +3415,11 @@ http_write_ssl(http_t     *http,	/* I - 
Tim Waugh 258119
 	else
Tim Waugh 258119
 	{
Tim Waugh 258119
 	  result = -1;
Tim Waugh 258119
-	  errno = EINTR;
Tim Waugh 258119
+	  errno  = EINTR;
Tim Waugh 258119
 	}
Tim Waugh 258119
 	break;
Tim Waugh 258119
     default :
Tim Waugh 258119
-	errno = EPIPE;
Tim Waugh 258119
+	errno  = EPIPE;
Tim Waugh 258119
 	result = -1;
Tim Waugh 258119
 	break;
Tim Waugh 258119
   }