memory leak and segfault related fixes.
The simple soap client/server code examples now run without leaking or
segfaulting.
dnl $Id$
dnl config.m4 for extension soap
-dnl Comments in this file start with the string 'dnl'.
-dnl Remove where necessary. This file will not work
-dnl without editing.
-
PHP_ARG_ENABLE(soap, whether to enable soap support,
-Make sure that the comment is aligned:
[ --enable-soap[=DIR] Enable soap support. DIR is libxml2
library directory.])
if(call_user_function(EG(function_table), NULL, type.map->map_functions.to_zval, ret, 1, ¶m TSRMLS_CC) == FAILURE)
php_error(E_ERROR, "Error calling to_zval");
zval_ptr_dtor(¶m);
+ efree(param);
}
return ret;
}
xmlNodePtr to_xml_string(encodeType type, zval *data, int style)
{
xmlNodePtr ret;
- char *str;
+ char *str, *pstr;
int new_len;
ret = xmlNewNode(NULL, "BOGUS");
convert_to_string(data);
str = php_escape_html_entities(Z_STRVAL_P(data), Z_STRLEN_P(data), &new_len, 0, 0, NULL);
- xmlNodeSetContentLen(ret, str, new_len);
+
+ pstr = malloc(new_len + 1);
+ memcpy(pstr, str, new_len);
+ pstr[new_len] = '\0';
+ efree(str);
+
+ xmlNodeSetContentLen(ret, pstr, new_len);
if(style == SOAP_ENCODED)
set_ns_and_type(ret, type);
SOAP_STREAM stream;
zval **trace;
-/* TSRMLS_FETCH();*/
-
FETCH_THIS_SOCKET(stream);
FETCH_THIS_URL(phpurl);
FETCH_THIS_SDL(sdl);
phpurl = php_url_parse(url);
-#ifdef PHP_STREAMS
- stream = php_stream_sock_open_host(phpurl->host, (unsigned short)(phpurl->port == 0 ? 80 : phpurl->port), SOCK_STREAM, 0, 0);
+ if (phpurl->port == 0) {
+ if (strcmp(phpurl->scheme, "http") == 0)
+ phpurl->port = 80;
+ else if (strcmp(phpurl->scheme, "https") == 0)
+ phpurl->port = 443;
+ }
+
+#ifdef PHP_HAVE_STREAMS
+ stream = php_stream_sock_open_host(phpurl->host, (unsigned short)phpurl->port, SOCK_STREAM, NULL, NULL);
#else
- stream = get_socket(phpurl->host, (phpurl->port == 0 ? 80 : phpurl->port), 10);
+ stream = get_socket(phpurl->host, phpurl->port, 10);
#endif
if(stream)
{
ret = zend_list_insert(phpurl, le_url);
add_property_resource(this_ptr, "httpurl", ret);
zend_list_addref(ret);
- }
- else
+ } else {
php_error(E_ERROR,"Could not connect to host");
- /*
- php_url_free(phpurl);
- */
+ }
}
if(stream)
soap_headers = emalloc(size + strlen(soapaction));
sprintf(soap_headers, header, phpurl->path, phpurl->host, buf_size, soapaction);
}
-
-#ifdef PHP_STREAMS
+
+#ifdef PHP_HAVE_STREAMS
err = php_stream_write(stream, soap_headers, strlen(soap_headers));
#else
err = send(stream, soap_headers, strlen(soap_headers), 0);
smart_str_appendl(&cookie_str, "\r\n", 2);
smart_str_0(&cookie_str);
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
err = php_stream_write(stream, cookie_str.c, cookie_str.len);
#else
err = send(stream, cookie_str.c, cookie_str.len,0);
smart_str_free(&cookie_str);
}
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
err = php_stream_write(stream, "\r\n", 2);
#else
err = send(stream, "\r\n", 2, 0);
php_error(E_ERROR,"Failed Sending HTTP Headers");
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
err = php_stream_write(stream, buf, buf_size);
#else
err = send(stream, buf, buf_size, 0);
SOAP_STREAM stream;
zval **trace;
-/* TSRMLS_FETCH();*/
-
FETCH_THIS_SDL(sdl);
if(FIND_SOCKET_PROPERTY(this_ptr, socket_ref) != FAILURE)
if(http_close)
{
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
php_stream_close(stream);
#else
SOCK_CLOSE(stream);
while(!done)
{
for (cur = 0; cur < 3 || !(chunk_size[cur - 2] == '\r' && chunk_size[cur - 1] == '\n'); cur++)
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
chunk_size[cur] = php_stream_getc(stream);
#else
chunk_size[cur] = php_sock_fgetc(stream);
len_size = 0;
while(http_buf_size < buf_size)
{
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
len_size += php_stream_read(stream, &http_buf[http_buf_size], buf_size - len_size);
#else
len_size += php_sock_fread(&http_buf[http_buf_size], buf_size - len_size, stream);
#endif
http_buf_size += len_size;
}
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
php_stream_getc(stream);php_stream_getc(stream);
#else
/* Eat up '\r' '\n' */
http_buf = emalloc(size + 1);
while(http_buf_size < size)
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
http_buf_size += php_stream_read(stream, &http_buf[http_buf_size], size - http_buf_size);
#else
http_buf_size += php_sock_fread(&http_buf[http_buf_size], size - http_buf_size, stream);
int done;
char chr;
smart_str tmp_response = {0};
-/* TSRMLS_FETCH();//i think this is not needed - even the parameter */
done = FALSE;
while(!done)
{
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
chr = php_stream_getc(stream);
#else
chr = php_sock_fgetc(stream);
smart_str_0(&tmp_response);
done = TRUE;
}
- }
- else
+ } else {
return FALSE;
+ }
}
(*response) = tmp_response.c;
(*out_size) = tmp_response.len;
return TRUE;
}
-#ifndef PHP_STREAMS
+#ifndef PHP_HAVE_STREAMS
SOCKET get_socket(char* host,int portno,int time)
{
SOCKET socketd = -1;
int get_http_body(SOAP_STREAM socketd, char *headers, char **response, int *out_size TSRMLS_DC);
int get_http_headers(SOAP_STREAM socketd,char **response, int *out_size TSRMLS_DC);
-#ifndef PHP_STREAMS
+#ifndef PHP_HAVE_STREAMS
#ifndef ZEND_WIN32
# ifndef closesocket
# define closesocket close
xmlDocPtr response;
xmlNodePtr trav, trav2, env, body, resp, cur, fault;
zval **tmp_ret;
-/* TSRMLS_FETCH();*/
response = xmlParseMemory(buffer, buffer_size);
xmlCleanupParser();
smart_str_appendc(&array_type_and_size, ':');
smart_str_appends(&array_type_and_size, value);
smart_str_0(&array_type_and_size);
+
+ smart_str_free(prefix);
+ efree(prefix);
}
}
else
{
sdlBindingPtr *binding;
+ if (sdl == NULL) {
+ return NULL;
+ }
+
for(zend_hash_internal_pointer_reset(sdl->bindings);
zend_hash_get_current_data(sdl->bindings, (void **) &binding) == SUCCESS;
zend_hash_move_forward(sdl->bindings))
xmlCleanupParser();
if(!wsdl)
- php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Could't load");
+ php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Couldn't load from %s", struri);
tmpsdl->doc = wsdl;
root = wsdl->children;
definitions = get_node(root, "definitions");
if(!definitions)
- php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Could't find definitions");
+ php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Couldn't find definitions in %s", struri);
targetNamespace = get_attribute(definitions->properties, "targetNamespace");
if(targetNamespace)
parse_namespace(bindingAttr->children->content, &ctype, &ns);
binding = get_node_with_attribute(definitions->children, "binding", "name", ctype);
- if(ns) efree(ns); if(ctype) efree(ctype);
if(!binding)
- php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: No binding");
+ php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: No binding element with name \"%s\"", ctype);
+
+ if(ns) efree(ns); if(ctype) efree(ctype);
if(tmpbinding->bindingType == BINDING_SOAP)
{
# include "ext/domxml/php_domxml.h"
#endif
-/*
- PHP_STREAMS were introduced php-4.2.0.. i think
- Make this part of configure
-*/
-#ifdef STREAMS_DC
-# define PHP_STREAMS
-#endif
-
#ifdef PHP_WIN32
-# ifdef PHP_STREAMS
+# ifdef PHP_HAVE_STREAMS
# define SOAP_STREAM php_stream *
# else
# define SOAP_STREAM SOCKET
# endif
#else
-# ifdef PHP_STREAMS
+# ifdef PHP_HAVE_STREAMS
# define SOAP_STREAM php_stream *
# else
# define SOCKET unsigned int
#define ENDFOREACH(n) \
} \
- } while(n = n->next);
+ } while ((n = n->next));
#define ZERO_PARAM() \
if(ZEND_NUM_ARGS() != 0) \
fn_name = estrndup(Z_STRVAL(function_name),Z_STRLEN(function_name));
response_name = emalloc(Z_STRLEN(function_name) + strlen("Response") + 1);
- sprintf(response_name,"%sResponse\0",fn_name);
+ sprintf(response_name,"%sResponse",fn_name);
if(service->type == SOAP_CLASS)
{
if(size == 0)
php_error(E_ERROR, "Dump memory failed");
- sprintf(cont_len, "Content-Length: %d\0", size);
+ sprintf(cont_len, "Content-Length: %d", size);
sapi_add_header("Content-Type: text/xml", sizeof("Content-Type: text/xml"), 1);
sapi_add_header(cont_len, strlen(cont_len) + 1, 1);
xmlDocDumpMemoryEnc(doc_return, &buf, &size, XML_CHAR_ENCODING_UTF8);
*/
xmlDocDumpMemory(doc_return, &buf, &size);
- sprintf(cont_len,"Content-Length: %d\0", size);
+ sprintf(cont_len,"Content-Length: %d", size);
sapi_add_header(cont_len, strlen(cont_len) + 1, 1);
sapi_add_header("Content-Type: text/xml", sizeof("Content-Type: text/xml"), 1);
char *message, *function;
int message_len, function_len;
int num_params;
- zval **ret_params;
+ zval **ret_params = NULL;
sdlPtr sdl;
sdlFunctionPtr fn;
- if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &message, &message_len, &function, &function_len) == FAILURE)
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &message, &message_len, &function, &function_len) == FAILURE) {
php_error(E_ERROR, "Invalid arguments to SoapObject->__parse");
+ }
FETCH_THIS_SDL(sdl);
- if(sdl != NULL)
- {
+ if (sdl != NULL) {
sdlBindingPtr binding;
FETCH_THIS_PORT(binding);
fn = get_function(binding, function);
- if(fn != NULL)
+
+ if (fn != NULL) {
parse_packet_soap(getThis(), message, message_len, fn, NULL, &ret_params, &num_params TSRMLS_CC);
+ }
+ } else {
+ parse_packet_soap(getThis(), message, message_len, NULL, function, &ret_params, &num_params TSRMLS_CC);
}
- else
- parse_packet_soap(getThis(), message, message_len, NULL, function, &ret_params, &num_params TSRMLS_CC);
- if(num_params > 0)
- {
+ if (num_params > 0) {
*return_value = *ret_params[0];
- zval_add_ref(&return_value);
+ /* zval_add_ref(&return_value); */
+ } else {
+ ZVAL_NULL(return_value);
+ }
+
+ if (ret_params) {
efree(ret_params);
}
- else
- ZVAL_NULL(return_value)
}
PHP_FUNCTION(__call)
zval **param;
xmlDocPtr request = NULL;
int num_params, arg_count;
- zval **ret_params;
+ zval **ret_params = NULL;
char *buffer;
int len;
parse_packet_soap(getThis(), buffer, len, NULL, function, &ret_params, &num_params TSRMLS_CC);
efree(buffer);
- if(num_params > 0)
- {
+ if(num_params > 0) {
*return_value = *ret_params[0];
- zval_add_ref(&return_value);
+ /* zval_add_ref(&return_value); */
+ } else {
+ ZVAL_NULL(return_value);
+ }
+
+ if (ret_params) {
efree(ret_params);
}
- else
- ZVAL_NULL(return_value)
}
PHP_FUNCTION(__isfault)
clear_soap_fault(thisObj);
- if(sdl != NULL)
- {
+ if (sdl != NULL) {
sdlBindingPtr binding;
FETCH_THIS_PORT(binding);
if(fn != NULL)
{
int num_params;
- zval **ret_params;
+ zval **ret_params = NULL;
char *buffer;
char *ns;
int len;
parse_packet_soap(getThis(), buffer, len, fn, NULL, &ret_params, &num_params TSRMLS_CC);
efree(buffer);
- if(num_params > 0)
- {
+ if(num_params > 0) {
*return_value = *ret_params[0];
- zval_add_ref(&return_value);
+ /* zval_add_ref(&return_value); */
+ } else {
+ ZVAL_NULL(return_value);
+ }
+
+ if (ret_params) {
efree(ret_params);
}
- else
- ZVAL_NULL(return_value);
}
else
{
else
{
int num_params;
- zval **ret_params;
+ zval **ret_params = NULL;
zval **uri;
smart_str *action;
char *buffer;
send_http_soap_request(getThis(), request, function, action->c TSRMLS_CC);
smart_str_free(action);
+ efree(action);
xmlFreeDoc(request);
get_http_soap_response(getThis(), &buffer, &len TSRMLS_CC);
parse_packet_soap(getThis(), buffer, len, NULL, function, &ret_params, &num_params TSRMLS_CC);
efree(buffer);
- if(num_params > 0)
- {
+ if(num_params > 0) {
*return_value = *ret_params[0];
- zval_add_ref(&return_value);
+ /* zval_add_ref(&return_value); */
+ } else {
+ ZVAL_NULL(return_value);
+ }
+
+ if (ret_params) {
+ FREE_ZVAL(ret_params[0]);
efree(ret_params);
}
- else
- ZVAL_NULL(return_value);
}
efree(arguments);
}
{
xmlNodePtr trav,trav2,trav3,trav4,env,body;
int cur_param = 0,num_of_params = 0;
-/* TSRMLS_FETCH();*/
trav = request->children;
FOREACHNODE(trav,"Envelope",env)
trav3 = body->children;
do
{
- /* TODO: make 'strict' (use th sdl defnintions) */
+ /* TODO: make 'strict' (use the sdl defnintions) */
if(trav3->type == XML_ELEMENT_NODE)
{
zval tmp_function_name, **tmp_parameters;
if(trav4->type == XML_ELEMENT_NODE)
num_of_params++;
- }while(trav4 = trav4->next);
+ } while ((trav4 = trav4->next));
}
else
num_of_params = zend_hash_num_elements(function->requestParameters);
cur_param++;
}
- }while(trav4 = trav4->next);
+ } while ((trav4 = trav4->next));
}
(*parameters) = tmp_parameters;
(*num_params) = num_of_params;
break;
}
- }while(trav3 = trav3->next);
+ } while ((trav3 = trav3->next));
}
ENDFOREACH(trav2);
xmlNode *envelope,*body,*method, *param;
xmlNs *ns;
sdlParamPtr parameter = NULL;
- smart_str *gen_ns;
+ smart_str *gen_ns = NULL;
encode_reset_ns();
xmlAddChild(method,param);
}
+ if (gen_ns) {
+ smart_str_free(gen_ns);
+ efree(gen_ns);
+ }
+
return doc;
}
}
}
smart_str_free(gen_ns);
+ efree(gen_ns);
return doc;
}
void delete_http_socket(void *handle)
{
SOAP_STREAM stream = (SOAP_STREAM)handle;
-#ifdef PHP_STREAMS
+#ifdef PHP_HAVE_STREAMS
TSRMLS_FETCH();
php_stream_close(stream);
#else