Closed Bug 285166 Opened 21 years ago Closed 21 years ago

createElement crashes [@ NS_NewHTMLElement] [@ nsCharTraits<unsigned short>::length]

Categories

(Core :: DOM: Core & HTML, defect)

x86
Windows 2000
defect
Not set
critical

Tracking

()

RESOLVED FIXED
mozilla1.8beta2

People

(Reporter: mcsmurf, Assigned: peterv)

References

()

Details

(Keywords: crash, testcase)

Crash Data

Attachments

(2 files)

To reproduce: 1. Load the testcase from URL (it requires some XML file, so i uploaded it there). 2. Click on Mail 3. Observe crash Stacktrace: nsCharTraits<unsigned short>::length(const unsigned short * 0x00000000) line 310 NS_NewHTMLElement(nsIContent * * 0x0012ee0c, nsINodeInfo * 0x00000000) line 992 + 14 bytes NS_NewElement(nsIContent * * 0x0012ee0c, int 0x00000003, nsINodeInfo * 0x05c9b0e0) line 244 + 11 bytes nsDocument::CreateElement(nsDocument * const 0x00000000, nsINodeInfo * 0x05c9b0e0, int 0x00000003, nsIContent * * 0x0012eefc) line 4421 + 21 bytes nsDocument::CreateElem(nsDocument * const 0x00000000, nsIAtom * 0x0792a5e0, nsIAtom * 0x00000000, int 0x00000000, int 0x00000001, nsIContent * * 0x05c9b0e0) line 4412 + 12 bytes nsHTMLDocument::CreateElement(nsHTMLDocument * const 0x00000000, const nsAString & {...}, nsIDOMElement * * 0x0012ef44) line 1277 XPTC_InvokeByIndex(nsISupports * 0x06e61088, unsigned int 0x0000001f, unsigned int 0x00000002, nsXPTCVariant * 0x0012ef34) line 102 XPCWrappedNative::CallMethod(XPCCallContext & {...}, XPCWrappedNative::CallMode 0x9254d260) line 2067 + 22 bytes XPC_WN_CallMethod(JSContext * 0x02e718a8, JSObject * 0x0254d260, unsigned int 0x00000001, long * 0x01a40560, long * 0x01a40410) line 1287 + 10 bytes js_Invoke(JSContext * 0x00000001, unsigned int 0x00000001, unsigned int 0x00000000) line 1293 + 17 bytes js_Interpret(JSContext * 0x02e718a8, unsigned char * 0x027b32d8, long * 0x0012f3a8) line 3568 js_Execute(JSContext * 0x00f868b8, JSObject * 0x02e4d488, JSScript * 0x06da0f08, JSStackFrame * 0x00000000, unsigned int 0x00000000, long * 0x0012f460) line 1524 JS_EvaluateUCScriptForPrincipals(JSContext * 0x02e718a8, JSObject * 0x02e4d488, JSPrincipals * 0x03e1c294, const unsigned short * 0x0012f4c0, unsigned int 0x0000000a, const char * 0x0012f558, unsigned int 0x00000001, long * 0x0012f460) line 3739 + 15 bytes nsJSContext::EvaluateString(nsJSContext * const 0x00000000, const nsAString & {...}, void * 0x02e4d488, nsIPrincipal * 0xffffffff, const char * 0x0012f558, unsigned int 0x00000001, const char * 0x00000000, nsAString * 0x0012f5f0, int * 0x0012f600) line 1035 + 69 bytes nsJSThunk::EvaluateScript(nsJSThunk * const 0x00000000, nsIChannel * 0x03e1c290) line 255 + 82 bytes Note if you comment in the line //if(xIn.childNodes[i].nodeType != 1) continue; it doesn't crash.
With that testcase I get: ###!!! ASSERTION: Don't pass invalid names to nsDocument::CreateElem, check caller.: 'NS_SUCCEEDED(rv)', file /home/bzbarsky/mozilla/xlib/mozilla/content/base/src/nsDocument.cpp, line 4398 ###!!! ASSERTION: What? Reverse mapping of id to string broken!!!: 'tag', file /home/bzbarsky/mozilla/xlib/mozilla/content/html/document/src/nsHTMLContentSink.cpp, line 990 then crash when we pass null (per second assert) to do_GetAtom. So what happens here is that createElement() gets passed "#text" as the nodename. In quirks mode we don't do a qname check, then we assert in nsDocument::CreateElem (which does a check via the parser service, not via nsContentUtils::CheckQName; why, I don't know; the two do the same thing). Then we take this string, map it to a HTML tag using nsHTMLTags::LookupTag() (called by HTMLAtomTagToId), which returns eHTMLTag_text. Mapping that back to a tag atom returns null, however. Things are worse with __moz_text -- that one is valid as a tagname _and_ will get mapped to eHTMLTag_text. So we either need to fix HTMLAtomTagToId to never return eHTMLTag_text (and audito all callers), or we need to fix the content sink caller (NS_NewHTMLElement) to handle this situation... Note also that the standards version -- HTMLCaseSensitiveAtomTagToId -- is likely broken too (for the __moz_text thing, at least). Peter, this (well, the code we start out in) looks like code you touched most recently, no?
I do think we want to fix this one way or another for Gecko 1.8.
Flags: blocking1.8b2?
Keywords: testcase
I'll take this.
Assignee: general → peterv
Target Milestone: --- → mozilla1.8beta2
One thing we should do while we're at it is to make texts and comments have Tag() atoms that aren't valid element-names. I'm pretty sure this is causing bugs if you were to create an <__moz_text> element.
Attached patch Quick fixSplinter Review
Here's a quick fix for this bug. I started on a better fix, but I keep finding more and more silly stuff so it's starting to grow and I'd rather put it in a separate bug.
Attachment #177539 - Flags: superreview?(bzbarsky)
Attachment #177539 - Flags: review?(bugmail)
Comment on attachment 177539 [details] [diff] [review] Quick fix sr=bzbarsky, but yeah, let's get that followup filed.
Attachment #177539 - Flags: superreview?(bzbarsky) → superreview+
Hmm, I just realized that both instances of |id >= nsHTMLTag(NS_HTML_TAG_MAX)| should be |id > NS_HTML_TAG_MAX|
(In reply to comment #7) > (From update of attachment 177539 [details] [diff] [review] [edit]) > sr=bzbarsky, but yeah, let's get that followup filed. Bug 286300 filed.
Checked in. The assertion is annoying, but it'll be hard to remove it just for this case (createElement in quirks mode).
Status: NEW → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
Flags: blocking1.8b2?
*** Bug 304533 has been marked as a duplicate of this bug. ***
content/html/document/crashtests/285166-1.html http://hg.mozilla.org/mozilla-central/rev/b0337b6287f3
Flags: in-testsuite+
Crash Signature: [@ NS_NewHTMLElement] [@ nsCharTraits<unsigned short>::length]
Component: DOM → DOM: Core & HTML
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: