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

Fix GH-17717: Socket maximum timeout of 2147 seconds? #17720

Open
wants to merge 1 commit into
base: PHP-8.3
Choose a base branch
from

Conversation

cmb69
Copy link
Member

@cmb69 cmb69 commented Feb 6, 2025

The fix for GH-16809[1] used a way too small timeout maximum on Windows. We correct this.

However, later on the timeout is applied to the current timestamp, so we would need to take that into account, but due to the elapsed time between the check and the actual network request, this could not be precise, and the resulting error message would be confusing, since after the developer would adjust the timeout to the reported maximum, the check would fail again, now reporting a lower maximum timeout.

Thus we silently cap the value in php_network_set_limit_time() to avoid undefined behavior, and are not picky about the usec value (we just assume a second more), since there is a bigger issue, namely that we hit the Y2038 problem on Windows.

[1] #16810


Note that ext/standard/tests/http/gh16810.phpt fails for me on Windows with UBSan enabled for the PHP_INT_MIN case (with or without this patch); I wonder if this actually happens on POSIX systems, too. If so, we would also need to check for a minimum timeout on all platforms; otherwise only on Windows. And frankly, I don't quite understand why we would allow negative timeout values at all.

I'll have a look at how the Y2038 problem on Windows could be resolved. It's not super urgent (I don't assume that anybody uses very large timeouts anyway), but since it currently affects even 64bit platforms, that needs to be improved.

The fix for phpGH-16809[1] used a way too small timeout maximum on
Windows.  We correct this.

However, later on the timeout is applied to the current timestamp, so
we would need to take that into account, but due to the elapsed time
between the check and the actual network request, this could not be
precise, and the resulting error message would be confusing, since
after the developer would adjust the timeout to the reported maximum,
the check would fail again, now reporting a lower maximum timeout.

Thus we silently cap the value in `php_network_set_limit_time()` to
avoid undefined behavior, and are not picky about the usec value (we
just assume a second more), since there is a bigger issue, namely that
we hit the Y2038 problem on Windows.

[1] <php#16810>
@cmb69 cmb69 linked an issue Feb 18, 2025 that may be closed by this pull request
@cmb69
Copy link
Member Author

cmb69 commented Feb 18, 2025

Well, let's ignore negative timeouts (and possible overflow) here; the current bug is way more important to fix.

@cmb69 cmb69 marked this pull request as ready for review February 18, 2025 17:36
@cmb69 cmb69 requested a review from bukka as a code owner February 18, 2025 17:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Socket maximum timeout of 2147 seconds?
1 participant