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) | ... | ... |