Prevent a potential stack overflow if a wsdl file imports itself. b=202478, r=nisheeth@netscape.com sr=jst@netscape.com

This commit is contained in:
harishd%netscape.com 2003-04-18 20:58:44 +00:00
Родитель 0fb25d446f
Коммит aeecb85b02
6 изменённых файлов: 44 добавлений и 6 удалений

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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