Add .gitignore
[pound.git] / debian / patches / 0008-disable_client_initiated_renegotiation.patch
1 Added the missing parts that makes the option SSLAllowClientRenegotiation
2 work as advertised, allowing client initiated renegotiation to be turned off.
3 This patch is a compliment to the changes introduced in the 0001-anti_beast.patch, 
4 which was missing the changes to http.c as seen in the original patch from 
5 Joe Gooch <mrwizard@k12system.com> at:
6 http://goochfriend.org/pound_2.6f_ssl_renegotiation_and_ciphers.patch
7
8 --- a/http.c
9 +++ b/http.c
10 @@ -273,6 +273,11 @@
11  
12  static int  err_to = -1;
13  
14 +typedef struct {
15 +    int timeout;
16 +    RENEG_STATE *reneg_state;
17 +} BIO_ARG;
18 +
19  /*
20   * Time-out for client read/gets
21   * the SSL manual says not to do it, but it works well enough anyway...
22 @@ -280,6 +285,7 @@
23  static long
24  bio_callback(BIO *const bio, const int cmd, const char *argp, int argi, long argl, long ret)
25  {
26 +    BIO_ARG *bio_arg;
27      struct pollfd   p;
28      int             to, p_res, p_err;
29  
30 @@ -287,11 +293,22 @@
31          return ret;
32  
33      /* a time-out already occured */
34 -    if((to = *((int *)BIO_get_callback_arg(bio)) * 1000) < 0) {
35 +    if((bio_arg = (BIO_ARG*)BIO_get_callback_arg(bio))==NULL) return ret;
36 +    if((to = bio_arg->timeout * 1000) < 0) {
37          errno = ETIMEDOUT;
38          return -1;
39      }
40  
41 +    /* Renegotiations */
42 +    if (bio_arg->reneg_state != NULL && *bio_arg->reneg_state == RENEG_ABORT) {
43 +        logmsg(LOG_NOTICE, "REJECTING renegotiated session");
44 +        errno = ECONNABORTED;
45 +        return -1;
46 +    }
47 +
48 +    //logmsg(LOG_NOTICE, "TO %d", to);
49 +    if (to == 0) return ret;
50 +
51      for(;;) {
52          memset(&p, 0, sizeof(p));
53          BIO_get_fd(bio, &p.fd);
54 @@ -326,7 +343,7 @@
55              return -1;
56          case 0:
57              /* timeout - mark the BIO as unusable for the future */
58 -            BIO_set_callback_arg(bio, (char *)&err_to);
59 +            bio_arg->timeout = err_to;
60  #ifdef  EBUG
61              logmsg(LOG_WARNING, "(%lx) CALLBACK timeout poll after %d secs: %s",
62                  pthread_self(), to / 1000, strerror(p_err));
63 @@ -531,6 +548,15 @@
64      struct linger       l;
65      double              start_req, end_req;
66  
67 +    RENEG_STATE         reneg_state;
68 +    BIO_ARG             ba1, ba2;
69 +
70 +    reneg_state = RENEG_INIT;
71 +    ba1.reneg_state =  &reneg_state;
72 +    ba2.reneg_state = &reneg_state;
73 +    ba1.timeout = 0;
74 +    ba2.timeout = 0;
75 +
76      from_host = ((thr_arg *)arg)->from_host;
77      memcpy(&from_host_addr, from_host.ai_addr, from_host.ai_addrlen);
78      from_host.ai_addr = (struct sockaddr *)&from_host_addr;
79 @@ -539,6 +565,8 @@
80      free(((thr_arg *)arg)->from_host.ai_addr);
81      free(arg);
82  
83 +    if(lstn->allow_client_reneg) reneg_state = RENEG_ALLOW;
84 +
85      n = 1;
86      setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&n, sizeof(n));
87      l.l_onoff = 1;
88 @@ -562,10 +590,10 @@
89          close(sock);
90          return;
91      }
92 -    if(lstn->to > 0) {
93 -        BIO_set_callback_arg(cl, (char *)&lstn->to);
94 -        BIO_set_callback(cl, bio_callback);
95 -    }
96 +
97 +    ba1.timeout = lstn->to;
98 +    BIO_set_callback_arg(cl, (char *)&ba1);
99 +    BIO_set_callback(cl, bio_callback);
100  
101      if(lstn->ctx != NULL) {
102          if((ssl = SSL_new(lstn->ctx->ctx)) == NULL) {
103 @@ -574,6 +602,7 @@
104              BIO_free_all(cl);
105              return;
106          }
107 +        SSL_set_app_data(ssl, &reneg_state);
108          SSL_set_bio(ssl, cl, cl);
109          if((bb = BIO_new(BIO_f_ssl())) == NULL) {
110              logmsg(LOG_WARNING, "(%lx) BIO_new(Bio_f_ssl()) failed", pthread_self());
111 @@ -875,7 +904,8 @@
112              }
113              BIO_set_close(be, BIO_CLOSE);
114              if(backend->to > 0) {
115 -                BIO_set_callback_arg(be, (char *)&backend->to);
116 +                ba2.timeout = backend->to;
117 +                BIO_set_callback_arg(be, (char *)&ba2);
118                  BIO_set_callback(be, bio_callback);
119              }
120              if(backend->ctx != NULL) {