-
Notifications
You must be signed in to change notification settings - Fork 8k
Fix GH-17717: Socket maximum timeout of 2147 seconds? #17720
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
base: PHP-8.3
Are you sure you want to change the base?
Conversation
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>
|
Well, let's ignore negative timeouts (and possible overflow) here; the current bug is way more important to fix. |
bukka
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it looks reasonable. But it needs rebase.
| gettimeofday(limit_time, NULL); | ||
| # ifdef PHP_WIN32 | ||
| /* cap timeout (we're not picky regarding usec) */ | ||
| if (limit_time->tv_sec > (LONG_MAX - timeout->tv_sec) + 1) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd probably remove that +1 just in case it gets called with tv_sec 0.
|
@bukka since the fix never made it into 8.3, I think the original fix that caused the regression should be reverted from the 8.3 branch such that we don't ship a regression forever. |
|
@ndossche Why? Regressions fixes can still be done in 8.3 (and even in 8.2), so this can be normally merged to PHP-8.3 once ready... |
|
Yes but it's unfortunate it'll be delayed as it has to wait for a security release. Anyway I know that's what the rules say.. |
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_MINcase (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.