Skip to content

Convert resources to objects in ext/sockets #5900

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

Closed
wants to merge 8 commits into from
Closed
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion UPGRADING
Original file line number Diff line number Diff line change
Expand Up @@ -459,9 +459,16 @@ PHP 8.0 UPGRADE NOTES
. ReflectionType::isBuiltin() method has been moved to ReflectionNamedType.
ReflectionUnionType does not have it.

- Socket:
- Sockets:
. The deprecated AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES
flags for socket_addrinfo_lookup() have been removed.
. socket_create(), socket_create_listen(), socket_accept(),
socket_import_stream(), socket_addrinfo_connect(), socket_addrinfo_bind(),
and socket_wsaprotocol_info_import() will now return a Socket object rather
than a resource. Return value checks using is_resource() should be replaced
with checks for `false`.
. socket_addrinfo_lookup() will now return an array of AddressInfo objects
rather than resources.

- SPL:
. SplFileObject::fgetss() has been removed.
Expand Down
2 changes: 1 addition & 1 deletion ext/posix/tests/posix_ttyname_error_wrongparams.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ PHP Testfest Berlin 2009-05-10
<?php
var_dump(posix_ttyname(0)); // param not a resource
try {
var_dump(posix_ttyname(socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))); // wrong resource type
var_dump(posix_ttyname(finfo_open(FILEINFO_NONE, __DIR__))); // wrong resource type
} catch (TypeError $e) {
echo $e->getMessage(), "\n";
}
Expand Down
27 changes: 13 additions & 14 deletions ext/sockets/conversions.c
Original file line number Diff line number Diff line change
Expand Up @@ -1339,29 +1339,26 @@ static void from_zval_write_fd_array_aux(zval *elem, unsigned i, void **args, se
{
int *iarr = args[0];

if (Z_TYPE_P(elem) == IS_RESOURCE) {
php_stream *stream;
php_socket *sock;
if (Z_TYPE_P(elem) == IS_OBJECT && Z_OBJCE_P(elem) == socket_ce) {
php_socket *sock = Z_SOCKET_P(elem);
iarr[i] = sock->bsd_socket;

sock = (php_socket *)zend_fetch_resource_ex(elem, NULL, php_sockets_le_socket());
if (sock) {
iarr[i] = sock->bsd_socket;
return;
}
return;
} else if (Z_TYPE_P(elem) == IS_RESOURCE) {
php_stream *stream;

stream = (php_stream *)zend_fetch_resource2_ex(elem, NULL, php_file_le_stream(), php_file_le_pstream());
if (stream == NULL) {
do_from_zval_err(ctx, "resource is not a stream or a socket");
do_from_zval_err(ctx, "resource is not a stream");
return;
}

if (php_stream_cast(stream, PHP_STREAM_AS_FD, (void **)&iarr[i - 1],
REPORT_ERRORS) == FAILURE) {
if (php_stream_cast(stream, PHP_STREAM_AS_FD, (void **)&iarr[i - 1], REPORT_ERRORS) == FAILURE) {
do_from_zval_err(ctx, "cast stream to file descriptor failed");
return;
}
} else {
do_from_zval_err(ctx, "expected a resource variable");
do_from_zval_err(ctx, "expected a Socket object or a stream resource");
}
}
void from_zval_write_fd_array(const zval *arr, char *int_arr, ser_context *ctx)
Expand Down Expand Up @@ -1412,8 +1409,10 @@ void to_zval_read_fd_array(const char *data, zval *zv, res_context *ctx)
return;
}
if (S_ISSOCK(statbuf.st_mode)) {
php_socket *sock = socket_import_file_descriptor(fd);
ZVAL_RES(&elem, zend_register_resource(sock, php_sockets_le_socket()));
object_init_ex(&elem, socket_ce);
php_socket *sock = Z_SOCKET_P(&elem);

socket_import_file_descriptor(fd, sock);
} else {
php_stream *stream = php_stream_fopen_from_fd(fd, "rw", NULL);
php_stream_to_zval(stream, &elem);
Expand Down
22 changes: 13 additions & 9 deletions ext/sockets/php_sockets.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,29 +52,33 @@ typedef int PHP_SOCKET;
typedef SOCKET PHP_SOCKET;
#endif

/* Socket class */

typedef struct {
PHP_SOCKET bsd_socket;
int type;
int error;
int blocking;
zval zstream;
zend_object std;
} php_socket;

extern zend_class_entry *socket_ce;

static inline php_socket *socket_from_obj(zend_object *obj) {
return (php_socket *)((char *)(obj) - XtOffsetOf(php_socket, std));
}

#define Z_SOCKET_P(zv) socket_from_obj(Z_OBJ_P(zv))


#ifdef PHP_WIN32
struct sockaddr_un {
short sun_family;
char sun_path[108];
};
#endif

PHP_SOCKETS_API int php_sockets_le_socket(void);
PHP_SOCKETS_API php_socket *php_create_socket(void);
PHP_SOCKETS_API void php_destroy_socket(zend_resource *rsrc);
PHP_SOCKETS_API void php_destroy_sockaddr(zend_resource *rsrc);

#define php_sockets_le_socket_name "Socket"
#define php_sockets_le_addrinfo_name "AddressInfo"

#define PHP_SOCKET_ERROR(socket, msg, errn) \
do { \
int _err = (errn); /* save value to avoid repeated calls to WSAGetLastError() on Windows */ \
Expand Down Expand Up @@ -104,7 +108,7 @@ enum sockopt_return {
};

char *sockets_strerror(int error);
php_socket *socket_import_file_descriptor(PHP_SOCKET sock);
int socket_import_file_descriptor(PHP_SOCKET socket, php_socket *retsock);

#else
#define phpext_sockets_ptr NULL
Expand Down
15 changes: 4 additions & 11 deletions ext/sockets/sendrecvmsg.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,16 +172,13 @@ PHP_FUNCTION(socket_sendmsg)
ssize_t res;

/* zmsg should be passed by ref */
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ra|l", &zsocket, &zmsg, &flags) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oa|l", &zsocket, socket_ce, &zmsg, &flags) == FAILURE) {
RETURN_THROWS();
}

LONG_CHECK_VALID_INT(flags, 3);

if ((php_sock = (php_socket *)zend_fetch_resource(Z_RES_P(zsocket),
php_sockets_le_socket_name, php_sockets_le_socket())) == NULL) {
RETURN_THROWS();
}
php_sock = Z_SOCKET_P(zsocket);

msghdr = from_zval_run_conversions(zmsg, php_sock, from_zval_write_msghdr_send,
sizeof(*msghdr), "msghdr", &allocations, &err);
Expand Down Expand Up @@ -216,17 +213,13 @@ PHP_FUNCTION(socket_recvmsg)
struct err_s err = {0};

//ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ra|l",
&zsocket, &zmsg, &flags) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oa|l", &zsocket, socket_ce, &zmsg, &flags) == FAILURE) {
RETURN_THROWS();
}

LONG_CHECK_VALID_INT(flags, 3);

if ((php_sock = (php_socket *)zend_fetch_resource(Z_RES_P(zsocket),
php_sockets_le_socket_name, php_sockets_le_socket())) == NULL) {
RETURN_THROWS();
}
php_sock = Z_SOCKET_P(zsocket);

msghdr = from_zval_run_conversions(zmsg, php_sock, from_zval_write_msghdr_recv,
sizeof(*msghdr), "msghdr", &allocations, &err);
Expand Down
Loading