Commit e33f2aa2ef836059a5151583b7abc52e1e9515e6
1 parent
03036832
Exists in
master
Falha no handshake SSL estava provocando um segfault
Showing
1 changed file
with
42 additions
and
76 deletions
Show diff stats
src/lib/telnet.c
| @@ -125,7 +125,7 @@ extern struct timeval ds_ts; | @@ -125,7 +125,7 @@ extern struct timeval ds_ts; | ||
| 125 | // static int sock = -1; /* active socket */ | 125 | // static int sock = -1; /* active socket */ |
| 126 | 126 | ||
| 127 | #if defined(HAVE_LIBSSL) /*[*/ | 127 | #if defined(HAVE_LIBSSL) /*[*/ |
| 128 | -static unsigned long last_ssl_error = 0; | 128 | +static unsigned long last_ssl_error = !0; |
| 129 | #endif | 129 | #endif |
| 130 | 130 | ||
| 131 | //#if defined(_WIN32) /*[*/ | 131 | //#if defined(_WIN32) /*[*/ |
| @@ -317,7 +317,7 @@ static void ssl_init(void); | @@ -317,7 +317,7 @@ static void ssl_init(void); | ||
| 317 | #else /*][*/ | 317 | #else /*][*/ |
| 318 | #define INFO_CONST | 318 | #define INFO_CONST |
| 319 | #endif /*]*/ | 319 | #endif /*]*/ |
| 320 | -static void client_info_callback(INFO_CONST SSL *s, int where, int ret); | 320 | +static void ssl_info_callback(INFO_CONST SSL *s, int where, int ret); |
| 321 | static void continue_tls(unsigned char *sbbuf, int len); | 321 | static void continue_tls(unsigned char *sbbuf, int len); |
| 322 | #endif /*]*/ | 322 | #endif /*]*/ |
| 323 | 323 | ||
| @@ -418,6 +418,11 @@ LIB3270_EXPORT void popup_a_sockerr(char *fmt, ...) | @@ -418,6 +418,11 @@ LIB3270_EXPORT void popup_a_sockerr(char *fmt, ...) | ||
| 418 | } | 418 | } |
| 419 | #endif | 419 | #endif |
| 420 | 420 | ||
| 421 | +static int bgconnect(H3270 *h, void *dunno) | ||
| 422 | +{ | ||
| 423 | + return connect(h3270.sock, &haddr.sa, ha_len); | ||
| 424 | +} | ||
| 425 | + | ||
| 421 | /* | 426 | /* |
| 422 | * net_connect | 427 | * net_connect |
| 423 | * Establish a telnet socket to the given host passed as an argument. | 428 | * Establish a telnet socket to the given host passed as an argument. |
| @@ -528,16 +533,6 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | @@ -528,16 +533,6 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | ||
| 528 | status_resolving(&h3270,0); | 533 | status_resolving(&h3270,0); |
| 529 | } | 534 | } |
| 530 | } else { | 535 | } else { |
| 531 | -/* | ||
| 532 | -#if defined(LOCAL_PROCESS) | ||
| 533 | - if (ls) { | ||
| 534 | - local_process = True; | ||
| 535 | - } else { | ||
| 536 | -#endif | ||
| 537 | -#if defined(LOCAL_PROCESS) | ||
| 538 | - local_process = False; | ||
| 539 | -#endif | ||
| 540 | -*/ | ||
| 541 | status_resolving(&h3270,1); | 536 | status_resolving(&h3270,1); |
| 542 | if (resolve_host_and_port(host, portname, | 537 | if (resolve_host_and_port(host, portname, |
| 543 | &h3270.current_port, &haddr.sa, &ha_len, | 538 | &h3270.current_port, &haddr.sa, &ha_len, |
| @@ -547,57 +542,8 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | @@ -547,57 +542,8 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | ||
| 547 | return -1; | 542 | return -1; |
| 548 | status_resolving(&h3270,0); | 543 | status_resolving(&h3270,0); |
| 549 | } | 544 | } |
| 550 | -/* | ||
| 551 | -#if defined(LOCAL_PROCESS) | ||
| 552 | - } | ||
| 553 | -#endif | ||
| 554 | -*/ | ||
| 555 | } | 545 | } |
| 556 | 546 | ||
| 557 | -/* | ||
| 558 | -#if defined(LOCAL_PROCESS) | ||
| 559 | - if (local_process) { | ||
| 560 | - int amaster; | ||
| 561 | - struct winsize w; | ||
| 562 | - | ||
| 563 | - w.ws_row = XMIT_ROWS; | ||
| 564 | - w.ws_col = XMIT_COLS; | ||
| 565 | - w.ws_xpixel = 0; | ||
| 566 | - w.ws_ypixel = 0; | ||
| 567 | - | ||
| 568 | - switch (forkpty(&amaster, NULL, NULL, &w)) { | ||
| 569 | - case -1: // failed | ||
| 570 | - popup_an_errno(errno, "forkpty"); | ||
| 571 | - close_fail; | ||
| 572 | - case 0: // child | ||
| 573 | - putenv("TERM=xterm"); | ||
| 574 | - if (strchr(host, ' ') != CN) { | ||
| 575 | - (void) execlp("/bin/sh", "sh", "-c", host, | ||
| 576 | - NULL); | ||
| 577 | - } else { | ||
| 578 | - char *arg1; | ||
| 579 | - | ||
| 580 | - arg1 = strrchr(host, '/'); | ||
| 581 | - (void) execlp(host, | ||
| 582 | - (arg1 == CN) ? host : arg1 + 1, | ||
| 583 | - NULL); | ||
| 584 | - } | ||
| 585 | - perror(host); | ||
| 586 | - #warning Notify User | ||
| 587 | - _exit(1); | ||
| 588 | - break; | ||
| 589 | - default: // parent | ||
| 590 | - sock = amaster; | ||
| 591 | -#if !defined(_WIN32) | ||
| 592 | - (void) fcntl(sock, F_SETFD, 1); | ||
| 593 | -#endif | ||
| 594 | - net_connected(); | ||
| 595 | - host_in3270(CONNECTED_ANSI); | ||
| 596 | - break; | ||
| 597 | - } | ||
| 598 | - } else { | ||
| 599 | -#endif | ||
| 600 | -*/ | ||
| 601 | /* create the socket */ | 547 | /* create the socket */ |
| 602 | if ((h3270.sock = socket(haddr.sa.sa_family, SOCK_STREAM, 0)) == -1) { | 548 | if ((h3270.sock = socket(haddr.sa.sa_family, SOCK_STREAM, 0)) == -1) { |
| 603 | popup_a_sockerr( N_( "socket" ) ); | 549 | popup_a_sockerr( N_( "socket" ) ); |
| @@ -624,17 +570,22 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | @@ -624,17 +570,22 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | ||
| 624 | #endif /*]*/ | 570 | #endif /*]*/ |
| 625 | 571 | ||
| 626 | /* set the socket to be non-delaying */ | 572 | /* set the socket to be non-delaying */ |
| 627 | -#if defined(_WIN32) /*[*/ | 573 | +/* |
| 574 | +#if defined(_WIN32) | ||
| 628 | if (non_blocking(False) < 0) | 575 | if (non_blocking(False) < 0) |
| 629 | -#else /*][*/ | 576 | +#else |
| 630 | if (non_blocking(True) < 0) | 577 | if (non_blocking(True) < 0) |
| 631 | -#endif /*]*/ | 578 | +#endif |
| 632 | close_fail; | 579 | close_fail; |
| 580 | +*/ | ||
| 633 | 581 | ||
| 634 | -#if !defined(_WIN32) /*[*/ | 582 | + if (non_blocking(False) < 0) |
| 583 | + close_fail; | ||
| 584 | + | ||
| 585 | +#if !defined(_WIN32) | ||
| 635 | /* don't share the socket with our children */ | 586 | /* don't share the socket with our children */ |
| 636 | (void) fcntl(h3270.sock, F_SETFD, 1); | 587 | (void) fcntl(h3270.sock, F_SETFD, 1); |
| 637 | -#endif /*]*/ | 588 | +#endif |
| 638 | 589 | ||
| 639 | /* init ssl */ | 590 | /* init ssl */ |
| 640 | #if defined(HAVE_LIBSSL) /*[*/ | 591 | #if defined(HAVE_LIBSSL) /*[*/ |
| @@ -645,17 +596,33 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | @@ -645,17 +596,33 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | ||
| 645 | 596 | ||
| 646 | /* connect */ | 597 | /* connect */ |
| 647 | status_connecting(&h3270,1); | 598 | status_connecting(&h3270,1); |
| 599 | + | ||
| 600 | + if(CallAndWait((int (*)(H3270 *, void *)) bgconnect,&h3270,NULL) == -1) | ||
| 601 | + { | ||
| 602 | + Trace("Connect failed: %s (rc=%d)",strerror(socket_errno()),socket_errno()); | ||
| 603 | + popup_a_sockerr( N_( "Can't connect to %s:%d" ),h3270.hostname, h3270.current_port); | ||
| 604 | + close_fail; | ||
| 605 | + } | ||
| 606 | + else | ||
| 607 | + { | ||
| 608 | + net_connected(&h3270); | ||
| 609 | + } | ||
| 610 | + | ||
| 611 | +/* | ||
| 648 | if (connect(h3270.sock, &haddr.sa, ha_len) == -1) { | 612 | if (connect(h3270.sock, &haddr.sa, ha_len) == -1) { |
| 613 | + | ||
| 614 | + Trace("Connect failed: %s (rc=%d)",strerror(socket_errno()),socket_errno()); | ||
| 615 | + | ||
| 649 | if (socket_errno() == SE_EWOULDBLOCK | 616 | if (socket_errno() == SE_EWOULDBLOCK |
| 650 | -#if defined(SE_EINPROGRESS) /*[*/ | 617 | +#if defined(SE_EINPROGRESS) |
| 651 | || socket_errno() == SE_EINPROGRESS | 618 | || socket_errno() == SE_EINPROGRESS |
| 652 | -#endif /*]*/ | 619 | +#endif |
| 653 | ) { | 620 | ) { |
| 654 | trace_dsn("Connection pending.\n"); | 621 | trace_dsn("Connection pending.\n"); |
| 655 | *pending = True; | 622 | *pending = True; |
| 656 | -#if !defined(_WIN32) /*[*/ | 623 | +#if !defined(_WIN32) |
| 657 | output_id = AddOutput(h3270.sock, &h3270, output_possible); | 624 | output_id = AddOutput(h3270.sock, &h3270, output_possible); |
| 658 | -#endif /*]*/ | 625 | +#endif |
| 659 | } else { | 626 | } else { |
| 660 | popup_a_sockerr( N_( "Can't connect to %s:%d" ),h3270.hostname, h3270.current_port); | 627 | popup_a_sockerr( N_( "Can't connect to %s:%d" ),h3270.hostname, h3270.current_port); |
| 661 | close_fail; | 628 | close_fail; |
| @@ -665,10 +632,6 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | @@ -665,10 +632,6 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving | ||
| 665 | close_fail; | 632 | close_fail; |
| 666 | net_connected(&h3270); | 633 | net_connected(&h3270); |
| 667 | } | 634 | } |
| 668 | -/* | ||
| 669 | -#if defined(LOCAL_PROCESS) | ||
| 670 | - } | ||
| 671 | -#endif | ||
| 672 | */ | 635 | */ |
| 673 | 636 | ||
| 674 | /* set up temporary termtype */ | 637 | /* set up temporary termtype */ |
| @@ -1943,6 +1906,8 @@ process_eor(void) | @@ -1943,6 +1906,8 @@ process_eor(void) | ||
| 1943 | */ | 1906 | */ |
| 1944 | void net_exception(H3270 *session) | 1907 | void net_exception(H3270 *session) |
| 1945 | { | 1908 | { |
| 1909 | + CHECK_SESSION_HANDLE(session); | ||
| 1910 | + | ||
| 1946 | #if defined(LOCAL_PROCESS) /*[*/ | 1911 | #if defined(LOCAL_PROCESS) /*[*/ |
| 1947 | if (local_process) { | 1912 | if (local_process) { |
| 1948 | trace_dsn("RCVD exception\n"); | 1913 | trace_dsn("RCVD exception\n"); |
| @@ -3231,7 +3196,7 @@ ssl_init(void) | @@ -3231,7 +3196,7 @@ ssl_init(void) | ||
| 3231 | } | 3196 | } |
| 3232 | SSL_set_verify(ssl_con, 0/*xxx*/, NULL); | 3197 | SSL_set_verify(ssl_con, 0/*xxx*/, NULL); |
| 3233 | 3198 | ||
| 3234 | - SSL_CTX_set_info_callback(ssl_ctx, client_info_callback); | 3199 | + SSL_CTX_set_info_callback(ssl_ctx, ssl_info_callback); |
| 3235 | 3200 | ||
| 3236 | /* XXX: May need to get key file and password. */ | 3201 | /* XXX: May need to get key file and password. */ |
| 3237 | if (appres.cert_file) | 3202 | if (appres.cert_file) |
| @@ -3254,7 +3219,7 @@ ssl_init(void) | @@ -3254,7 +3219,7 @@ ssl_init(void) | ||
| 3254 | } | 3219 | } |
| 3255 | 3220 | ||
| 3256 | /* Callback for tracing protocol negotiation. */ | 3221 | /* Callback for tracing protocol negotiation. */ |
| 3257 | -static void client_info_callback(INFO_CONST SSL *s, int where, int ret) | 3222 | +static void ssl_info_callback(INFO_CONST SSL *s, int where, int ret) |
| 3258 | { | 3223 | { |
| 3259 | if (where == SSL_CB_CONNECT_LOOP) | 3224 | if (where == SSL_CB_CONNECT_LOOP) |
| 3260 | { | 3225 | { |
| @@ -3301,6 +3266,7 @@ static void client_info_callback(INFO_CONST SSL *s, int where, int ret) | @@ -3301,6 +3266,7 @@ static void client_info_callback(INFO_CONST SSL *s, int where, int ret) | ||
| 3301 | err_buf[0] = '\0'; | 3266 | err_buf[0] = '\0'; |
| 3302 | } | 3267 | } |
| 3303 | 3268 | ||
| 3269 | + Trace("SSL Connect error in %s\nState: %s\nAlert: %s\n",err_buf,SSL_state_string_long(s),SSL_alert_type_string_long(ret)); | ||
| 3304 | trace_dsn("SSL Connect error in %s\nState: %s\nAlert: %s\n",err_buf,SSL_state_string_long(s),SSL_alert_type_string_long(ret)); | 3270 | trace_dsn("SSL Connect error in %s\nState: %s\nAlert: %s\n",err_buf,SSL_state_string_long(s),SSL_alert_type_string_long(ret)); |
| 3305 | 3271 | ||
| 3306 | if(showing) | 3272 | if(showing) |