diff options
author | Daniel Stenberg <daniel@haxx.se> | 2022-06-09 09:27:24 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2022-06-25 22:13:09 +0200 |
commit | 6ecdf5136b52af747e7bda08db9a748256b1cd09 (patch) | |
tree | 8841ee177c4dcef7ba351c9950877a399b5de7e8 /lib/krb5.c | |
parent | 2b67a0a1129b20a56ed04859fec8999f5c0c4280 (diff) | |
download | curl-6ecdf5136b52af747e7bda08db9a748256b1cd09.tar.gz |
krb5: return error properly on decode errors
Bug: https://curl.se/docs/CVE-2022-32208.html
CVE-2022-32208
Reported-by: Harry Sintonen
Closes #9051
Diffstat (limited to 'lib/krb5.c')
-rw-r--r-- | lib/krb5.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/krb5.c b/lib/krb5.c index e289595c9..517491c46 100644 --- a/lib/krb5.c +++ b/lib/krb5.c @@ -142,11 +142,8 @@ krb5_decode(void *app_data, void *buf, int len, enc.value = buf; enc.length = len; maj = gss_unwrap(&min, *context, &enc, &dec, NULL, NULL); - if(maj != GSS_S_COMPLETE) { - if(len >= 4) - strcpy(buf, "599 "); + if(maj != GSS_S_COMPLETE) return -1; - } memcpy(buf, dec.value, dec.length); len = curlx_uztosi(dec.length); @@ -508,6 +505,7 @@ static CURLcode read_data(struct connectdata *conn, { int len; CURLcode result; + int nread; result = socket_read(fd, &len, sizeof(len)); if(result) @@ -516,7 +514,10 @@ static CURLcode read_data(struct connectdata *conn, if(len) { /* only realloc if there was a length */ len = ntohl(len); - buf->data = Curl_saferealloc(buf->data, len); + if(len > CURL_MAX_INPUT_LENGTH) + len = 0; + else + buf->data = Curl_saferealloc(buf->data, len); } if(!len || !buf->data) return CURLE_OUT_OF_MEMORY; @@ -524,8 +525,11 @@ static CURLcode read_data(struct connectdata *conn, result = socket_read(fd, buf->data, len); if(result) return result; - buf->size = conn->mech->decode(conn->app_data, buf->data, len, - conn->data_prot, conn); + nread = conn->mech->decode(conn->app_data, buf->data, len, + conn->data_prot, conn); + if(nread < 0) + return CURLE_RECV_ERROR; + buf->size = (size_t)nread; buf->index = 0; return CURLE_OK; } |