1*4882a593SmuzhiyunFrom a2c9dde4d055ea8942afb150b7fc3a807d4e5d60 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Sergey Poznyakoff <gray@gnu.org> 3*4882a593SmuzhiyunDate: Wed, 28 Feb 2018 13:44:01 +0000 4*4882a593SmuzhiyunSubject: [PATCH] Support for Openssl 1.1 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunFixes 7*4882a593Smuzhiyunhttp://autobuild.buildroot.net/results/ef2/ef2de6c280bf8622a00d4573bc5bd143e3baa002 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunDownloaded from github fork: 10*4882a593Smuzhiyunhttps://github.com/graygnuorg/pound/commit/a2c9dde4d055ea8942afb150b7fc3a807d4e5d60 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunThis patch was announced on the upstream mailinglist: 13*4882a593Smuzhiyunhttp://www.apsis.ch/pound/pound_list/archive/2018/2018-03/1519920322000 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunSigned-off-by: Bernd Kuhls <bernd.kuhls@t-online.de> 16*4882a593Smuzhiyun--- 17*4882a593Smuzhiyun .gitignore | 15 ++++++++ 18*4882a593Smuzhiyun config.c | 17 +++++++-- 19*4882a593Smuzhiyun http.c | 12 ++++++- 20*4882a593Smuzhiyun pound.h | 4 ++- 21*4882a593Smuzhiyun svc.c | 101 +++++++++++++++++++++++++++++++++++++++++++---------- 22*4882a593Smuzhiyun 5 files changed, 125 insertions(+), 24 deletions(-) 23*4882a593Smuzhiyun create mode 100644 .gitignore 24*4882a593Smuzhiyun 25*4882a593Smuzhiyundiff --git a/config.c b/config.c 26*4882a593Smuzhiyunindex d41a3ee..e8fec0f 100644 27*4882a593Smuzhiyun--- a/config.c 28*4882a593Smuzhiyun+++ b/config.c 29*4882a593Smuzhiyun@@ -174,6 +174,16 @@ conf_fgets(char *buf, const int max) 30*4882a593Smuzhiyun } 31*4882a593Smuzhiyun } 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 34*4882a593Smuzhiyun+# define general_name_string(n) \ 35*4882a593Smuzhiyun+ strndup(ASN1_STRING_get0_data(n->d.dNSName), \ 36*4882a593Smuzhiyun+ ASN1_STRING_length(n->d.dNSName) + 1) 37*4882a593Smuzhiyun+#else 38*4882a593Smuzhiyun+# define general_name_string(n) \ 39*4882a593Smuzhiyun+ strndup(ASN1_STRING_data(n->d.dNSName), \ 40*4882a593Smuzhiyun+ ASN1_STRING_length(n->d.dNSName) + 1) 41*4882a593Smuzhiyun+#endif 42*4882a593Smuzhiyun+ 43*4882a593Smuzhiyun unsigned char ** 44*4882a593Smuzhiyun get_subjectaltnames(X509 *x509, unsigned int *count) 45*4882a593Smuzhiyun { 46*4882a593Smuzhiyun@@ -194,8 +204,7 @@ get_subjectaltnames(X509 *x509, unsigned int *count) 47*4882a593Smuzhiyun name = sk_GENERAL_NAME_pop(san_stack); 48*4882a593Smuzhiyun switch(name->type) { 49*4882a593Smuzhiyun case GEN_DNS: 50*4882a593Smuzhiyun- temp[local_count] = strndup(ASN1_STRING_data(name->d.dNSName), ASN1_STRING_length(name->d.dNSName) 51*4882a593Smuzhiyun- + 1); 52*4882a593Smuzhiyun+ temp[local_count] = general_name_string(name); 53*4882a593Smuzhiyun if(temp[local_count] == NULL) 54*4882a593Smuzhiyun conf_err("out of memory"); 55*4882a593Smuzhiyun local_count++; 56*4882a593Smuzhiyun@@ -565,7 +574,9 @@ parse_service(const char *svc_name) 57*4882a593Smuzhiyun pthread_mutex_init(&res->mut, NULL); 58*4882a593Smuzhiyun if(svc_name) 59*4882a593Smuzhiyun strncpy(res->name, svc_name, KEY_SIZE); 60*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 61*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 62*4882a593Smuzhiyun+ if((res->sessions = lh_TABNODE_new(t_hash, t_cmp)) == NULL) 63*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 64*4882a593Smuzhiyun if((res->sessions = LHM_lh_new(TABNODE, t)) == NULL) 65*4882a593Smuzhiyun #else 66*4882a593Smuzhiyun if((res->sessions = lh_new(LHASH_HASH_FN(t_hash), LHASH_COMP_FN(t_cmp))) == NULL) 67*4882a593Smuzhiyundiff --git a/http.c b/http.c 68*4882a593Smuzhiyunindex dd211e4..c8e756a 100644 69*4882a593Smuzhiyun--- a/http.c 70*4882a593Smuzhiyun+++ b/http.c 71*4882a593Smuzhiyun@@ -527,12 +527,22 @@ log_bytes(char *res, const LONG cnt) 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* Cleanup code. This should really be in the pthread_cleanup_push, except for bugs in some implementations */ 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 76*4882a593Smuzhiyun+# define clear_error() 77*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 78*4882a593Smuzhiyun+# define clear_error() \ 79*4882a593Smuzhiyun+ if(ssl != NULL) { ERR_clear_error(); ERR_remove_thread_state(NULL); } 80*4882a593Smuzhiyun+#else 81*4882a593Smuzhiyun+# define clear_error() \ 82*4882a593Smuzhiyun+ if(ssl != NULL) { ERR_clear_error(); ERR_remove_state(0); } 83*4882a593Smuzhiyun+#endif 84*4882a593Smuzhiyun+ 85*4882a593Smuzhiyun #define clean_all() { \ 86*4882a593Smuzhiyun if(ssl != NULL) { BIO_ssl_shutdown(cl); } \ 87*4882a593Smuzhiyun if(be != NULL) { BIO_flush(be); BIO_reset(be); BIO_free_all(be); be = NULL; } \ 88*4882a593Smuzhiyun if(cl != NULL) { BIO_flush(cl); BIO_reset(cl); BIO_free_all(cl); cl = NULL; } \ 89*4882a593Smuzhiyun if(x509 != NULL) { X509_free(x509); x509 = NULL; } \ 90*4882a593Smuzhiyun- if(ssl != NULL) { ERR_clear_error(); ERR_remove_state(0); } \ 91*4882a593Smuzhiyun+ clear_error(); \ 92*4882a593Smuzhiyun } 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* 95*4882a593Smuzhiyundiff --git a/pound.h b/pound.h 96*4882a593Smuzhiyunindex fa22c36..9603b91 100644 97*4882a593Smuzhiyun--- a/pound.h 98*4882a593Smuzhiyun+++ b/pound.h 99*4882a593Smuzhiyun@@ -344,7 +344,9 @@ typedef struct _tn { 100*4882a593Smuzhiyun /* maximal session key size */ 101*4882a593Smuzhiyun #define KEY_SIZE 127 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 104*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 105*4882a593Smuzhiyun+ DEFINE_LHASH_OF(TABNODE); 106*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 107*4882a593Smuzhiyun DECLARE_LHASH_OF(TABNODE); 108*4882a593Smuzhiyun #endif 109*4882a593Smuzhiyun 110*4882a593Smuzhiyundiff --git a/svc.c b/svc.c 111*4882a593Smuzhiyunindex 60ba488..063b92c 100644 112*4882a593Smuzhiyun--- a/svc.c 113*4882a593Smuzhiyun+++ b/svc.c 114*4882a593Smuzhiyun@@ -27,10 +27,17 @@ 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #include "pound.h" 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 119*4882a593Smuzhiyun+# define TABNODE_GET_DOWN_LOAD(t) lh_TABNODE_get_down_load(t) 120*4882a593Smuzhiyun+# define TABNODE_SET_DOWN_LOAD(t,n) lh_TABNODE_set_down_load(t,n) 121*4882a593Smuzhiyun+#else 122*4882a593Smuzhiyun #ifndef LHASH_OF 123*4882a593Smuzhiyun #define LHASH_OF(x) LHASH 124*4882a593Smuzhiyun #define CHECKED_LHASH_OF(type, h) h 125*4882a593Smuzhiyun #endif 126*4882a593Smuzhiyun+# define TABNODE_GET_DOWN_LOAD(t) (CHECKED_LHASH_OF(TABNODE, t)->down_load) 127*4882a593Smuzhiyun+# define TABNODE_SET_DOWN_LOAD(t,n) (CHECKED_LHASH_OF(TABNODE, t)->down_load = n) 128*4882a593Smuzhiyun+#endif 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* 131*4882a593Smuzhiyun * Add a new key/content pair to a hash table 132*4882a593Smuzhiyun@@ -58,7 +65,9 @@ t_add(LHASH_OF(TABNODE) *const tab, const char *key, const void *content, const 133*4882a593Smuzhiyun } 134*4882a593Smuzhiyun memcpy(t->content, content, cont_len); 135*4882a593Smuzhiyun t->last_acc = time(NULL); 136*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 137*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 138*4882a593Smuzhiyun+ if((old = lh_TABNODE_insert(tab, t)) != NULL) { 139*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 140*4882a593Smuzhiyun if((old = LHM_lh_insert(TABNODE, tab, t)) != NULL) { 141*4882a593Smuzhiyun #else 142*4882a593Smuzhiyun if((old = (TABNODE *)lh_insert(tab, t)) != NULL) { 143*4882a593Smuzhiyun@@ -82,7 +91,9 @@ t_find(LHASH_OF(TABNODE) *const tab, char *const key) 144*4882a593Smuzhiyun TABNODE t, *res; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun t.key = key; 147*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 148*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 149*4882a593Smuzhiyun+ if((res = lh_TABNODE_retrieve(tab, &t)) != NULL) { 150*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 151*4882a593Smuzhiyun if((res = (TABNODE *)LHM_lh_retrieve(TABNODE, tab, &t)) != NULL) { 152*4882a593Smuzhiyun #else 153*4882a593Smuzhiyun if((res = (TABNODE *)lh_retrieve(tab, &t)) != NULL) { 154*4882a593Smuzhiyun@@ -102,7 +113,9 @@ t_remove(LHASH_OF(TABNODE) *const tab, char *const key) 155*4882a593Smuzhiyun TABNODE t, *res; 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun t.key = key; 158*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 159*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 160*4882a593Smuzhiyun+ if((res = lh_TABNODE_delete(tab, &t)) != NULL) { 161*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 162*4882a593Smuzhiyun if((res = LHM_lh_delete(TABNODE, tab, &t)) != NULL) { 163*4882a593Smuzhiyun #else 164*4882a593Smuzhiyun if((res = (TABNODE *)lh_delete(tab, &t)) != NULL) { 165*4882a593Smuzhiyun@@ -127,7 +140,9 @@ t_old_doall_arg(TABNODE *t, ALL_ARG *a) 166*4882a593Smuzhiyun TABNODE *res; 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun if(t->last_acc < a->lim) 169*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 170*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 171*4882a593Smuzhiyun+ if((res = lh_TABNODE_delete(a->tab, t)) != NULL) { 172*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 173*4882a593Smuzhiyun if((res = LHM_lh_delete(TABNODE, a->tab, t)) != NULL) { 174*4882a593Smuzhiyun #else 175*4882a593Smuzhiyun if((res = lh_delete(a->tab, t)) != NULL) { 176*4882a593Smuzhiyun@@ -145,6 +160,10 @@ IMPLEMENT_LHASH_DOALL_ARG_FN(t_old, TABNODE, ALL_ARG) 177*4882a593Smuzhiyun IMPLEMENT_LHASH_DOALL_ARG_FN(t_old, TABNODE *, ALL_ARG *) 178*4882a593Smuzhiyun #endif 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 181*4882a593Smuzhiyun+IMPLEMENT_LHASH_DOALL_ARG(TABNODE,ALL_ARG); 182*4882a593Smuzhiyun+#endif 183*4882a593Smuzhiyun+ 184*4882a593Smuzhiyun /* 185*4882a593Smuzhiyun * Expire all old nodes 186*4882a593Smuzhiyun */ 187*4882a593Smuzhiyun@@ -156,14 +175,16 @@ t_expire(LHASH_OF(TABNODE) *const tab, const time_t lim) 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun a.tab = tab; 190*4882a593Smuzhiyun a.lim = lim; 191*4882a593Smuzhiyun- down_load = CHECKED_LHASH_OF(TABNODE, tab)->down_load; 192*4882a593Smuzhiyun- CHECKED_LHASH_OF(TABNODE, tab)->down_load = 0; 193*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 194*4882a593Smuzhiyun+ down_load = TABNODE_GET_DOWN_LOAD(tab); 195*4882a593Smuzhiyun+ TABNODE_SET_DOWN_LOAD(tab, 0); 196*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 197*4882a593Smuzhiyun+ lh_TABNODE_doall_ALL_ARG(tab, t_old_doall_arg, &a); 198*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 199*4882a593Smuzhiyun LHM_lh_doall_arg(TABNODE, tab, LHASH_DOALL_ARG_FN(t_old), ALL_ARG, &a); 200*4882a593Smuzhiyun #else 201*4882a593Smuzhiyun lh_doall_arg(tab, LHASH_DOALL_ARG_FN(t_old), &a); 202*4882a593Smuzhiyun #endif 203*4882a593Smuzhiyun- CHECKED_LHASH_OF(TABNODE, tab)->down_load = down_load; 204*4882a593Smuzhiyun+ TABNODE_SET_DOWN_LOAD(tab, down_load); 205*4882a593Smuzhiyun return; 206*4882a593Smuzhiyun } 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun@@ -173,7 +194,9 @@ t_cont_doall_arg(TABNODE *t, ALL_ARG *arg) 209*4882a593Smuzhiyun TABNODE *res; 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun if(memcmp(t->content, arg->content, arg->cont_len) == 0) 212*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 213*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 214*4882a593Smuzhiyun+ if((res = lh_TABNODE_delete(arg->tab, t)) != NULL) { 215*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 216*4882a593Smuzhiyun if((res = LHM_lh_delete(TABNODE, arg->tab, t)) != NULL) { 217*4882a593Smuzhiyun #else 218*4882a593Smuzhiyun if((res = lh_delete(arg->tab, t)) != NULL) { 219*4882a593Smuzhiyun@@ -203,15 +226,16 @@ t_clean(LHASH_OF(TABNODE) *const tab, void *const content, const size_t cont_len 220*4882a593Smuzhiyun a.tab = tab; 221*4882a593Smuzhiyun a.content = content; 222*4882a593Smuzhiyun a.cont_len = cont_len; 223*4882a593Smuzhiyun- down_load = CHECKED_LHASH_OF(TABNODE, tab)->down_load; 224*4882a593Smuzhiyun- CHECKED_LHASH_OF(TABNODE, tab)->down_load = 0; 225*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 226*4882a593Smuzhiyun+ down_load = TABNODE_GET_DOWN_LOAD(tab); 227*4882a593Smuzhiyun+ TABNODE_SET_DOWN_LOAD(tab, 0); 228*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 229*4882a593Smuzhiyun+ lh_TABNODE_doall_ALL_ARG(tab, t_cont_doall_arg, &a); 230*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 231*4882a593Smuzhiyun LHM_lh_doall_arg(TABNODE, tab, LHASH_DOALL_ARG_FN(t_cont), ALL_ARG, &a); 232*4882a593Smuzhiyun #else 233*4882a593Smuzhiyun lh_doall_arg(tab, LHASH_DOALL_ARG_FN(t_cont), &a); 234*4882a593Smuzhiyun #endif 235*4882a593Smuzhiyun- CHECKED_LHASH_OF(TABNODE, tab)->down_load = down_load; 236*4882a593Smuzhiyun- return; 237*4882a593Smuzhiyun+ TABNODE_SET_DOWN_LOAD(tab, down_load); 238*4882a593Smuzhiyun } 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun /* 241*4882a593Smuzhiyun@@ -1262,6 +1286,31 @@ RSA_tmp_callback(/* not used */SSL *ssl, /* not used */int is_export, int keylen 242*4882a593Smuzhiyun return res; 243*4882a593Smuzhiyun } 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun+static int 246*4882a593Smuzhiyun+generate_key(RSA **ret_rsa, unsigned long bits) 247*4882a593Smuzhiyun+{ 248*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER > 0x00908000L 249*4882a593Smuzhiyun+ int rc = 0; 250*4882a593Smuzhiyun+ RSA *rsa; 251*4882a593Smuzhiyun+ 252*4882a593Smuzhiyun+ rsa = RSA_new(); 253*4882a593Smuzhiyun+ if (rsa) { 254*4882a593Smuzhiyun+ BIGNUM *bne = BN_new(); 255*4882a593Smuzhiyun+ if (BN_set_word(bne, RSA_F4)) 256*4882a593Smuzhiyun+ rc = RSA_generate_key_ex(rsa, bits, bne, NULL); 257*4882a593Smuzhiyun+ BN_free(bne); 258*4882a593Smuzhiyun+ if (rc) 259*4882a593Smuzhiyun+ *ret_rsa = rsa; 260*4882a593Smuzhiyun+ else 261*4882a593Smuzhiyun+ RSA_free(rsa); 262*4882a593Smuzhiyun+ } 263*4882a593Smuzhiyun+ return rc; 264*4882a593Smuzhiyun+#else 265*4882a593Smuzhiyun+ *ret_rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL); 266*4882a593Smuzhiyun+ return *ret_rsa != NULL; 267*4882a593Smuzhiyun+#endif 268*4882a593Smuzhiyun+} 269*4882a593Smuzhiyun+ 270*4882a593Smuzhiyun /* 271*4882a593Smuzhiyun * Periodically regenerate ephemeral RSA keys 272*4882a593Smuzhiyun * runs every T_RSA_KEYS seconds 273*4882a593Smuzhiyun@@ -1274,8 +1323,9 @@ do_RSAgen(void) 274*4882a593Smuzhiyun RSA *t_RSA1024_keys[N_RSA_KEYS]; 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun for(n = 0; n < N_RSA_KEYS; n++) { 277*4882a593Smuzhiyun- t_RSA512_keys[n] = RSA_generate_key(512, RSA_F4, NULL, NULL); 278*4882a593Smuzhiyun- t_RSA1024_keys[n] = RSA_generate_key(1024, RSA_F4, NULL, NULL); 279*4882a593Smuzhiyun+ /* FIXME: Error handling */ 280*4882a593Smuzhiyun+ generate_key(&t_RSA512_keys[n], 512); 281*4882a593Smuzhiyun+ generate_key(&t_RSA1024_keys[n], 1024); 282*4882a593Smuzhiyun } 283*4882a593Smuzhiyun if(ret_val = pthread_mutex_lock(&RSA_mut)) 284*4882a593Smuzhiyun logmsg(LOG_WARNING, "thr_RSAgen() lock: %s", strerror(ret_val)); 285*4882a593Smuzhiyun@@ -1329,11 +1379,11 @@ init_timer(void) 286*4882a593Smuzhiyun * Pre-generate ephemeral RSA keys 287*4882a593Smuzhiyun */ 288*4882a593Smuzhiyun for(n = 0; n < N_RSA_KEYS; n++) { 289*4882a593Smuzhiyun- if((RSA512_keys[n] = RSA_generate_key(512, RSA_F4, NULL, NULL)) == NULL) { 290*4882a593Smuzhiyun+ if(!generate_key(&RSA512_keys[n], 512)) { 291*4882a593Smuzhiyun logmsg(LOG_WARNING,"RSA_generate(%d, 512) failed", n); 292*4882a593Smuzhiyun return; 293*4882a593Smuzhiyun } 294*4882a593Smuzhiyun- if((RSA1024_keys[n] = RSA_generate_key(1024, RSA_F4, NULL, NULL)) == NULL) { 295*4882a593Smuzhiyun+ if(!generate_key(&RSA1024_keys[n], 1024)) { 296*4882a593Smuzhiyun logmsg(LOG_WARNING,"RSA_generate(%d, 1024) failed", n); 297*4882a593Smuzhiyun return; 298*4882a593Smuzhiyun } 299*4882a593Smuzhiyun@@ -1420,6 +1470,10 @@ IMPLEMENT_LHASH_DOALL_ARG_FN(t_dump, TABNODE, DUMP_ARG) 300*4882a593Smuzhiyun IMPLEMENT_LHASH_DOALL_ARG_FN(t_dump, TABNODE *, DUMP_ARG *) 301*4882a593Smuzhiyun #endif 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 304*4882a593Smuzhiyun+IMPLEMENT_LHASH_DOALL_ARG(TABNODE,DUMP_ARG); 305*4882a593Smuzhiyun+#endif 306*4882a593Smuzhiyun+ 307*4882a593Smuzhiyun /* 308*4882a593Smuzhiyun * write sessions to the control socket 309*4882a593Smuzhiyun */ 310*4882a593Smuzhiyun@@ -1430,7 +1484,9 @@ dump_sess(const int control_sock, LHASH_OF(TABNODE) *const sess, BACKEND *const 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun a.control_sock = control_sock; 313*4882a593Smuzhiyun a.backends = backends; 314*4882a593Smuzhiyun-#if OPENSSL_VERSION_NUMBER >= 0x10000000L 315*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L 316*4882a593Smuzhiyun+ lh_TABNODE_doall_DUMP_ARG(sess, t_dump_doall_arg, &a); 317*4882a593Smuzhiyun+#elif OPENSSL_VERSION_NUMBER >= 0x10000000L 318*4882a593Smuzhiyun LHM_lh_doall_arg(TABNODE, sess, LHASH_DOALL_ARG_FN(t_dump), DUMP_ARG, &a); 319*4882a593Smuzhiyun #else 320*4882a593Smuzhiyun lh_doall_arg(sess, LHASH_DOALL_ARG_FN(t_dump), &a); 321*4882a593Smuzhiyun@@ -1664,6 +1720,13 @@ thr_control(void *arg) 322*4882a593Smuzhiyun } 323*4882a593Smuzhiyun } 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun+#ifndef SSL3_ST_SR_CLNT_HELLO_A 326*4882a593Smuzhiyun+# define SSL3_ST_SR_CLNT_HELLO_A (0x110|SSL_ST_ACCEPT) 327*4882a593Smuzhiyun+#endif 328*4882a593Smuzhiyun+#ifndef SSL23_ST_SR_CLNT_HELLO_A 329*4882a593Smuzhiyun+# define SSL23_ST_SR_CLNT_HELLO_A (0x210|SSL_ST_ACCEPT) 330*4882a593Smuzhiyun+#endif 331*4882a593Smuzhiyun+ 332*4882a593Smuzhiyun void 333*4882a593Smuzhiyun SSLINFO_callback(const SSL *ssl, int where, int rc) 334*4882a593Smuzhiyun { 335