Closed Bug 180217 Opened 22 years ago Closed 22 years ago

nsXULDocument::~nsXULDocument will crash if mDocumentURL is null

Categories

(Core :: XUL, defect)

x86
Windows 2000
defect
Not set
critical

Tracking

()

RESOLVED FIXED

People

(Reporter: timeless, Assigned: timeless)

References

Details

(Keywords: crash)

Attachments

(1 file)

nsXULPrototypeCache::nsIURIKey::HashCode() line 135 + 21 bytes
nsHashtable::Remove(nsHashKey * 0x0012e1e8) line 322 + 11 bytes
nsSupportsHashtable::Remove(nsHashKey * 0x0012e1e8, nsISupports * * 0x00000000)
line 984 + 12 bytes
nsXULPrototypeCache::RemoveFromFastLoadSet(nsXULPrototypeCache * const
0x016df390, nsIURI * 0x00000000) line 631
nsXULDocument::~nsXULDocument() line 533
nsXULDocument::`scalar deleting destructor'() + 15 bytes
nsXULDocument::Release(nsXULDocument * const 0x01d4c3f0) line 575 + 186 bytes
XPCWrappedNative::~XPCWrappedNative() line 547 + 18 bytes
XPCWrappedNative::`scalar deleting destructor'(unsigned int 1) + 15 bytes
XPCWrappedNative::Release(XPCWrappedNative * const 0x01d4d6a0) line 777 + 147 bytes
XPCWrappedNative::FlatJSObjectFinalized(JSContext * 0x004f4e70, JSObject *
0x0141f310) line 897
XPC_WN_NoHelper_Finalize(JSContext * 0x004f4e70, JSObject * 0x0141f310) line 630
js_FinalizeObject(JSContext * 0x004f4e70, JSObject * 0x0141f310) line 1840 + 96
bytes
js_GC(JSContext * 0x004f4e70, unsigned int 5) line 1311 + 11 bytes

-	mDocumentURL	{...}
\+	mRawPtr	0x00000000

There is a real way this could happen in addition to the way i forced it to
happen, the real way is:
(you're really low on memory)
you call NS_NewXULDocument for the first time
    nsXULDocument* doc = new nsXULDocument();
succeeds
    if (NS_FAILED(rv = doc->Init())) {
Init fails.
        NS_RELEASE(doc);
Crash.

There are probably other ways this can fail. but I felt brendan would appreciate
a legitimate sequence.
Attachment #106276 - Flags: superreview?(brendan)
Attachment #106276 - Flags: review?(ben)
Severity: normal → critical
Keywords: crash
timeless, what was the fake (not 'legitimate') way that you made the crash happen?

/be
Comment on attachment 106276 [details] [diff] [review]
check mDocumentURL for null before trying to remove it from the hash

sr=brendan@mozilla.org

/be
Attachment #106276 - Flags: superreview?(brendan) → superreview+
const C=Components.classes, I=Components.interfaces;

and one of the following:

var o; for (a in C) if (!/dom|box/i.test(a)) try {o=C[a].getService(); for (i in
I) o instanceof I[i];} catch (e) {}

var o; for (a in C) if (!/dom|box/i.test(a)) try {o=C[a].createInstance(); for
(i in I) o instanceof I[i];} catch (e) {}

I don't remember which variation i was using at the time (and it doesn't
matter). it's also possible i didn't have the dom|box exclusion (which is
designed to save me from hundreds of asserts).  I didn't want to have a
discussion about the legitimacy of my method. There's almost always a real way
for the crashes that I've triggered to happen.
Status: NEW → ASSIGNED
Timeless: cool, keep it up.  We should regression test such loops regularly. 
Cc'ing pschwartau.

/be
I think we really need to initialize mDocumentURL to null in the constructor as
well.
Comment on attachment 106276 [details] [diff] [review]
check mDocumentURL for null before trying to remove it from the hash

r=dbradley

Ugh, I was looking at nsDocument and not nsXULDocument
Attachment #106276 - Flags: review?(ben) → review+
checked in
Status: ASSIGNED → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
I am still crashing in the current xpcshell on the loops in Comment #4.
Should we re-open this bug? Or are those tests too 'artificial'? 


WINNT STACK TRACE
nsGenericFactory::GetHelperForLanguage(nsGenericFactory * const 0x02cb67f4, 
unsigned int 2, nsISupports * * 0x0012d868) line 110 + 6 bytes
XPCWrappedNative::GatherProtoScriptableCreateInfo(nsIClassInfo * 0x02cb67f4, 
XPCNativeScriptableCreateInfo * 0x0012d9e4) line 565 + 38 bytes
XPCWrappedNative::GatherScriptableCreateInfo(nsISupports * 0x02cb67f0, 
nsIClassInfo * 0x02cb67f4, XPCNativeScriptableCreateInfo * 0x0012d9e4, 
XPCNativeScriptableCreateInfo * 0x0012d9d8) line 597 + 13 bytes
XPCWrappedNative::GetNewOrUsed(XPCCallContext & {...}, nsISupports * 0x02cb67f0, 
XPCWrappedNativeScope * 0x00a6d4b0, XPCNativeInterface * 0x00a4c1f0, 
XPCWrappedNative * * 0x0012da1c) line 281 + 61 bytes
XPCConvert::NativeInterface2JSObject(XPCCallContext & {...}, 
nsIXPConnectJSObjectHolder * * 0x0012db68, nsISupports * 0x02cb67f0, const nsID 
* 0x0012db8c, JSObject * 0x0104d950, unsigned int * 0x0012dadc) line 1059 + 30 
bytes
nsXPConnect::WrapNative(nsXPConnect * const 0x00a49630, JSContext * 0x00a5a860, 
JSObject * 0x0104d950, nsISupports * 0x02cb67f0, const nsID & {...}, 
nsIXPConnectJSObjectHolder * * 0x0012db68) line 565 + 29 bytes
nsJSCID::GetService(nsJSCID * const 0x02cb6a90, nsISupports * * 0x0012dd4c) line 
886 + 57 bytes
XPTC_InvokeByIndex(nsISupports * 0x02cb6a90, unsigned int 11, unsigned int 1, 
nsXPTCVariant * 0x0012dd4c) line 106
XPCWrappedNative::CallMethod(XPCCallContext & {...}, XPCWrappedNative::CallMode 
CALL_METHOD) line 2016 + 42 bytes
XPC_WN_CallMethod(JSContext * 0x00a5a860, JSObject * 0x0104d950, unsigned int 0, 
long * 0x00c30e28, long * 0x0012e028) line 1283 + 14 bytes
js_Invoke(JSContext * 0x00a5a860, unsigned int 0, unsigned int 0) line 839 + 23 
bytes
js_Interpret(JSContext * 0x00a5a860, long * 0x0012fe50) line 2803 + 15 bytes
js_Execute(JSContext * 0x00a5a860, JSObject * 0x00c864c0, JSScript * 0x00a74b20, 
JSStackFrame * 0x00000000, unsigned int 0, long * 0x0012fe50) line 1020 + 13 
bytes
JS_ExecuteScript(JSContext * 0x00a5a860, JSObject * 0x00c864c0, JSScript * 
0x00a74b20, long * 0x0012fe50) line 3277 + 25 bytes
Process(JSContext * 0x00a5a860, JSObject * 0x00c864c0, char * 0x00000000, _iobuf 
* 0x1025a828 __iob) line 517 + 22 bytes
ProcessArgs(JSContext * 0x00a5a860, JSObject * 0x00c864c0, char * * 0x00a14524, 
int 0) line 655 + 33 bytes
main(int 0, char * * 0x00a14524) line 912 + 21 bytes
mainCRTStartup() line 338 + 17 bytes
KERNEL32! 77f1b9ea()


Function at crashpoint:

NS_IMETHODIMP nsGenericFactory::GetHelperForLanguage(PRUint32 language,
                                                     nsISupports **helper)
{
    if (mInfo->mGetLanguageHelperProc)  <<<--------------------- CRASHED HERE
        return mInfo->mGetLanguageHelperProc(language, helper);
    *helper = nsnull;
    return NS_OK;
}


At crashpoint, |mInfo| = 0x00000000
Blocks: 181491
Blocks: 181494
Blocks: 181496
Blocks: 181498
Blocks: 181500
Blocks: 181503
Blocks: 181505
Blocks: 181507
Blocks: 181509
Blocks: 181512
No longer blocks: 181512
No longer blocks: 181509
No longer blocks: 181507
No longer blocks: 181505
No longer blocks: 181500
No longer blocks: 181498
No longer blocks: 181496
No longer blocks: 181494
No longer blocks: 181503
Component: XP Toolkit/Widgets: XUL → XUL
QA Contact: shrir → xptoolkit.widgets
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: