The following code segfaults after either I call die/exit or call
socketi_accept once again.
Can anyone spot anything working with it?
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_hello.h"
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <errno.h>
#define IS_INVALID_SOCKET(a) (a->bsd_socket < 0)
#define set_errno(a) (errno = a)
static
ZEND_BEGIN_ARG_INFO(second_and_third_args_force_ref, 0)
ZEND_ARG_PASS_INFO(0)
ZEND_ARG_PASS_INFO(1)
ZEND_ARG_PASS_INFO(1)
ZEND_END_ARG_INFO();
static int le_socket = -1;
#define le_socket_name "Socket"
static socklen_t s_len = sizeof(struct sockaddr);
static function_entry hello_functions[] = {
PHP_FE(hello_world, first_arg_force_ref)
PHP_FE(socketi_accept, second_and_third_args_force_ref)
{NULL, NULL, NULL}
};
/*--- */
PHP_MINFO_FUNCTION(hello)
{
php_info_print_table_start();
php_info_print_table_row(2, "Sockets Improved Support", "enabled");
php_info_print_table_end();
}
PHP_RINIT_FUNCTION(hello)
{
return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(hello)
{
return SUCCESS;
}
/*----*/
PHP_MINIT_FUNCTION(hello);
zend_module_entry hello_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
STANDARD_MODULE_HEADER,
#endif
PHP_HELLO_WORLD_EXTNAME,
hello_functions,
PHP_MINIT(hello),
NULL,
PHP_RINIT(hello),
PHP_RSHUTDOWN(hello),
PHP_MINFO(hello),
#if ZEND_MODULE_API_NO >= 20010901
PHP_HELLO_WORLD_VERSION,
#endif
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_HELLO
ZEND_GET_MODULE(hello)
#endif
#define PHP_SOCKETS_API
#if HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
typedef int PHP_SOCKET;
typedef struct {
PHP_SOCKET bsd_socket;
int type;
int error;
} php_socket;
#define le_socket_name "Socket"
//static int le_socket = 0;
static void php_destroy_socket(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
php_socket *php_sock = (php_socket *) rsrc->ptr;
close(php_sock->bsd_socket);
efree(php_sock);
}
PHP_MINIT_FUNCTION(hello)
{
le_socket = zend_fetch_list_dtor_id("Socket");
//le_socket = zend_register_list_destructors_ex(, NULL, le_socket_name,
module_number);
}
ZEND_BEGIN_MODULE_GLOBALS(hello)
int last_error;
char *strerror_buf;
ZEND_END_MODULE_GLOBALS(hello)
PHP_FUNCTION(hello_world)
{
zend_printf("%d--\n", le_socket);
zval *buf;
char *recv_buf;
int retval, len;
long test;
// long len, flags, php_sock_res;
// if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lzll",
&php_sock_res, &buf, &len, &flags) == FAILURE)
// return;
test = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &buf,
&test) == FAILURE)
return;
if(test != NULL)
zend_printf("%ld", test);
len = 300;
recv_buf = emalloc(len + 1);
memset(recv_buf, '\0', len + 1);
// retval = recvz(recv_buf);
char new_set[] = "=D!!";
retval = strlen(new_set);
memcpy(recv_buf, new_set, retval);
recv_buf[retval] = '\0';
zval_dtor(buf);
Z_STRVAL_P(buf) = recv_buf;
Z_STRLEN_P(buf) = retval;
Z_TYPE_P(buf) = IS_STRING;
zend_printf("(((((----------- %d -------------))))))))))", le_socket);
RETURN_LONG(retval);
}
PHP_FUNCTION(socketi_accept)
{
zend_printf("[init]");
zval *sock, *remote_addr, *port;
php_socket *php_sock, *new_sock;
struct sockaddr_in sa;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|zz", &sock,
&remote_addr, &port) == FAILURE)
return;
ZEND_FETCH_RESOURCE(php_sock, php_socket *, &sock, -1, le_socket_name,
le_socket);
int salen, addr_len;
salen = sizeof(struct sockaddr_in);
new_sock->bsd_socket = accept(php_sock->bsd_socket, &sa, &salen);
switch(ZEND_NUM_ARGS())
{
case 3:
{
Z_TYPE_P(port) = IS_LONG;
Z_LVAL_P(port) = ntohs(sa.sin_port);
}
case 2:
{
char *buf;
addr_len = strlen(inet_ntoa(sa.sin_addr));
buf = (char *) emalloc(addr_len + 1);
zend_printf("[1]");
memcpy(buf, inet_ntoa(sa.sin_addr), addr_len);
zend_printf("[2]");
buf[addr_len] = '\0';
zval_dtor(remote_addr);
zend_printf("[3]");
Z_STRVAL_P(remote_addr) = buf;
Z_STRLEN_P(remote_addr) = addr_len;
Z_TYPE_P(remote_addr) = IS_STRING;
efree(buf);
}
default: //don't ask me how
case 1:
zend_printf("[4]");
new_sock->error = 0;
zend_printf("[5]");
}
ZEND_REGISTER_RESOURCE(return_value, new_sock, le_socket);
zend_printf("RET!");
}
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php