Closed
Bug 126104
Opened 22 years ago
Closed 22 years ago
Memory leak of 3 bytes from 1 block allocated in nsHttpResponseHead::ParseStatusLine
Categories
(Core :: Networking: HTTP, defect, P1)
Tracking
()
VERIFIED
FIXED
mozilla0.9.9
People
(Reporter: stephend, Assigned: badami)
Details
(Keywords: memory-leak)
Attachments
(1 file)
832 bytes,
patch
|
gagan
:
review+
darin.moz
:
superreview+
|
Details | Diff | Splinter Review |
Build ID: Windows 2000 latest trunk as of 6:30 pm today. Summary: Memory leak of 3 bytes from 1 block allocated in nsHttpResponseHead::ParseStatusLine Steps to Reproduce: Just start up Mozilla with http://home.netscape.com as your start page. [W] MLK: Memory leak of 3 bytes from 1 block allocated in PL_strdup Distribution of leaked blocks Allocation location malloc [MSVCRT.DLL] PL_strdup [strdup.c:46] nsHttpResponseHead::ParseStatusLine(char *) [nsHttpResponseHead.cpp:161] if ((mVersion == NS_HTTP_VERSION_0_9) || !(line = PL_strchr (line, ' '))) { mStatus = 200; => mStatusText = nsCRT::strdup("OK"); } else { // Status-Code ??? [ip=0x08e53719] nsHttpTransaction::ParseLine(char *) [nsHttpTransaction.cpp:354] LOG(("nsHttpTransaction::ParseLine [%s]\n", line)); if (!mHaveStatusLine) { => mResponseHead->ParseStatusLine(line); mHaveStatusLine = PR_TRUE; // XXX this should probably never happen if (mResponseHead->Version() == NS_HTTP_VERSION_0_9) ??? [ip=0x08b14a8c] nsHttpTransaction::ParseLineSegment(char *,UINT) [nsHttpTransaction.cpp:379] else { // trim off the new line char and parse the line mLineBuf.Truncate(mLineBuf.Length() - 1); => ParseLine(NS_CONST_CAST(char*,mLineBuf.get())); // stuff the segment into the line buf mLineBuf.Assign(segment, len); } nsHttpTransaction::ParseHead(char *,UINT,UINT *) [nsHttpTransaction.cpp:452] len--; buf[len-1] = '\n'; => ParseLineSegment(buf, len); if (mHaveAllHeaders) return NS_OK; nsHttpTransaction::Read(char *,UINT,UINT *) [nsHttpTransaction.cpp:865] if (!mHaveAllHeaders) { PRUint32 bytesConsumed = 0; => rv = ParseHead(buf, count, &bytesConsumed); if (NS_FAILED(rv)) return rv; count -= bytesConsumed; nsReadFromInputStream [nsPipe2.cpp:845] PRUint32 offset, PRUint32 count, PRUint32 *readCount) => { nsIInputStream* fromStream = (nsIInputStream*)closure; return fromStream->Read(toRawSegment, count, readCount); } nsPipe::nsPipeOutputStream::WriteSegments((*)(nsIOutputStream *,void *,char *,UINT,UINT,UINT *),void *,UINT,UINT *) [nsPipe2.cpp:721] while (writeBufLen > 0) { PRUint32 readCount = 0; mon.Exit(); // XXX avoid deadlock better => rv = reader(this, closure, writeBuf, *writeCount, writeBufLen, &readCount); mon.Enter(); if (rv == NS_BASE_STREAM_WOULD_BLOCK) { NS_ASSERTION(readCount <= writeBufLen, "reader returned bad readCount"); nsPipe::nsPipeOutputStream::WriteFrom(nsIInputStream *,UINT,UINT *) [nsPipe2.cpp:854] nsPipe::nsPipeOutputStream::WriteFrom(nsIInputStream* fromStream, PRUint32 count, PRUint32 *writeCount) => { return WriteSegments(nsReadFromInputStream, fromStream, count, writeCount); } nsStreamListenerProxy::OnDataAvailable(nsIRequest *,nsISupports *,nsIInputStream *,UINT,UINT) [nsStreamListenerProxy.cpp:303] // that the pipe was emptied during this time, we retry copying data // into the pipe. // => rv = mPipeOut->WriteFrom(source, count, &bytesWritten); LOG(("nsStreamListenerProxy: Wrote data to pipe [rv=%x count=%u bytesWritten=%u req=%x]\n", rv, count, bytesWritten, request)); nsHttpTransaction::OnDataReadable(nsIInputStream *) [nsHttpTransaction.cpp:241] // let our listener try to read up to NS_HTTP_BUFFER_SIZE from us. rv = mListener->OnDataAvailable(this, nsnull, this, => mContentRead, NS_HTTP_BUFFER_SIZE); LOG(("nsHttpTransaction: listener returned [rv=%x]\n", rv)); nsHttpConnection::OnDataAvailable(nsIRequest *,nsISupports *,nsIInputStream *,UINT,UINT) [nsHttpConnection.cpp:697] nsHttpHandler::get()->ProcessTransactionQ(); } => nsresult rv = mTransaction->OnDataReadable(inputStream); LOG(("mTransaction->OnDataReadable() returned [rv=%x]\n", rv)); return rv; nsSocketReadRequest::OnRead(void) [nsSocketTransport.cpp:2871] mContext, mInputStream, offset, => amount); LOG(("nsSocketReadRequest: listener returned [rv=%x]\n", rv)); nsSocketTransport::doReadWrite(short) [nsSocketTransport.cpp:1077] // we must not call out to our listener with the monitor held. mReadRequest // can only be cleared on this thread, so releasing the monitor should be safe. PR_ExitMonitor(mMonitor); => readStatus = mReadRequest->OnRead(); PR_EnterMonitor(mMonitor); if (mReadRequest->IsSuspended()) { mSelectFlags &= ~PR_POLL_READ; nsSocketTransport::Process(short) [nsSocketTransport.cpp:541] LOG(("nsSocketTransport: Transport [host=%s:%d this=%x] " "is in WaitReadWrite state [readtype=%x writetype=%x status=%x].\n", mHostName, mPort, this, GetReadType(), GetWriteType(), mStatus)); => mStatus = doReadWrite(aSelectFlags); break; case eSocketState_Timeout:
Reporter | ||
Comment 1•22 years ago
|
||
This looks small, but I see this repeatedly all over the Purify logs and sometimes it happens with greater byte counts. (20 bytes occasionally).
Assignee | ||
Comment 3•22 years ago
|
||
Call Reset from destructor of nsHttpResponseHead. Have not been able to test patch under purify.
Assignee | ||
Updated•22 years ago
|
Severity: normal → critical
Priority: -- → P1
Target Milestone: --- → mozilla1.0
Assignee | ||
Updated•22 years ago
|
Comment 4•22 years ago
|
||
Comment on attachment 70712 [details] [diff] [review] to plug leak of nsHttpResponseHead resources sr=darin whoops!!
Attachment #70712 -
Flags: superreview+
Reporter | ||
Comment 5•22 years ago
|
||
Thanks, guys. This fixes all nsHttp:ResponseHead leaks (status strings, too). Can't wait to see this land.
Assignee | ||
Comment 6•22 years ago
|
||
rpotss,bbaetz Need a r on this please
Comment on attachment 70712 [details] [diff] [review] to plug leak of nsHttpResponseHead resources r=gagan
Attachment #70712 -
Flags: review+
Assignee | ||
Updated•22 years ago
|
Target Milestone: mozilla1.0 → mozilla0.9.9
Assignee | ||
Comment 9•22 years ago
|
||
Fixed with checkin D:\mozilla\netwerk\protocol\http\src>cvs commit nsHttpResponseHead.h Checking in nsHttpResponseHead.h; /cvsroot/mozilla/netwerk/protocol/http/src/nsHttpResponseHead.h,v <-- nsHttpRe sponseHead.h new revision: 1.15; previous revision: 1.14 done
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•