@@ -35,10 +35,12 @@
35 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
36 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <openssl/bio.h>
37 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <openssl/ssl.h>
38 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <openssl/err.h>
39 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <openssl/x509.h>
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #include <poll.h>
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #include <fcntl.h>
40 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
41 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <assert.h>
42 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <sys/types.h>
43 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
44 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -505,10 +507,19 @@
505 507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pUrlData->useProxy ? pUrlData->proxyOrigPort : pUrlData->port,
506 508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ERR_reason_error_string(ERR_get_error()));
507 509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_close_client();
508 510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
509 511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The TLS handshake completes on a blocking socket. Switch to non-blocking
514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** afterwards so that a stalled read returns instead of sleeping in the
515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** kernel indefinitely; ssl_send()/ssl_receive() use poll() with a timeout
516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to wait for the socket and abandon a connection that has gone silent. */
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fd = socket_get_fd();
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fl = fcntl(fd, F_GETFL, 0);
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fl!=-1 ) fcntl(fd, F_SETFL, fl | O_NONBLOCK);
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
510 521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if certificate is valid */
511 522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cert = SSL_get_peer_certificate(ssl);
512 523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
513 524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if ( cert==NULL ){
514 525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ssl_set_errmsg("No SSL certificate was presented by the peer");
@@ -648,21 +659,23 @@
648 659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Send content out over the SSL connection from the client to
649 660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the server.
650 661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
651 662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t ssl_send(void *NotUsed, void *pContent, size_t N){
652 663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t total = 0;
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nStall = 0;
654 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( N>0 ){
655 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int sent = BIO_write(iBio, pContent, N);
656 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sent<=0 ){
657 667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( BIO_should_retry(iBio) ){
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ++nStall > 4 ) break;
668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct pollfd pfd;
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pfd.fd = socket_get_fd();
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pfd.events = BIO_should_read(iBio) ? POLLIN : POLLOUT;
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( poll(&pfd, 1, 120000)<=0 ) break;
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pfd.revents & (POLLHUP|POLLERR|POLLNVAL) ) break;
659 673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
660 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
661 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
662 676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nStall = 0;
664 677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
total += sent;
665 678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
N -= sent;
666 679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pContent = (void*)&((char*)pContent)[sent];
667 680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
668 681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return total;
@@ -672,23 +685,23 @@
672 685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Receive content back from the client SSL connection. In other
673 686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** words read the reply back from the server.
674 687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
675 688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t ssl_receive(void *NotUsed, void *pContent, size_t N){
676 689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
size_t total = 0;
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nStall = 0;
678 690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( N>0 ){
679 691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int got = BIO_read(iBio, pContent, N);
680 692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( got<=0 ){
681 693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( BIO_should_retry(iBio) ){
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* SO_RCVTIMEO made the underlying read time out with no data.
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Allow a few consecutive stalls, then give up. */
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ++nStall > 4 ) break;
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct pollfd pfd;
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pfd.fd = socket_get_fd();
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pfd.events = BIO_should_write(iBio) ? POLLOUT : POLLIN;
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( poll(&pfd, 1, 120000)<=0 ) break;
698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pfd.revents & (POLLHUP|POLLERR|POLLNVAL) ) break;
685 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
686 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
687 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
688 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nStall = 0;
690 703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
total += got;
691 704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
N -= got;
692 705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pContent = (void*)&((char*)pContent)[got];
693 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
694 707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return total;
695 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!