diff -up cups-1.3.8/scheduler/client.c.str2892 cups-1.3.8/scheduler/client.c --- cups-1.3.8/scheduler/client.c.str2892 2008-07-11 23:48:49.000000000 +0100 +++ cups-1.3.8/scheduler/client.c 2008-08-03 11:42:35.000000000 +0100 @@ -28,6 +28,7 @@ * cupsdUpdateCGI() - Read status messages from CGI scripts and programs. * cupsdWriteClient() - Write data to a client as needed. * check_if_modified() - Decode an "If-Modified-Since" line. + * data_ready() - Check whether data is available from a client. * encrypt_client() - Enable encryption for the client... * get_cdsa_certificate() - Convert a keychain name into the CFArrayRef * required by SSLSetCertificate. @@ -83,6 +84,7 @@ extern const char *cssmErrorString(int e static int check_if_modified(cupsd_client_t *con, struct stat *filestats); +static int data_ready(cupsd_client_t *con); #ifdef HAVE_SSL static int encrypt_client(cupsd_client_t *con); #endif /* HAVE_SSL */ @@ -989,8 +991,7 @@ cupsdReadClient(cupsd_client_t *con) /* */ while ((status = httpUpdate(HTTP(con))) == HTTP_CONTINUE) - if (con->http.used == 0 || - !memchr(con->http.buffer, '\n', con->http.used)) + if (!data_ready(con)) break; if (status != HTTP_OK && status != HTTP_CONTINUE) @@ -1889,7 +1890,7 @@ cupsdReadClient(cupsd_client_t *con) /* } } } - while (con->http.state == HTTP_PUT_RECV && con->http.used > 0); + while (con->http.state == HTTP_PUT_RECV && data_ready(con)); if (con->http.state == HTTP_WAITING) { @@ -2064,7 +2065,7 @@ cupsdReadClient(cupsd_client_t *con) /* } } } - while (con->http.state == HTTP_POST_RECV && con->http.used > 0); + while (con->http.state == HTTP_POST_RECV && data_ready(con)); if (con->http.state == HTTP_POST_SEND) { @@ -2914,6 +2915,38 @@ check_if_modified( } +/* + * 'data_ready()' - Check whether data is available from a client. + */ + +static int /* O - 1 if data is ready, 0 otherwise */ +data_ready(cupsd_client_t *con) /* I - Client */ +{ + if (con->http.used > 0) + return (1); +#ifdef HAVE_SSL + else if (con->http.tls) + { +# ifdef HAVE_LIBSSL + if (SSL_pending((SSL *)(con->http.tls))) + return (1); +# elif defined(HAVE_GNUTLS) + if (gnutls_record_check_pending(((http_tls_t *)(con->http.tls))->session)) + return (1); +# elif defined(HAVE_CDSASSL) + size_t bytes; /* Bytes that are available */ + + if (!SSLGetBufferedReadSize(((http_tls_t *)(con->http.tls))->session, + &bytes) && bytes > 0) + return (1); +# endif /* HAVE_LIBSSL */ + } +#endif /* HAVE_SSL */ + + return (0); +} + + #ifdef HAVE_SSL /* * 'encrypt_client()' - Enable encryption for the client...