Flood developers: I discovered an error where my system would simply lock up (with maximum CPU utilization from Flood.exe!) while trying to access an https page, which is using a server-side certificate, when running Flood from Windows (did not experience this problem in either Linux. My current SSL package in use there is openssl-0.9.7b. I did some debugging, and found that there is a spurious SSL error occurring (SSL_ERROR_SYSCALL). When associated with a non-zero errno (coming from somewhere in the ssl_open_socket() routine), this generated an APR_EGENERAL return for ssl_read_socket() (ERR_print_errors_fp() did not provide any output in this case). Then the calling code in flood_socket_generic.c apparently does not handle this error well. I intend to send a follow-up email both to this group and to the openssl group regarding this issue, but I have a fix available since the packet is actually coming back successfully (so I am treating this as a ghost error for now).
The patch I am providing (attached here) to fix this bug and stop the lock-up affects two files: flood_net_ssl.c (ssl_read_socket() function): Sets errno=0 before doing the SSL read so that the check on errno generates an APR_EOF. flood_socket_generic.c (generic_recv_resp() function): Handle errors more robustly by not exiting a while loop under any non-APR_SUCCESS status condition. The function exit, however, will not record an APR_EOF code as an error since it is the usual way for ending the function. flood_socket_keepalive.c probably needs similar work which will be posted as a separate diff in the near future. -Norman Tuttle, developer, OpenDemand Systems [EMAIL PROTECTED]
--- \flood-1.1\flood_net_ssl.c 2003-10-08 19:25:02.000000000 -0400 +++ flood_net_ssl.c 2003-10-23 13:02:14.000000000 -0400 @@ -290,6 +290,7 @@ return APR_TIMEUP; } + errno=0; e = SSL_read(s->ssl_connection, buf, *buflen); sslError = SSL_get_error(s->ssl_connection, e);
--- \flood-1.1\flood_socket_generic.c 2003-09-06 00:27:38.000000000 -0400 +++ flood_socket_generic.c 2003-10-23 14:58:39.000000000 -0400 @@ -174,7 +174,7 @@ new_resp->rbufsize += i; cp += i; } - while (status != APR_EOF && status != APR_TIMEUP); + while (status == APR_SUCCESS); } else { @@ -186,20 +186,16 @@ read_socket(gsock->s, new_resp->rbuf, &new_resp->rbufsize); - while (status != APR_EOF && status != APR_TIMEUP) { + while (status == APR_SUCCESS) { i = MAX_DOC_LENGTH - 1; status = gsock->ssl ? ssl_read_socket(gsock->s, b, &i) : read_socket(gsock->s, b, &i); } - if (status != APR_SUCCESS && status != APR_EOF) { - return status; - } - } *resp = new_resp; - return APR_SUCCESS; + return ((status==APR_EOF) ? APR_SUCCESS : status); } /**