Skip to content

Commit 67ee0ad

Browse files
committed
TCP_USER_TIMEOUT expects unsigned integer
1 parent d87015f commit 67ee0ad

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

ext/sockets/sockets.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2329,6 +2329,22 @@ PHP_FUNCTION(socket_set_option)
23292329
}
23302330
#endif
23312331

2332+
#if defined(TCP_USER_TIMEOUT)
2333+
case TCP_USER_TIMEOUT: {
2334+
ov = zval_get_long(arg4);
2335+
2336+
// TCP_USER_TIMEOUT unsigned int
2337+
if (ov < 0 || ov > UINT_MAX) {
2338+
zend_argument_value_error(4, "must be of between 0 and %u", UINT_MAX);
2339+
RETURN_FALSE;
2340+
}
2341+
2342+
optlen = sizeof(ov);
2343+
opt_ptr = &ov;
2344+
break;
2345+
}
2346+
#endif
2347+
23322348
#if defined(UDP_SEGMENT)
23332349
case UDP_SEGMENT: {
23342350
ov = zval_get_long(arg4);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
--TEST--
2+
Test if socket_set_option() works, option:SO_SNDTIMEO
3+
--EXTENSIONS--
4+
sockets
5+
--SKIPIF--
6+
<?php
7+
if (!defined('TCP_USER_TIMEOUT')) { die('skip TCP_USER_TIMEOUT is not defined'); }
8+
?>
9+
--FILE--
10+
<?php
11+
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
12+
if (!$socket) {
13+
die('Unable to create AF_INET socket [socket]');
14+
}
15+
socket_set_block($socket);
16+
17+
try {
18+
socket_setopt($src, SOL_TCP, TCP_USER_TIMEOUT, -1);
19+
} catch (\ValueError $e) {
20+
echo $e->getMessage(), PHP_EOL;
21+
}
22+
23+
$timeout = 200;
24+
$retval_2 = socket_set_option( $socket, SOL_TCP, TCP_USER_TIMEOUT, $timeout);
25+
$retval_3 = socket_get_option( $socket, SOL_TCP, TCP_USER_TIMEOUT);
26+
var_dump($retval_2);
27+
var_dump($retval_3 === $timeout);
28+
socket_close($socket);
29+
?>
30+
--EXPECT--
31+
socket_setopt(): Argument #4 ($value) must be of between 0 and %d
32+
bool(true)
33+
bool(true)

0 commit comments

Comments
 (0)