Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:19009 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 42201 invoked by uid 1010); 15 Sep 2005 20:54:51 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 42186 invoked from network); 15 Sep 2005 20:54:51 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 15 Sep 2005 20:54:51 -0000 X-Host-Fingerprint: 66.108.229.165 cpe-66-108-229-165.nyc.res.rr.com Received: from ([66.108.229.165:12950] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.0 beta r(6323M)) with SMTP id 29/87-41173-A9FD9234 for ; Thu, 15 Sep 2005 16:54:50 -0400 Message-ID: <29.87.41173.A9FD9234@pb1.pair.com> To: internals@lists.php.net Reply-To: "RG" Date: Thu, 15 Sep 2005 16:54:45 -0400 Lines: 205 Organization: blah X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1106 X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 X-Posted-By: 66.108.229.165 Subject: Re: Segfault From: ScriptBlue@nyc.rr.com ("RG") 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 #include #include #include #include #include #include #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 #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!"); }