diff options
author | Dr. David von Oheimb <David.von.Oheimb@siemens.com> | 2021-11-18 20:38:55 +0100 |
---|---|---|
committer | Dr. David von Oheimb <dev@ddvo.net> | 2021-11-22 13:27:11 +0100 |
commit | f4664e5d40f8736d301763b3e98d2ab0061e3a02 (patch) | |
tree | 96c656a13a20a913ba903c510d2d7af3392a3241 /crypto/http/http_client.c | |
parent | 24ba865cfc7c04fba813ecb86ac7c1b329e3305f (diff) |
HTTP client: workaround for #16028 (BIO_gets not supported by connect and SSL BIOs)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/17066)
Diffstat (limited to 'crypto/http/http_client.c')
-rw-r--r-- | crypto/http/http_client.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/crypto/http/http_client.c b/crypto/http/http_client.c index bb80836cd1..e5c8bcd33d 100644 --- a/crypto/http/http_client.c +++ b/crypto/http/http_client.c @@ -474,7 +474,7 @@ int OSSL_HTTP_REQ_CTX_nbio(OSSL_HTTP_REQ_CTX *rctx) long n; size_t resp_len; const unsigned char *p; - char *key, *value, *line_end = NULL; + char *buf, *key, *value, *line_end = NULL; if (rctx == NULL) { ERR_raise(ERR_LIB_HTTP, ERR_R_PASSED_NULL_PARAMETER); @@ -487,11 +487,20 @@ int OSSL_HTTP_REQ_CTX_nbio(OSSL_HTTP_REQ_CTX *rctx) rctx->redirection_url = NULL; next_io: + buf = (char *)rctx->buf; if ((rctx->state & OHS_NOREAD) == 0) { - if (rctx->expect_asn1) + if (rctx->expect_asn1) { n = BIO_read(rctx->rbio, rctx->buf, rctx->buf_size); - else - n = BIO_gets(rctx->rbio, (char *)rctx->buf, rctx->buf_size); + } else { + (void)ERR_set_mark(); + n = BIO_gets(rctx->rbio, buf, rctx->buf_size); + if (n == -2) { /* unsupported method */ + (void)ERR_pop_to_mark(); + n = BIO_get_line(rctx->rbio, buf, rctx->buf_size); + } else { + (void)ERR_clear_last_mark(); + } + } if (n <= 0) { if (BIO_should_retry(rctx->rbio)) return -1; @@ -592,7 +601,7 @@ int OSSL_HTTP_REQ_CTX_nbio(OSSL_HTTP_REQ_CTX *rctx) } goto next_io; } - n = BIO_gets(rctx->mem, (char *)rctx->buf, rctx->buf_size); + n = BIO_gets(rctx->mem, buf, rctx->buf_size); if (n <= 0) { if (BIO_should_retry(rctx->mem)) @@ -610,7 +619,7 @@ int OSSL_HTTP_REQ_CTX_nbio(OSSL_HTTP_REQ_CTX *rctx) /* First line */ if (rctx->state == OHS_FIRSTLINE) { - switch (parse_http_line1((char *)rctx->buf, &found_keep_alive)) { + switch (parse_http_line1(buf, &found_keep_alive)) { case HTTP_STATUS_CODE_OK: rctx->state = OHS_HEADERS; goto next_line; @@ -628,7 +637,7 @@ int OSSL_HTTP_REQ_CTX_nbio(OSSL_HTTP_REQ_CTX *rctx) return 0; } } - key = (char *)rctx->buf; + key = buf; value = strchr(key, ':'); if (value != NULL) { *(value++) = '\0'; |