Closed Bug 256981 Opened 21 years ago Closed 14 years ago

Crash FMR: Free memory read in nsHTMLDocument::GetPixelDimensions(nsIPresShell *,int *,int *) {1 occurrence}

Categories

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

x86
Windows XP
defect
Not set
critical

Tracking

()

RESOLVED WORKSFORME

People

(Reporter: timeless, Unassigned)

Details

(Keywords: crash)

Attachments

(1 file)

confirmed by mcsmurf on: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.8a3) Gecko/20040824 and by me using 2004081808 talkbackid: 657276 steps: 1. run mfcembed (under purify or normal) 2. load chrome://inspector/content 3. tools>web dev>js debugger 4. click venkman's stop button [I] Starting Purify'd R:\mozilla\rel-i586-pc-msvc.1\dist\bin\mfcembed.exe at 08/26/2004 03:06:31 [I] Starting main [W] UMC: Uninitialized memory copy in memcpy {6 occurrences} [W] UMC: Uninitialized memory copy in memcpy {3 occurrences} [W] UMC: Uninitialized memory copy in memcpy {2 occurrences} [I] Starting thread 0xe350: midMessage [W] UMR: Uninitialized memory read in nsScriptNameSpaceManager::RegisterDOMCIData(char const*,(*)(char const*),nsID const*,nsID const* *,UINT,int,nsID const*) {1 occurrence} [W] UMR: Uninitialized memory read in nsScanner::AppendToBuffer (Buffer::nsScannerBufferList *) {2 occurrences} [E] FMR: Free memory read in nsHTMLDocument::GetPixelDimensions (nsIPresShell *,int *,int *) {1 occurrence} Reading 4 bytes from 0x0ddeadf8 (4 bytes at 0x0ddeadf8 illegal) Address 0x0ddeadf8 is at the beginning of a 744 byte block Address 0x0ddeadf8 points to a C++ new block in heap 0x003d0000 Thread ID: 0xc284 Error location nsHTMLDocument::GetPixelDimensions(nsIPresShell *,int *,int *)+0xee [r:\mozilla\content\html\document\src\nshtmldocument.cpp:2498 ip=0x049b0f13] *aWidth = *aHeight = 0; FlushPendingNotifications(Flush_Layout); // Find the <body> element: this is what we'll want to use for the // document's width and height values. if (!mBodyContent && !GetBodyContent()) { return NS_OK; } nsCOMPtr<nsIContent> body = do_QueryInterface(mBodyContent); // Now grab its frame nsIFrame* frame; => nsresult rv = aShell->GetPrimaryFrameFor(body, &frame); if (NS_SUCCEEDED(rv) && frame) { nsSize size; nsIView* view = frame->GetView(); // If we have a view check if it's scrollable. If not, // just use the view size itself if (view) { nsIScrollableView* scrollableView = nsnull; CallQueryInterface(view, &scrollableView); if (scrollableView) { scrollableView->GetScrolledView(view); } nsHTMLDocument::GetHeight(int *)+0xba [r:\mozilla\content\html\document\src\nshtmldocument.cpp:2573 ip=0x049b1353] XPTC_InvokeByIndex+0x6e [r:\mozilla\xpcom\reflect\xptcall\src\md\win32 \xptcinvoke.cpp:101 ip=0x02559327] XPCWrappedNative::CallMethod(XPCCallContext&,CallMode::XPCWrappedNative) +0x122f [r:\mozilla\js\src\xpconnect\src\xpcwrappednative.cpp:2030 ip=0x03d1c6cc] XPC_WN_GetterSetter(JSContext *,JSObject *,UINT,long *,long *)+0x27c [r:\mozilla\js\src\xpconnect\src\xpcwrappednativejsops.cpp:1319 ip=0x03d22c82] js_Invoke+0xef0 [r:\mozilla\js\src\jsinterp.c:1280 ip=0x03e66757] Allocation location new(UINT)+0xc [f:\vs70builds\9466\vc\crtbld\crt\src\newop.cpp:10 ip=0x04bc821e] nsViewManager::new(UINT)+0x1c [r:\mozilla\view\src\nsviewmanager.h:96 ip=0x0499f5f2] NS_NewPresShell(nsIPresShell * *)+0x39 [r:\mozilla\layout\html\base\src\nspresshell.cpp:1602 ip=0x0470dc82] nsDocument::doCreateShell(nsPresContext *,nsIViewManager *,nsStyleSet *,nsCompatibility,nsIPresShell * *)+0x89 [r:\mozilla\content\base\src\nsdocument.cpp:1294 ip=0x048949e5] nsHTMLDocument::CreateShell(nsPresContext *,nsIViewManager *,nsStyleSet *,nsIPresShell * *)+0x3a [r:\mozilla\content\html\document\src\nshtmldocument.cpp:414 ip=0x0499f886] DocumentViewerImpl::InitPresentationStuff(int)+0x12a [r:\mozilla\content\base\src\nsdocumentviewer.cpp:636 ip=0x04888fc4] DocumentViewerImpl::InitInternal(nsIWidget *,nsIDeviceContext *,nsRect const&,int,int)+0x657 [r:\mozilla\content\base\src\nsdocumentviewer.cpp:857 ip=0x04889f82] DocumentViewerImpl::Init(nsIWidget *,nsIDeviceContext *,nsRect const&) +0x2b [r:\mozilla\content\base\src\nsdocumentviewer.cpp:623 ip=0x0488b4b1] nsDocShell::SetupNewViewer(nsIContentViewer *)+0xd81 [r:\mozilla\docshell\base\nsdocshell.cpp:4874 ip=0x054513b9] Free location memset+0x1d [f:\vs70builds\9466\vc\crtbld\crt\src\newaop.cpp ip=0x04bc82e8] PresShell::`vector deleting destructor'(UINT)+0x43 [R:\mozilla\rel-i586- pc-msvc.1\dist\bin\components\gklayout.dll ip=0x04711f89] PresShell::Release(void)+0x52 [r:\mozilla\layout\html\base\src\nspresshell.cpp:1636 ip=0x046fb9f1] nsCOMPtr_base::~nsCOMPtr_base(void)+0x31 [r:\mozilla\xpcom\glue\nscomptr.cpp:81 ip=0x02570c62] nsDocument::FlushPendingNotifications(mozFlushType)+0x398 [r:\mozilla\content\base\src\nsdocument.cpp:4070 ip=0x0489b7e9] doc->FlushPendingNotifications(aType); } } } PRInt32 i, count = mPresShells.Count(); for (i = 0; i < count; i++) { nsCOMPtr<nsIPresShell> shell = NS_STATIC_CAST(nsIPresShell*, mPresShells[i]); if (shell) { shell->FlushPendingNotifications(aType); } => } } nsHTMLDocument::FlushPendingNotifications(mozFlushType)+0x270 [r:\mozilla\content\html\document\src\nshtmldocument.cpp:1260 ip=0x049a68b3] } ++i; } } if (isSafeToFlush && mParser) { nsCOMPtr<nsIContentSink> sink = mParser->GetContentSink(); if (sink) { PRBool notify = ((aType & Flush_SinkNotifications) != 0); sink->FlushContent(notify); } } } => nsDocument::FlushPendingNotifications(aType); } nsHTMLDocument::GetPixelDimensions(nsIPresShell *,int *,int *) +0x6b [r:\mozilla\content\html\document\src\nshtmldocument.cpp:2486 ip=0x049b0e90] nsresult nsHTMLDocument::GetPixelDimensions(nsIPresShell* aShell, PRInt32* aWidth, PRInt32* aHeight) { *aWidth = *aHeight = 0; => FlushPendingNotifications(Flush_Layout); // Find the <body> element: this is what we'll want to use for the // document's width and height values. if (!mBodyContent && !GetBodyContent()) { return NS_OK; } nsCOMPtr<nsIContent> body = do_QueryInterface (mBodyContent); // Now grab its frame nsIFrame* frame; nsresult rv = aShell->GetPrimaryFrameFor(body, &frame); if (NS_SUCCEEDED(rv) && frame) { nsSize size; nsHTMLDocument::GetHeight(int *)+0xba [r:\mozilla\content\html\document\src\nshtmldocument.cpp:2573 ip=0x049b1353] XPTC_InvokeByIndex+0x6e [r:\mozilla\xpcom\reflect\xptcall\src\md\win32\xptcinvoke.cpp:101 ip=0x02559327] XPCWrappedNative::CallMethod (XPCCallContext&,CallMode::XPCWrappedNative)+0x122f [r:\mozilla\js\src\xpconnect\src\xpcwrappednative.cpp:2030 ip=0x03d1c6cc] XPC_WN_GetterSetter(JSContext *,JSObject *,UINT,long *,long *) +0x27c [r:\mozilla\js\src\xpconnect\src\xpcwrappednativejsops.cpp:1319 ip=0x03d22c82] js_Invoke+0xef0 [r:\mozilla\js\src\jsinterp.c:1280 ip=0x03e66757] [E] IPR: Invalid pointer read in nsHTMLDocument::GetPixelDimensions (nsIPresShell *,int *,int *) {1 occurrence} [E] EXU: Unhandled exception in nsHTMLDocument::GetPixelDimensions (nsIPresShell *,int *,int *) {1 occurrence} [I] Summary of all memory in use... {13277587 bytes, 217277 blocks} [I] Summary of all memory leaks... {2049923 bytes, 55808 blocks} [W] PAR: GetClassInfoExA(0x13e204) WNDCLASSEX structure size too small... {1 occurrence} [I] Exiting with code -1073741819 (0xc0000005) [I] Program terminated at 08/26/2004 03:34:06
Severity: normal → critical
Component: DOM: HTML → DOM: Core & HTML
QA Contact: ian → general
Looks like GetPixelDimensions was renamed to GetBodySize. It's now safe because it uses body->GetPrimaryFrame() which returns NULL if the frame was deleted by the Flush_Layout http://mxr.mozilla.org/mozilla-central/source/content/html/document/src/nsHTMLDocument.cpp#2339 -> WORKSFORME
Status: NEW → RESOLVED
Closed: 14 years ago
Resolution: --- → WORKSFORME
Attached file Testcase
This would probably crash Firefox 2.x or older. http://mxr.mozilla.org/mozilla1.8/source/content/html/document/src/nsHTMLDocument.cpp#2638 the problem is that even though the code holds a strong ref on the shell, it's not safe to call GetPrimaryFrameFor() on it after it was Destroy()'ed. In 1.9.1 and 1.9.2 the shell is acquired after the Flush and early return if null.
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: