Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

http2: Safer invocation of populate_binsettings #12101

Closed
wants to merge 1 commit into from

Conversation

klyubin
Copy link
Contributor

@klyubin klyubin commented Oct 12, 2023

populate_binsettings now returns a negative value on error, instead of a huge positive value. Both places which call this function have been updated to handle this change in its contract.

The way populate_binsettings had been used prior to this change the huge positive values -- due to signed->unsigned conversion of the potentially negative result of
nghttp2_pack_settings_payload which returns negative values on error -- are not possible. But only because http2.c currently always provides a large enough output buffer and provides H2 SETTINGS IVs which pass the verification logic inside nghttp2. If the verification logic were to change or if http2.c started passing in more IVs without increasing the output buffer size, the overflow could become reachable, and libcurl/curl might start leaking memory contents to servers/proxies...

populate_binsettings now returns a negative value on error,
instead of a huge positive value. Both places which call this
function have been updated to handle this change in its
contract.

The way populate_binsettings had been used prior to this change
the huge positive values -- due to signed->unsigned conversion
of the potentially negative result of
nghttp2_pack_settings_payload which returns negative values on
error -- are not possible. But only because http2.c currently
always provides a large enough output buffer and provides H2
SETTINGS IVs which pass the verification logic inside nghttp2.
If the verification logic were to change or if http2.c started
passing in more IVs without increasing the output buffer size,
the overflow could become reachable, and libcurl/curl might
start leaking memory contents to servers/proxies...

binlen = populate_binsettings(binsettings, data);
if(binlen <= 0) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The check is <= 0 instead of < 0 to be consistent with the pre-existing such check in Curl_http2_request_upgrade (below)

Copy link
Member

@bagder bagder left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@bagder bagder closed this in 465f02b Oct 13, 2023
@bagder
Copy link
Member

bagder commented Oct 13, 2023

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

Successfully merging this pull request may close these issues.

2 participants