| 1 |
#! /bin/sh /usr/share/dpatch/dpatch-run |
|---|
| 2 |
## 07_fix_fdevents.dpatch by <stbuehler@freenet.de> |
|---|
| 3 |
## |
|---|
| 4 |
## All lines beginning with `## DP:' are a description of the patch. |
|---|
| 5 |
## DP: Disable fd-event on overloaded server socket |
|---|
| 6 |
|
|---|
| 7 |
@DPATCH@ |
|---|
| 8 |
diff -urNad lighttpd-1.4.16~/src/base.h lighttpd-1.4.16/src/base.h |
|---|
| 9 |
--- lighttpd-1.4.16~/src/base.h 2007-07-27 11:56:11.000000000 +0200 |
|---|
| 10 |
+++ lighttpd-1.4.16/src/base.h 2007-08-24 17:49:07.000000000 +0200 |
|---|
| 11 |
@@ -498,6 +498,7 @@ |
|---|
| 12 |
sock_addr addr; |
|---|
| 13 |
int fd; |
|---|
| 14 |
int fde_ndx; |
|---|
| 15 |
+ int suspended_fdevents; |
|---|
| 16 |
|
|---|
| 17 |
buffer *ssl_pemfile; |
|---|
| 18 |
buffer *ssl_ca_file; |
|---|
| 19 |
diff -urNad lighttpd-1.4.16~/src/connections.c lighttpd-1.4.16/src/connections.c |
|---|
| 20 |
--- lighttpd-1.4.16~/src/connections.c 2007-07-27 11:56:11.000000000 +0200 |
|---|
| 21 |
+++ lighttpd-1.4.16/src/connections.c 2007-08-24 17:51:12.000000000 +0200 |
|---|
| 22 |
@@ -109,12 +109,15 @@ |
|---|
| 23 |
} |
|---|
| 24 |
|
|---|
| 25 |
int connection_close(server *srv, connection *con) { |
|---|
| 26 |
-#ifdef USE_OPENSSL |
|---|
| 27 |
- server_socket *srv_sock = con->srv_socket; |
|---|
| 28 |
-#endif |
|---|
| 29 |
+ server_socket *srv_socket = con->srv_socket; |
|---|
| 30 |
+ if (srv_socket->suspended_fdevents) { |
|---|
| 31 |
+ // fdevent_event_del(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd); |
|---|
| 32 |
+ fdevent_event_add(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd, FDEVENT_IN); |
|---|
| 33 |
+ srv_socket->suspended_fdevents = 0; |
|---|
| 34 |
+ } |
|---|
| 35 |
|
|---|
| 36 |
#ifdef USE_OPENSSL |
|---|
| 37 |
- if (srv_sock->is_ssl) { |
|---|
| 38 |
+ if (srv_socket->is_ssl) { |
|---|
| 39 |
if (con->ssl) SSL_free(con->ssl); |
|---|
| 40 |
con->ssl = NULL; |
|---|
| 41 |
} |
|---|
| 42 |
@@ -1259,6 +1262,8 @@ |
|---|
| 43 |
*/ |
|---|
| 44 |
|
|---|
| 45 |
if (srv->conns->used >= srv->max_conns) { |
|---|
| 46 |
+ srv_socket->suspended_fdevents = 1; |
|---|
| 47 |
+ fdevent_event_del(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd); |
|---|
| 48 |
return NULL; |
|---|
| 49 |
} |
|---|
| 50 |
|
|---|
| 51 |
@@ -1277,6 +1282,8 @@ |
|---|
| 52 |
break; |
|---|
| 53 |
case EMFILE: |
|---|
| 54 |
/* out of fds */ |
|---|
| 55 |
+ srv_socket->suspended_fdevents = 1; |
|---|
| 56 |
+ fdevent_event_del(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd); |
|---|
| 57 |
break; |
|---|
| 58 |
default: |
|---|
| 59 |
log_error_write(srv, __FILE__, __LINE__, "ssd", "accept failed:", strerror(errno), errno); |
|---|
| 60 |
diff -urNad lighttpd-1.4.16~/src/network.c lighttpd-1.4.16/src/network.c |
|---|
| 61 |
--- lighttpd-1.4.16~/src/network.c 2007-07-20 11:43:29.000000000 +0200 |
|---|
| 62 |
+++ lighttpd-1.4.16/src/network.c 2007-08-24 17:54:23.000000000 +0200 |
|---|
| 63 |
@@ -601,6 +601,7 @@ |
|---|
| 64 |
|
|---|
| 65 |
fdevent_register(srv->ev, srv_socket->fd, network_server_handle_fdevent, srv_socket); |
|---|
| 66 |
fdevent_event_add(srv->ev, &(srv_socket->fde_ndx), srv_socket->fd, FDEVENT_IN); |
|---|
| 67 |
+ srv_socket->suspended_fdevents = 0; |
|---|
| 68 |
} |
|---|
| 69 |
return 0; |
|---|
| 70 |
} |
|---|