summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Cai <joe.cai@bigcommerce.com>2020-04-20 09:03:11 +1000
committerNikita Popov <nikita.ppv@gmail.com>2020-04-20 10:25:54 +0200
commit94e09bfe558656d3f1470dc960b900a951b0dffc (patch)
tree672e81c0aacc70987f934e34e7857a0788b1962c
parentd31ccb5fc8a0f6f5fded085ee170c8bd99eb83e7 (diff)
downloadphp-git-94e09bfe558656d3f1470dc960b900a951b0dffc.tar.gz
Fix #79497: Fix php_openssl_subtract_timeval()
I stumbled upon this while debugging a strange issue with stream_socket_client() where it randomly throws out errors when the connection timeout is set to below 1s. The logic to calculate time difference in php_openssl_subtract_timeval() is wrong when a.tv_usec < b.tv_usec, causing connection errors before the timeout is reached.
-rw-r--r--NEWS4
-rw-r--r--ext/openssl/xp_ssl.c4
2 files changed, 6 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index adbaf6223e..8f00881b29 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,10 @@ PHP NEWS
. Fixed bug #79441 (Segfault in mb_chr() if internal encoding is unsupported).
(Girgias)
+- OpenSSL:
+ . Fixed bug #79497 (stream_socket_client() throws an unknown error sometimes
+ with <1s timeout). (Joe Cai)
+
- Standard:
. Fixed bug #79468 (SIGSEGV when closing stream handle with a stream filter
appended). (dinosaur)
diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c
index 88d86c2096..ea29a34058 100644
--- a/ext/openssl/xp_ssl.c
+++ b/ext/openssl/xp_ssl.c
@@ -2209,8 +2209,8 @@ static struct timeval php_openssl_subtract_timeval(struct timeval a, struct time
difference.tv_usec = a.tv_usec - b.tv_usec;
if (a.tv_usec < b.tv_usec) {
- b.tv_sec -= 1L;
- b.tv_usec += 1000000L;
+ difference.tv_sec -= 1L;
+ difference.tv_usec += 1000000L;
}
return difference;