diff --git a/extensions/webservices/public/nsIWSDLLoader.idl b/extensions/webservices/public/nsIWSDLLoader.idl index 2971b26fde8d..158f686ed2eb 100644 --- a/extensions/webservices/public/nsIWSDLLoader.idl +++ b/extensions/webservices/public/nsIWSDLLoader.idl @@ -61,5 +61,6 @@ interface nsIWSDLLoadListener : nsISupports #define NS_ERROR_WSDL_UNKNOWN_SCHEMA_COMPONENT NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 4) #define NS_ERROR_WSDL_UNKNOWN_WSDL_COMPONENT NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 5) #define NS_ERROR_WSDL_LOADING_ERROR NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 6) -#define NS_ERROR_WSDL_NOT_ENABLED NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 7) +#define NS_ERROR_WSDL_RECURSIVE_IMPORT NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 7) +#define NS_ERROR_WSDL_NOT_ENABLED NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 8) %} diff --git a/extensions/webservices/wsdl/src/nsWSDLLoader.cpp b/extensions/webservices/wsdl/src/nsWSDLLoader.cpp index 1d5a67b16c52..60328649db9a 100644 --- a/extensions/webservices/wsdl/src/nsWSDLLoader.cpp +++ b/extensions/webservices/wsdl/src/nsWSDLLoader.cpp @@ -834,6 +834,23 @@ nsWSDLLoadRequest::ProcessImportElement(nsIDOMElement* aElement, return rv; } + // Fix ( bug 202478 ) a potential stack overflow by + // preventing the wsdl file from loading if it was + // already loaded via the import element. + PRUint32 count = mImportList.Count(); + PRUint32 i; + for (i = 0; i < count; i++) { + PRBool equal; + mImportList[i]->Equals(uri, &equal); + if (equal) { + // Looks like this uri has already been loaded. + // Loading it again will end up in an infinite loop. + return NS_ERROR_WSDL_RECURSIVE_IMPORT; + } + } + + mImportList.AppendObject(uri); + nsCAutoString spec; uri->GetSpec(spec); diff --git a/extensions/webservices/wsdl/src/nsWSDLLoader.h b/extensions/webservices/wsdl/src/nsWSDLLoader.h index d61b2580c9aa..00961e5d8df6 100644 --- a/extensions/webservices/wsdl/src/nsWSDLLoader.h +++ b/extensions/webservices/wsdl/src/nsWSDLLoader.h @@ -204,10 +204,11 @@ protected: nsCOMPtr mListener; nsCOMPtr mRequest; nsCOMPtr mSchemaLoader; - + nsCOMPtr mPort; + nsCOMArray mImportList; + PRPackedBool mIsSync; - nsCOMPtr mPort; nsString mPortName; nsString mBindingName; nsString mBindingNamespace; diff --git a/extensions/xmlextras/wsdl/public/nsIWSDLLoader.idl b/extensions/xmlextras/wsdl/public/nsIWSDLLoader.idl index 2971b26fde8d..158f686ed2eb 100644 --- a/extensions/xmlextras/wsdl/public/nsIWSDLLoader.idl +++ b/extensions/xmlextras/wsdl/public/nsIWSDLLoader.idl @@ -61,5 +61,6 @@ interface nsIWSDLLoadListener : nsISupports #define NS_ERROR_WSDL_UNKNOWN_SCHEMA_COMPONENT NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 4) #define NS_ERROR_WSDL_UNKNOWN_WSDL_COMPONENT NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 5) #define NS_ERROR_WSDL_LOADING_ERROR NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 6) -#define NS_ERROR_WSDL_NOT_ENABLED NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 7) +#define NS_ERROR_WSDL_RECURSIVE_IMPORT NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 7) +#define NS_ERROR_WSDL_NOT_ENABLED NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GENERAL, 8) %} diff --git a/extensions/xmlextras/wsdl/src/nsWSDLLoader.cpp b/extensions/xmlextras/wsdl/src/nsWSDLLoader.cpp index 1d5a67b16c52..60328649db9a 100644 --- a/extensions/xmlextras/wsdl/src/nsWSDLLoader.cpp +++ b/extensions/xmlextras/wsdl/src/nsWSDLLoader.cpp @@ -834,6 +834,23 @@ nsWSDLLoadRequest::ProcessImportElement(nsIDOMElement* aElement, return rv; } + // Fix ( bug 202478 ) a potential stack overflow by + // preventing the wsdl file from loading if it was + // already loaded via the import element. + PRUint32 count = mImportList.Count(); + PRUint32 i; + for (i = 0; i < count; i++) { + PRBool equal; + mImportList[i]->Equals(uri, &equal); + if (equal) { + // Looks like this uri has already been loaded. + // Loading it again will end up in an infinite loop. + return NS_ERROR_WSDL_RECURSIVE_IMPORT; + } + } + + mImportList.AppendObject(uri); + nsCAutoString spec; uri->GetSpec(spec); diff --git a/extensions/xmlextras/wsdl/src/nsWSDLLoader.h b/extensions/xmlextras/wsdl/src/nsWSDLLoader.h index d61b2580c9aa..00961e5d8df6 100644 --- a/extensions/xmlextras/wsdl/src/nsWSDLLoader.h +++ b/extensions/xmlextras/wsdl/src/nsWSDLLoader.h @@ -204,10 +204,11 @@ protected: nsCOMPtr mListener; nsCOMPtr mRequest; nsCOMPtr mSchemaLoader; - + nsCOMPtr mPort; + nsCOMArray mImportList; + PRPackedBool mIsSync; - nsCOMPtr mPort; nsString mPortName; nsString mBindingName; nsString mBindingNamespace;