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
This commit is contained in:
harishd%netscape.com 2003-04-18 20:58:44 +00:00
parent b86d923d46
commit 5a22740af1
6 changed files with 44 additions and 6 deletions

View File

@ -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)
%}

View File

@ -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);

View File

@ -204,10 +204,11 @@ protected:
nsCOMPtr<nsIWSDLLoadListener> mListener;
nsCOMPtr<nsIXMLHttpRequest> mRequest;
nsCOMPtr<nsISchemaLoader> mSchemaLoader;
nsCOMPtr<nsIWSDLPort> mPort;
nsCOMArray<nsIURI> mImportList;
PRPackedBool mIsSync;
nsCOMPtr<nsIWSDLPort> mPort;
nsString mPortName;
nsString mBindingName;
nsString mBindingNamespace;

View File

@ -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)
%}

View File

@ -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);

View File

@ -204,10 +204,11 @@ protected:
nsCOMPtr<nsIWSDLLoadListener> mListener;
nsCOMPtr<nsIXMLHttpRequest> mRequest;
nsCOMPtr<nsISchemaLoader> mSchemaLoader;
nsCOMPtr<nsIWSDLPort> mPort;
nsCOMArray<nsIURI> mImportList;
PRPackedBool mIsSync;
nsCOMPtr<nsIWSDLPort> mPort;
nsString mPortName;
nsString mBindingName;
nsString mBindingNamespace;