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 | 125 | // static int sock = -1; /* active socket */ |
| 126 | 126 | |
| 127 | 127 | #if defined(HAVE_LIBSSL) /*[*/ |
| 128 | -static unsigned long last_ssl_error = 0; | |
| 128 | +static unsigned long last_ssl_error = !0; | |
| 129 | 129 | #endif |
| 130 | 130 | |
| 131 | 131 | //#if defined(_WIN32) /*[*/ |
| ... | ... | @@ -317,7 +317,7 @@ static void ssl_init(void); |
| 317 | 317 | #else /*][*/ |
| 318 | 318 | #define INFO_CONST |
| 319 | 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 | 321 | static void continue_tls(unsigned char *sbbuf, int len); |
| 322 | 322 | #endif /*]*/ |
| 323 | 323 | |
| ... | ... | @@ -418,6 +418,11 @@ LIB3270_EXPORT void popup_a_sockerr(char *fmt, ...) |
| 418 | 418 | } |
| 419 | 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 | 427 | * net_connect |
| 423 | 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 | 533 | status_resolving(&h3270,0); |
| 529 | 534 | } |
| 530 | 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 | 536 | status_resolving(&h3270,1); |
| 542 | 537 | if (resolve_host_and_port(host, portname, |
| 543 | 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 | 542 | return -1; |
| 548 | 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 | 547 | /* create the socket */ |
| 602 | 548 | if ((h3270.sock = socket(haddr.sa.sa_family, SOCK_STREAM, 0)) == -1) { |
| 603 | 549 | popup_a_sockerr( N_( "socket" ) ); |
| ... | ... | @@ -624,17 +570,22 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving |
| 624 | 570 | #endif /*]*/ |
| 625 | 571 | |
| 626 | 572 | /* set the socket to be non-delaying */ |
| 627 | -#if defined(_WIN32) /*[*/ | |
| 573 | +/* | |
| 574 | +#if defined(_WIN32) | |
| 628 | 575 | if (non_blocking(False) < 0) |
| 629 | -#else /*][*/ | |
| 576 | +#else | |
| 630 | 577 | if (non_blocking(True) < 0) |
| 631 | -#endif /*]*/ | |
| 578 | +#endif | |
| 632 | 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 | 586 | /* don't share the socket with our children */ |
| 636 | 587 | (void) fcntl(h3270.sock, F_SETFD, 1); |
| 637 | -#endif /*]*/ | |
| 588 | +#endif | |
| 638 | 589 | |
| 639 | 590 | /* init ssl */ |
| 640 | 591 | #if defined(HAVE_LIBSSL) /*[*/ |
| ... | ... | @@ -645,17 +596,33 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving |
| 645 | 596 | |
| 646 | 597 | /* connect */ |
| 647 | 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 | 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 | 616 | if (socket_errno() == SE_EWOULDBLOCK |
| 650 | -#if defined(SE_EINPROGRESS) /*[*/ | |
| 617 | +#if defined(SE_EINPROGRESS) | |
| 651 | 618 | || socket_errno() == SE_EINPROGRESS |
| 652 | -#endif /*]*/ | |
| 619 | +#endif | |
| 653 | 620 | ) { |
| 654 | 621 | trace_dsn("Connection pending.\n"); |
| 655 | 622 | *pending = True; |
| 656 | -#if !defined(_WIN32) /*[*/ | |
| 623 | +#if !defined(_WIN32) | |
| 657 | 624 | output_id = AddOutput(h3270.sock, &h3270, output_possible); |
| 658 | -#endif /*]*/ | |
| 625 | +#endif | |
| 659 | 626 | } else { |
| 660 | 627 | popup_a_sockerr( N_( "Can't connect to %s:%d" ),h3270.hostname, h3270.current_port); |
| 661 | 628 | close_fail; |
| ... | ... | @@ -665,10 +632,6 @@ int net_connect(const char *host, char *portname, Boolean ls, Boolean *resolving |
| 665 | 632 | close_fail; |
| 666 | 633 | net_connected(&h3270); |
| 667 | 634 | } |
| 668 | -/* | |
| 669 | -#if defined(LOCAL_PROCESS) | |
| 670 | - } | |
| 671 | -#endif | |
| 672 | 635 | */ |
| 673 | 636 | |
| 674 | 637 | /* set up temporary termtype */ |
| ... | ... | @@ -1943,6 +1906,8 @@ process_eor(void) |
| 1943 | 1906 | */ |
| 1944 | 1907 | void net_exception(H3270 *session) |
| 1945 | 1908 | { |
| 1909 | + CHECK_SESSION_HANDLE(session); | |
| 1910 | + | |
| 1946 | 1911 | #if defined(LOCAL_PROCESS) /*[*/ |
| 1947 | 1912 | if (local_process) { |
| 1948 | 1913 | trace_dsn("RCVD exception\n"); |
| ... | ... | @@ -3231,7 +3196,7 @@ ssl_init(void) |
| 3231 | 3196 | } |
| 3232 | 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 | 3201 | /* XXX: May need to get key file and password. */ |
| 3237 | 3202 | if (appres.cert_file) |
| ... | ... | @@ -3254,7 +3219,7 @@ ssl_init(void) |
| 3254 | 3219 | } |
| 3255 | 3220 | |
| 3256 | 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 | 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 | 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 | 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 | 3272 | if(showing) | ... | ... |