Fix socket_export_stream() with wrong protocol

Closes GH-12310.
This commit is contained in:
twosee 2023-09-28 02:17:47 +08:00
parent e127f87114
commit b5da98b972
No known key found for this signature in database
GPG key ID: 0450D9046197760D
3 changed files with 24 additions and 9 deletions

3
NEWS
View file

@ -59,6 +59,9 @@ PHP NEWS
. Fix return type of stub of xml_parse_into_struct(). (nielsdos) . Fix return type of stub of xml_parse_into_struct(). (nielsdos)
. Fix memory leak when calling xml_parse_into_struct() twice. (nielsdos) . Fix memory leak when calling xml_parse_into_struct() twice. (nielsdos)
- Sockets:
. Fix socket_export_stream() with wrong protocol (twosee)
28 Sep 2023, PHP 8.1.24 28 Sep 2023, PHP 8.1.24
- Core: - Core:

View file

@ -2251,7 +2251,7 @@ PHP_FUNCTION(socket_export_stream)
php_socket *socket; php_socket *socket;
php_stream *stream = NULL; php_stream *stream = NULL;
php_netstream_data_t *stream_data; php_netstream_data_t *stream_data;
char *protocol = NULL; const char *protocol = NULL;
size_t protocollen = 0; size_t protocollen = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &zsocket, socket_ce) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &zsocket, socket_ce) == FAILURE) {
@ -2287,12 +2287,12 @@ PHP_FUNCTION(socket_export_stream)
if (protoid == IPPROTO_TCP) if (protoid == IPPROTO_TCP)
#endif #endif
{ {
protocol = "tcp"; protocol = "tcp://";
protocollen = 3; protocollen = sizeof("tcp://") - 1;
} }
} else if (protoid == SOCK_DGRAM) { } else if (protoid == SOCK_DGRAM) {
protocol = "udp"; protocol = "udp://";
protocollen = 3; protocollen = sizeof("udp://") - 1;
} }
#ifdef PF_UNIX #ifdef PF_UNIX
} else if (socket->type == PF_UNIX) { } else if (socket->type == PF_UNIX) {
@ -2302,11 +2302,11 @@ PHP_FUNCTION(socket_export_stream)
getsockopt(socket->bsd_socket, SOL_SOCKET, SO_TYPE, (char *) &type, &typelen); getsockopt(socket->bsd_socket, SOL_SOCKET, SO_TYPE, (char *) &type, &typelen);
if (type == SOCK_STREAM) { if (type == SOCK_STREAM) {
protocol = "unix"; protocol = "unix://";
protocollen = 4; protocollen = sizeof("unix://") - 1;
} else if (type == SOCK_DGRAM) { } else if (type == SOCK_DGRAM) {
protocol = "udg"; protocol = "udg://";
protocollen = 3; protocollen = sizeof("udg://") - 1;
} }
#endif #endif
} }

View file

@ -0,0 +1,12 @@
--TEST--
Bug - socket_export_stream() with wrong protocol
--EXTENSIONS--
sockets
--FILE--
<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, 0);
$stream = socket_export_stream($sock);
echo stream_get_meta_data($stream)['stream_type']. "\n";
?>
--EXPECT--
udp_socket