diff -up cups-1.2.4/scheduler/client.c.CVE-2007-4045 cups-1.2.4/scheduler/client.c --- cups-1.2.4/scheduler/client.c.CVE-2007-4045 2007-10-30 09:51:04.000000000 +0000 +++ cups-1.2.4/scheduler/client.c 2007-10-30 10:07:10.000000000 +0000 @@ -105,6 +105,25 @@ static int write_file(cupsd_client_t *c struct stat *filestats); +void +_cupsdFixClientsBIO(void) +{ +#ifdef HAVE_LIBSSL + cupsd_client_t *c; + BIO *bio; + cupsArraySave (Clients); + for (c = (cupsd_client_t *)cupsArrayFirst(Clients); + c; + c = (cupsd_client_t *)cupsArrayNext(Clients)) + { + bio = SSL_get_wbio(c->http.tls); + BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)HTTP(c)); + } + cupsArrayRestore (Clients); +#endif +} + + /* * 'cupsdAcceptClient()' - Accept a new client. */ @@ -438,6 +457,7 @@ cupsdAcceptClient(cupsd_listener_t *lis) } cupsArrayAdd(Clients, con); + _cupsdFixClientsBIO(); cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAcceptClient: %d connected to server on %s:%d", @@ -729,6 +749,7 @@ cupsdCloseClient(cupsd_client_t *con) /* */ cupsArrayRemove(Clients, con); + _cupsdFixClientsBIO(); free(con); } diff -up cups-1.2.4/scheduler/main.c.CVE-2007-4045 cups-1.2.4/scheduler/main.c --- cups-1.2.4/scheduler/main.c.CVE-2007-4045 2007-10-30 09:51:04.000000000 +0000 +++ cups-1.2.4/scheduler/main.c 2007-10-30 09:51:05.000000000 +0000 @@ -948,7 +948,7 @@ main(int argc, /* I - Number of comm * Write data as needed... */ - if (con->pipe_pid && FD_ISSET(con->file, input)) + if (con->pipe_pid && con->file >= 0 && FD_ISSET(con->file, input)) { /* * Keep track of pending input from the file/pipe separately