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