You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by na...@apache.org on 2008/06/12 12:24:43 UTC

svn commit: r667032 - /webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c

Author: nandika
Date: Thu Jun 12 03:24:43 2008
New Revision: 667032

URL: http://svn.apache.org/viewvc?rev=667032&view=rev
Log:
constant that can result in buffer overflow removed

Modified:
    webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c

Modified: webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c?rev=667032&r1=667031&r2=667032&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c (original)
+++ webservices/axis2/trunk/c/axiom/src/parser/libxml2/libxml2_reader_wrapper.c Thu Jun 12 03:24:43 2008
@@ -24,7 +24,6 @@
 #include <string.h>
 #include <axutil_string.h>
 
-#define AXIS2_ATTR_NS_MAX   20
 
 int AXIS2_CALL axis2_libxml2_reader_wrapper_next(
     axiom_xml_reader_t * parser,
@@ -151,10 +150,10 @@
     int event_map[18];
 
     void *ctx;
-    /* assuming that max ns and attri will be 20 */
+    /* assuming that max ns and attribute will be 20 */
 
-    int namespace_map[AXIS2_ATTR_NS_MAX];
-    int attribute_map[AXIS2_ATTR_NS_MAX];
+    int *namespace_map;
+    int *attribute_map;
 
     AXIS2_READ_INPUT_CALLBACK read_input_callback;
 
@@ -242,21 +241,45 @@
 }
 
 AXIS2_EXTERN axis2_status_t AXIS2_CALL
-axiom_xml_reader_init(
-    )
+axiom_xml_reader_init()
 {
     xmlInitParser();
     return AXIS2_SUCCESS;
 }
 
 AXIS2_EXTERN axis2_status_t AXIS2_CALL
-axiom_xml_reader_cleanup(
-    )
+axiom_xml_reader_cleanup()
 {
     xmlCleanupParser();
     return AXIS2_SUCCESS;
 }
 
+static axis2_libxml2_reader_wrapper_impl_t*
+libxml2_reader_wrapper_create(const axutil_env_t *env)
+{
+	axis2_libxml2_reader_wrapper_impl_t *wrapper_impl = NULL;
+	wrapper_impl = (axis2_libxml2_reader_wrapper_impl_t *)AXIS2_MALLOC(env->allocator,
+		sizeof(axis2_libxml2_reader_wrapper_impl_t));
+
+	if (!wrapper_impl)
+	{
+		AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
+		AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "No memory. Cannot create libxml2 reader wrapper");
+		return NULL;
+	}
+	memset(wrapper_impl, 0, sizeof(axis2_libxml2_reader_wrapper_impl_t));
+	wrapper_impl->attribute_map = NULL;
+	wrapper_impl->namespace_map = NULL;
+	wrapper_impl->close_input_callback = NULL;
+	wrapper_impl->read_input_callback = NULL;
+	wrapper_impl->ctx = NULL;
+	wrapper_impl->current_namespace_count = 0;
+	wrapper_impl->current_attribute_count = 0;
+	wrapper_impl->current_event = -1;
+	return wrapper_impl;
+}
+
+
 AXIS2_EXTERN axiom_xml_reader_t *AXIS2_CALL
 axiom_xml_reader_create_for_file(
     const axutil_env_t * env,
@@ -268,20 +291,13 @@
     AXIS2_ENV_CHECK(env, NULL);
     AXIS2_PARAM_CHECK(env->error, filename, NULL);
 
-    wrapper_impl =
-        (axis2_libxml2_reader_wrapper_impl_t *) AXIS2_MALLOC(env->allocator,
-                                                             sizeof
-                                                             (axis2_libxml2_reader_wrapper_impl_t));
+    wrapper_impl = libxml2_reader_wrapper_create(env);
     if (!wrapper_impl)
     {
-        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
-        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-                          "No memory. Cannot create libxml2 reader wrapper");
         return NULL;
     }
 
-    wrapper_impl->reader =
-        xmlReaderForFile(filename, encoding, XML_PARSE_RECOVER);
+    wrapper_impl->reader = xmlReaderForFile(filename, encoding, XML_PARSE_RECOVER);
     if (!(wrapper_impl->reader))
     {
         AXIS2_FREE(env->allocator, wrapper_impl);
@@ -296,7 +312,6 @@
                                  (void *) env);
     wrapper_impl->current_event = -1;
     wrapper_impl->ctx = NULL;
-
     axis2_libxml2_reader_wrapper_init_map(wrapper_impl);
 
     wrapper_impl->parser.ops = &axiom_xml_reader_ops_var;
@@ -320,15 +335,9 @@
         return NULL;
     }
 
-    wrapper_impl =
-        (axis2_libxml2_reader_wrapper_impl_t *) AXIS2_MALLOC(env->allocator,
-                                                             sizeof
-                                                             (axis2_libxml2_reader_wrapper_impl_t));
+    wrapper_impl = libxml2_reader_wrapper_create(env);
     if (!wrapper_impl)
     {
-        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
-        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-                          "No memory. Cannot create libxml2 reader wrapper");
         return NULL;
     }
     wrapper_impl->close_input_callback = NULL;
@@ -381,18 +390,11 @@
 {
     axis2_libxml2_reader_wrapper_impl_t *wrapper_impl = NULL;
 
-    AXIS2_ENV_CHECK(env, NULL);
     AXIS2_PARAM_CHECK(env->error, container, NULL);
 
-    wrapper_impl =
-        (axis2_libxml2_reader_wrapper_impl_t *) AXIS2_MALLOC(env->allocator,
-                                                             sizeof
-                                                             (axis2_libxml2_reader_wrapper_impl_t));
+    wrapper_impl = libxml2_reader_wrapper_create(env);
     if (!wrapper_impl)
     {
-        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
-        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
-                          "No memory. Cannot create libxml2 reader wrapper");
         return NULL;
     }
     wrapper_impl->close_input_callback = NULL;
@@ -503,18 +505,28 @@
     axiom_xml_reader_t * parser,
     const axutil_env_t * env)
 {
-    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
-    if (AXIS2_INTF_TO_IMPL(parser)->ctx)
-    {
-        AXIS2_FREE(env->allocator, AXIS2_INTF_TO_IMPL(parser)->ctx);
-    }
-
-    if (AXIS2_INTF_TO_IMPL(parser)->reader)
-    {
-        xmlTextReaderClose(AXIS2_INTF_TO_IMPL(parser)->reader);
-        xmlFreeTextReader(AXIS2_INTF_TO_IMPL(parser)->reader);
-    }
-
+	axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
+	parser_impl = AXIS2_INTF_TO_IMPL(parser);
+    if (parser_impl->ctx)
+    {
+        AXIS2_FREE(env->allocator, parser_impl->ctx);
+    }
+
+    if (parser_impl->reader)
+    {
+        xmlTextReaderClose(parser_impl->reader);
+        xmlFreeTextReader(parser_impl->reader);
+    }
+	if(parser_impl->namespace_map)
+	{
+		AXIS2_FREE(env->allocator,parser_impl->namespace_map);
+		parser_impl->namespace_map = NULL;
+	}
+	if(parser_impl->attribute_map)
+	{
+		AXIS2_FREE(env->allocator, parser_impl->attribute_map);
+		parser_impl->attribute_map = NULL;
+	}
     AXIS2_FREE(env->allocator, AXIS2_INTF_TO_IMPL(parser));
     return;
 }
@@ -868,17 +880,35 @@
     int i = 0;
     char *q_name = NULL;
     axis2_libxml2_reader_wrapper_impl_t *parser_impl = NULL;
-
+	int map_size = 0;
     AXIS2_ENV_CHECK(env, AXIS2_FAILURE);
     parser_impl = AXIS2_INTF_TO_IMPL(parser);
 
     libxml2_attribute_count = xmlTextReaderAttributeCount(parser_impl->reader);
     if (libxml2_attribute_count == 0)
     {
+		parser_impl->current_attribute_count = 0;
+		parser_impl->current_namespace_count = 0;
         return AXIS2_SUCCESS;
     }
-
-    for (i = 0; i < AXIS2_ATTR_NS_MAX; i++)
+	map_size = libxml2_attribute_count +1;
+	if(parser_impl->namespace_map)
+	{
+		AXIS2_FREE(env->allocator, parser_impl->namespace_map);
+		parser_impl->namespace_map = NULL;
+	}
+	if(parser_impl->attribute_map)
+	{
+		AXIS2_FREE(env->allocator, parser_impl->attribute_map);
+		parser_impl->attribute_map = NULL;
+	}	
+	parser_impl->attribute_map = AXIS2_MALLOC(env->allocator, sizeof(int)* map_size);
+	memset(parser_impl->attribute_map, 0, map_size*sizeof(int));
+
+	parser_impl->namespace_map = AXIS2_MALLOC(env->allocator, sizeof(int)*map_size);
+	memset(parser_impl->namespace_map,0, map_size*sizeof(int));
+	
+    for (i = 0; i < map_size ; i++)
     {
         parser_impl->namespace_map[i] = -1;
         parser_impl->attribute_map[i] = -1;