From 5a22740af10ccac82ed49b4acfa2d6a55dd4a19c Mon Sep 17 00:00:00 2001 From: "harishd%netscape.com" Date: Fri, 18 Apr 2003 20:58:44 +0000 Subject: [PATCH] Prevent a potential stack overflow if a wsdl file imports itself. b=202478, r=nisheeth@netscape.com sr=jst@netscape.com git-svn-id: svn://10.0.0.236/trunk@141412 18797224-902f-48f8-a5cc-f745e15eee43 --- .../webservices/public/nsIWSDLLoader.idl | 3 ++- .../webservices/wsdl/src/nsWSDLLoader.cpp | 17 +++++++++++++++++ .../webservices/wsdl/src/nsWSDLLoader.h | 5 +++-- .../xmlextras/wsdl/public/nsIWSDLLoader.idl | 3 ++- .../xmlextras/wsdl/src/nsWSDLLoader.cpp | 17 +++++++++++++++++ .../xmlextras/wsdl/src/nsWSDLLoader.h | 5 +++-- 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/mozilla/extensions/webservices/public/nsIWSDLLoader.idl b/mozilla/extensions/webservices/public/nsIWSDLLoader.idl index 2971b26fde8..158f686ed2e 100644 --- a/mozilla/extensions/webservices/public/nsIWSDLLoader.idl +++ b/mozilla/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/mozilla/extensions/webservices/wsdl/src/nsWSDLLoader.cpp b/mozilla/extensions/webservices/wsdl/src/nsWSDLLoader.cpp index 1d5a67b16c5..60328649db9 100644 --- a/mozilla/extensions/webservices/wsdl/src/nsWSDLLoader.cpp +++ b/mozilla/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/mozilla/extensions/webservices/wsdl/src/nsWSDLLoader.h b/mozilla/extensions/webservices/wsdl/src/nsWSDLLoader.h index d61b2580c9a..00961e5d8df 100644 --- a/mozilla/extensions/webservices/wsdl/src/nsWSDLLoader.h +++ b/mozilla/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/mozilla/extensions/xmlextras/wsdl/public/nsIWSDLLoader.idl b/mozilla/extensions/xmlextras/wsdl/public/nsIWSDLLoader.idl index 2971b26fde8..158f686ed2e 100644 --- a/mozilla/extensions/xmlextras/wsdl/public/nsIWSDLLoader.idl +++ b/mozilla/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/mozilla/extensions/xmlextras/wsdl/src/nsWSDLLoader.cpp b/mozilla/extensions/xmlextras/wsdl/src/nsWSDLLoader.cpp index 1d5a67b16c5..60328649db9 100644 --- a/mozilla/extensions/xmlextras/wsdl/src/nsWSDLLoader.cpp +++ b/mozilla/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/mozilla/extensions/xmlextras/wsdl/src/nsWSDLLoader.h b/mozilla/extensions/xmlextras/wsdl/src/nsWSDLLoader.h index d61b2580c9a..00961e5d8df 100644 --- a/mozilla/extensions/xmlextras/wsdl/src/nsWSDLLoader.h +++ b/mozilla/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;