You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.9 KiB
105 lines
2.9 KiB
diff -up wget-1.14/src/openssl.c.ssltimeout wget-1.14/src/openssl.c |
|
--- wget-1.14/src/openssl.c.ssltimeout 2012-08-09 14:30:14.987964706 +0200 |
|
+++ wget-1.14/src/openssl.c 2012-08-09 14:44:05.467660741 +0200 |
|
@@ -256,19 +256,42 @@ struct openssl_transport_context { |
|
char *last_error; /* last error printed with openssl_errstr */ |
|
}; |
|
|
|
-static int |
|
-openssl_read (int fd, char *buf, int bufsize, void *arg) |
|
-{ |
|
- int ret; |
|
- struct openssl_transport_context *ctx = arg; |
|
+struct openssl_read_args { |
|
+ int fd; |
|
+ struct openssl_transport_context *ctx; |
|
+ char *buf; |
|
+ int bufsize; |
|
+ int retval; |
|
+}; |
|
+ |
|
+static void openssl_read_callback(void *arg) { |
|
+ struct openssl_read_args *args = (struct openssl_read_args *) arg; |
|
+ struct openssl_transport_context *ctx = args->ctx; |
|
SSL *conn = ctx->conn; |
|
+ char *buf = args->buf; |
|
+ int bufsize = args->bufsize; |
|
+ int ret; |
|
+ |
|
do |
|
ret = SSL_read (conn, buf, bufsize); |
|
- while (ret == -1 |
|
- && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL |
|
+ while (ret == -1 && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL |
|
&& errno == EINTR); |
|
+ args->retval = ret; |
|
+} |
|
|
|
- return ret; |
|
+static int |
|
+openssl_read (int fd, char *buf, int bufsize, void *arg) |
|
+{ |
|
+ struct openssl_read_args args; |
|
+ args.fd = fd; |
|
+ args.buf = buf; |
|
+ args.bufsize = bufsize; |
|
+ args.ctx = (struct openssl_transport_context*) arg; |
|
+ |
|
+ if (run_with_timeout(opt.read_timeout, openssl_read_callback, &args)) { |
|
+ return -1; |
|
+ } |
|
+ return args.retval; |
|
} |
|
|
|
static int |
|
@@ -386,6 +409,18 @@ static struct transport_implementation o |
|
openssl_peek, openssl_errstr, openssl_close |
|
}; |
|
|
|
+struct scwt_context { |
|
+ SSL *ssl; |
|
+ int result; |
|
+}; |
|
+ |
|
+static void |
|
+ssl_connect_with_timeout_callback(void *arg) |
|
+{ |
|
+ struct scwt_context *ctx = (struct scwt_context *)arg; |
|
+ ctx->result = SSL_connect(ctx->ssl); |
|
+} |
|
+ |
|
/* Perform the SSL handshake on file descriptor FD, which is assumed |
|
to be connected to an SSL server. The SSL handle provided by |
|
OpenSSL is registered with the file descriptor FD using |
|
@@ -398,6 +433,7 @@ bool |
|
ssl_connect_wget (int fd, const char *hostname) |
|
{ |
|
SSL *conn; |
|
+ struct scwt_context scwt_ctx; |
|
struct openssl_transport_context *ctx; |
|
|
|
DEBUGP (("Initiating SSL handshake.\n")); |
|
@@ -425,7 +461,14 @@ ssl_connect_wget (int fd, const char *ho |
|
if (!SSL_set_fd (conn, FD_TO_SOCKET (fd))) |
|
goto error; |
|
SSL_set_connect_state (conn); |
|
- if (SSL_connect (conn) <= 0 || conn->state != SSL_ST_OK) |
|
+ |
|
+ scwt_ctx.ssl = conn; |
|
+ if (run_with_timeout(opt.read_timeout, ssl_connect_with_timeout_callback, |
|
+ &scwt_ctx)) { |
|
+ DEBUGP (("SSL handshake timed out.\n")); |
|
+ goto timeout; |
|
+ } |
|
+ if (scwt_ctx.result <= 0 || conn->state != SSL_ST_OK) |
|
goto error; |
|
|
|
ctx = xnew0 (struct openssl_transport_context); |
|
@@ -441,6 +484,7 @@ ssl_connect_wget (int fd, const char *ho |
|
error: |
|
DEBUGP (("SSL handshake failed.\n")); |
|
print_errors (); |
|
+ timeout: |
|
if (conn) |
|
SSL_free (conn); |
|
return false;
|
|
|