Kasimier Buchcik fixed the memory access and allocation problem Daniel

* xmlschemas.c: Kasimier Buchcik fixed the memory access and
  allocation problem
Daniel
diff --git a/xmlschemas.c b/xmlschemas.c
index 7f1b519..1cd9159 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -771,18 +771,7 @@
 	    xmlFree(link);
 	    link = next;
 	} while (link != NULL);
-    }
-  
-    if ((type->subtypes != NULL) && (type->type != XML_SCHEMA_TYPE_SEQUENCE)) {
-	switch (type->subtypes->type) { 
-	    case XML_SCHEMA_TYPE_SIMPLE_CONTENT:
-	    case XML_SCHEMA_TYPE_COMPLEX_CONTENT:
-	    case XML_SCHEMA_TYPE_RESTRICTION:
-	    case XML_SCHEMA_TYPE_EXTENSION:
-	    case XML_SCHEMA_TYPE_UNION:
-		xmlSchemaFreeType(type->subtypes);
-	}
-    }
+    }      
     xmlFree(type);
 }
 
@@ -3335,9 +3324,10 @@
 
 
     snprintf((char *) name, 30, "union %d", ctxt->counter++ + 1);
-    type = xmlSchemaNewUnion(ctxt, name);
+    type = xmlSchemaAddType(ctxt, schema, name, NULL);
     if (type == NULL)
         return (NULL);
+    type->type = XML_SCHEMA_TYPE_UNION;
     type->node = node;
     type->id = xmlSchemaGetProp(ctxt, node, "id");
     type->base = xmlSchemaGetProp(ctxt, node, "memberTypes");
@@ -3791,6 +3781,8 @@
 		      schemaLocation, NULL);
 
 	xmlSchemaFreeParserCtxt(newctxt);
+	if (import->schemaLocation != NULL)
+	    xmlFree((xmlChar *)import->schemaLocation);
 	xmlFree(import);
 	return NULL;
     }
@@ -4461,9 +4453,10 @@
     oldcontainer = ctxt->container;
 
     snprintf((char *) name, 30, "restriction %d", ctxt->counter++ + 1);
-    type = xmlSchemaNewRestriction(ctxt, name);
+    type = xmlSchemaAddType(ctxt, schema, name, NULL);
     if (type == NULL)
         return (NULL);
+    type->type = XML_SCHEMA_TYPE_RESTRICTION;
     type->node = node;
     type->id = xmlSchemaGetProp(ctxt, node, "id");
     type->base = xmlGetQNameProp(ctxt, node, "base", &(type->baseNs));
@@ -4614,9 +4607,10 @@
     oldcontainer = ctxt->container;
 
     snprintf((char *) name, 30, "extension %d", ctxt->counter++ + 1);
-    type = xmlSchemaNewExtension(ctxt, name);
+    type = xmlSchemaAddType(ctxt, schema, name, NULL);    
     if (type == NULL)
         return (NULL);
+    type->type = XML_SCHEMA_TYPE_EXTENSION;
     type->node = node;
     type->id = xmlSchemaGetProp(ctxt, node, "id");
     ctxt->container = name;
@@ -4682,9 +4676,10 @@
         return (NULL);
 
     snprintf((char *) name, 30, "simpleContent %d", ctxt->counter++ + 1);
-    type = xmlSchemaNewSimpleContent(ctxt, name);
+    type = xmlSchemaAddType(ctxt, schema, name, NULL);    
     if (type == NULL)
         return (NULL);
+    type->type = XML_SCHEMA_TYPE_SIMPLE_CONTENT;
     type->node = node;
     type->id = xmlSchemaGetProp(ctxt, node, "id");
 
@@ -4737,9 +4732,10 @@
         return (NULL);
 
     snprintf((char *) name, 30, "complexContent %d", ctxt->counter++ + 1);
-    type = xmlSchemaNewComplexContent(ctxt, name);   
+    type = xmlSchemaAddType(ctxt, schema, name, NULL);
     if (type == NULL)
         return (NULL);
+    type->type = XML_SCHEMA_TYPE_COMPLEX_CONTENT;
     type->node = node;    
     type->id = xmlSchemaGetProp(ctxt, node, "id");
 
@@ -8052,6 +8048,20 @@
 
     if (typeDecl == NULL)
         return;
+    /*
+    * Do not allow the following types to be typefixed, prior to
+    * the corresponding simple/complex types.
+    */
+    if (ctxt->ctxtType == NULL) {
+	switch (typeDecl->type) {
+	    case XML_SCHEMA_TYPE_SIMPLE_CONTENT:
+	    case XML_SCHEMA_TYPE_COMPLEX_CONTENT:
+	    case XML_SCHEMA_TYPE_UNION:
+	    case XML_SCHEMA_TYPE_RESTRICTION:
+	    case XML_SCHEMA_TYPE_EXTENSION:	    
+		return;
+	}
+    }
     if (name == NULL)
         name = typeDecl->name;
     if (typeDecl->contentType == XML_SCHEMA_CONTENT_UNKNOWN) {
@@ -8254,6 +8264,8 @@
                     break;
                 }
             case XML_SCHEMA_TYPE_COMPLEX:{
+		    ctxtType = ctxt->ctxtType;
+		    ctxt->ctxtType = typeDecl;
 		    if ((typeDecl->subtypes == NULL) || 
 			((typeDecl->subtypes->type != 
 			XML_SCHEMA_TYPE_SIMPLE_CONTENT) && 
@@ -8277,12 +8289,9 @@
                     } else {
 			if ((typeDecl->subtypes != NULL) &&
 			    (typeDecl->subtypes->contentType ==
-			    XML_SCHEMA_CONTENT_UNKNOWN)) {
-			    ctxtType = ctxt->ctxtType;
-			    ctxt->ctxtType = typeDecl;
+			    XML_SCHEMA_CONTENT_UNKNOWN)) {			    
 			    xmlSchemaTypeFixup(typeDecl->subtypes, ctxt,
-				NULL);
-			    ctxt->ctxtType = ctxtType;
+				NULL);			    
 			}
                         if (typeDecl->flags & XML_SCHEMAS_TYPE_MIXED) {
                             typeDecl->contentType =
@@ -8295,6 +8304,7 @@
                         }			
                     }
 		    xmlSchemaBuildAttributeValidation(ctxt, typeDecl);
+		    ctxt->ctxtType = ctxtType;
                     break;
                 }
             case XML_SCHEMA_TYPE_COMPLEX_CONTENT:{
@@ -8330,13 +8340,12 @@
 		* Simple Type Definition Schema Component
 		*
 		*/
+		ctxtType = ctxt->ctxtType;		
 		typeDecl->contentType = XML_SCHEMA_CONTENT_SIMPLE;
 		if (typeDecl->subtypes->contentType == 
 		    XML_SCHEMA_CONTENT_UNKNOWN) {
-		    ctxtType = ctxt->ctxtType;
 		    ctxt->ctxtType = typeDecl;
 		    xmlSchemaTypeFixup(typeDecl->subtypes, ctxt, NULL);
-		    ctxt->ctxtType = ctxtType;
 		}
 		/* Fixup base type */		
 		if ((typeDecl->baseType != NULL) && 
@@ -8345,10 +8354,8 @@
 		    /* OPTIMIZE: Actually this one will never by hit, since
 		    * the base type is already type-fixed in <restriction>.
 		    */
-		    ctxtType = ctxt->ctxtType;
 		    ctxt->ctxtType = typeDecl;
 		    xmlSchemaTypeFixup(typeDecl->baseType, ctxt, NULL);
-		    ctxt->ctxtType = ctxtType;
 		}
 		/* Base type: 
 		* 2 If the <list> or <union> alternative is chosen, 
@@ -8450,6 +8457,7 @@
 		* Check constraints.
 		*/
 		xmlSchemaCheckSRCSimpleType(ctxt, typeDecl);
+		ctxt->ctxtType = ctxtType;
 		break;
             case XML_SCHEMA_TYPE_SEQUENCE:
             case XML_SCHEMA_TYPE_GROUP:
@@ -8965,6 +8973,8 @@
     /*
      * Then fixup all types properties
      */
+    ctxt->ctxtType = NULL;
+    ctxt->parentItem = NULL;
     xmlHashScan(ret->typeDecl, (xmlHashScanner) xmlSchemaTypeFixup, ctxt);
 
     /*