diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-08-05 10:55:41 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-08-05 16:41:40 +0200 |
commit | 6a1bd57df5c6c92af3dfb42695de17be45d02d1e (patch) | |
tree | 9f400b099b7480a8a152421b4faf41cf01be46cf | |
parent | da786a22af1632272d08a98352da9bbaecbe438a (diff) | |
download | php-git-6a1bd57df5c6c92af3dfb42695de17be45d02d1e.tar.gz |
Fix memory leak on socket_sendmsg() / socket_recvmsg() error
-rw-r--r-- | ext/sockets/sendrecvmsg.c | 15 | ||||
-rw-r--r-- | ext/sockets/tests/socket_sendrecvmsg_error.phpt | 15 |
2 files changed, 22 insertions, 8 deletions
diff --git a/ext/sockets/sendrecvmsg.c b/ext/sockets/sendrecvmsg.c index 4cf9fcdb65..7d1265c3e7 100644 --- a/ext/sockets/sendrecvmsg.c +++ b/ext/sockets/sendrecvmsg.c @@ -197,14 +197,13 @@ PHP_FUNCTION(socket_sendmsg) res = sendmsg(php_sock->bsd_socket, msghdr, (int)flags); if (res != -1) { - zend_llist_destroy(allocations); - efree(allocations); - - RETURN_LONG((zend_long)res); + RETVAL_LONG((zend_long)res); } else { PHP_SOCKET_ERROR(php_sock, "error in sendmsg", errno); - RETURN_FALSE; + RETVAL_FALSE; } + + allocations_dispose(&allocations); } PHP_FUNCTION(socket_recvmsg) @@ -254,7 +253,6 @@ PHP_FUNCTION(socket_recvmsg) /* we don;t need msghdr anymore; free it */ msghdr = NULL; - allocations_dispose(&allocations); zval_ptr_dtor(zmsg); if (!err.has_error) { @@ -265,14 +263,15 @@ PHP_FUNCTION(socket_recvmsg) /* no need to destroy/free zres -- it's NULL in this circumstance */ assert(zres == NULL); } + RETVAL_LONG((zend_long)res); } else { SOCKETS_G(last_error) = errno; php_error_docref(NULL, E_WARNING, "error in recvmsg [%d]: %s", errno, sockets_strerror(errno)); - RETURN_FALSE; + RETVAL_FALSE; } - RETURN_LONG((zend_long)res); + allocations_dispose(&allocations); } PHP_FUNCTION(socket_cmsg_space) diff --git a/ext/sockets/tests/socket_sendrecvmsg_error.phpt b/ext/sockets/tests/socket_sendrecvmsg_error.phpt new file mode 100644 index 0000000000..8cd353c769 --- /dev/null +++ b/ext/sockets/tests/socket_sendrecvmsg_error.phpt @@ -0,0 +1,15 @@ +--TEST-- +Error during socket_sendmsg() or socket_recvmsg() +--FILE-- +<?php + +$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); +socket_sendmsg($socket, [], -1); +$message = ['controllen' => 1]; +socket_recvmsg($socket, $message, -1); + +?> +--EXPECTF-- +Warning: socket_sendmsg(): error in sendmsg [%d]: %a in %s on line %d + +Warning: socket_recvmsg(): error in recvmsg [%d]: %a in %s on line %d |