Closed Bug 581282 Opened 14 years ago Closed 14 years ago

Invalid memory usage in nsHttpHeaderArray serialization

Categories

(Core :: Networking: HTTP, defect)

x86
Linux
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: jdm, Assigned: lusian)

References

Details

Attachments

(1 file)

==14272== Thread 2: ==14272== Syscall param socketcall.sendmsg(msg.msg_iov[i]) points to uninitialised byte(s) ==14272== at 0xC33208: sendmsg (in /lib/libpthread-2.11.2.so) ==14272== by 0x58277DD: IPC::Channel::ChannelImpl::Send(IPC::Message*) (ipc_channel_posix.cc:678) ==14272== by 0x5827E04: IPC::Channel::Send(IPC::Message*) (ipc_channel_posix.cc:821) ==14272== by 0x55B6181: void DispatchToMethod<IPC::Channel, bool (IPC::Channel::*)(IPC::Message*), IPC::Message*>(IPC::Channel*, bool (IPC::Channel::*)(IPC::Message*), Tuple1<IPC::Message*> const&) (tuple.h:393) ==14272== by 0x55B5FC6: RunnableMethod<IPC::Channel, bool (IPC::Channel::*)(IPC::Message*), Tuple1<IPC::Message*> >::Run() (task.h:307) ==14272== by 0x57C4C0B: MessageLoop::RunTask(Task*) (message_loop.cc:339) ==14272== by 0x57C4C74: MessageLoop::DeferOrRunPendingTask(MessageLoop::PendingTask const&) (message_loop.cc:347) ==14272== by 0x57C5034: MessageLoop::DoWork() (message_loop.cc:447) ==14272== by 0x5816BC9: base::MessagePumpLibevent::Run(base::MessagePump::Delegate*) (message_pump_libevent.cc:309) ==14272== by 0x57C4768: MessageLoop::RunInternal() (message_loop.cc:219) ==14272== by 0x57C46E8: MessageLoop::RunHandler() (message_loop.cc:202) ==14272== by 0x57C468C: MessageLoop::Run() (message_loop.cc:176) ==14272== Address 0xe7a493c is 436 bytes inside a block of size 512 alloc'd ==14272== at 0x4005CD2: realloc (vg_replace_malloc.c:476) ==14272== by 0x4036C7A: moz_realloc (mozalloc.cpp:140) ==14272== by 0x57D1CBD: Pickle::Resize(unsigned int) (pickle.cc:423) ==14272== by 0x57D17BD: Pickle::BeginWrite(unsigned int) (pickle.cc:325) ==14272== by 0x57D18CA: Pickle::WriteBytes(void const*, int) (pickle.cc:346) ==14272== by 0x43BFDA6: IPC::ParamTraits<nsACString_internal>::Write(IPC::Message*, nsACString_internal const&) (IPCMessageUtils.h:134) ==14272== by 0x5608C57: void IPC::WriteParam<nsCAutoString>(IPC::Message*, nsCAutoString const&) (ipc_message_utils.h:124) ==14272== by 0x5609036: IPC::ParamTraits<nsHttpAtom>::Write(IPC::Message*, nsHttpAtom const&) (PHttpChannelParams.h:104) ==14272== by 0x5608C92: void IPC::WriteParam<nsHttpAtom>(IPC::Message*, nsHttpAtom const&) (ipc_message_utils.h:124) ==14272== by 0x5609138: IPC::ParamTraits<nsHttpHeaderArray::nsEntry>::Write(IPC::Message*, nsHttpHeaderArray::nsEntry const&) (PHttpChannelParams.h:126) ==14272== by 0x5608E07: void IPC::WriteParam<nsHttpHeaderArray::nsEntry>(IPC::Message*, nsHttpHeaderArray::nsEntry const&) (ipc_message_utils.h:124) ==14272== by 0x5609C66: IPC::ParamTraits<nsTArray<nsHttpHeaderArray::nsEntry> >::Write(IPC::Message*, nsTArray<nsHttpHeaderArray::nsEntry> const&) (IPCMessageUtils.h:259) ==14272== Uninitialised value was created by a stack allocation ==14272== at 0x4480982: mozilla::net::HttpChannelParent::OnStartRequest(nsIRequest*, nsISupports*) (HttpChannelParent.cpp:200) ==14272== I don't have this figured out yet, but I suspect it's somehow coming from the nsHttpResponseHead being constructed in the event of no response head being present.
How would I trigger this bug? Just running with valgrind and browsing does not show this for me.
I suspect I saw it on programming.reddit.com, but I'm not positive about that. Not every page triggers it.
I see it on programming.reddit.com. Let me investigate.
Assignee: nobody → lusian
I built firefox with the recommended setting (by https://developer.mozilla.org/en/Debugging_Mozilla_with_valgrind), and I got the different result on programming.reddit.com: ==13261== Thread 2: ==13261== Syscall param socketcall.sendmsg(msg.msg_iov[i]) points to uninitialised byte(s) ==13261== at 0x404F468: sendmsg (socket.S:100) ==13261== by 0x5A880E5: IPC::Channel::ChannelImpl::Send(IPC::Message*) (ipc_channel_posix.cc:678) ==13261== by 0x5A8814C: IPC::Channel::Send(IPC::Message*) (ipc_channel_posix.cc:821) ==13261== by 0x57F38AA: RunnableMethod<IPC::Channel, bool (IPC::Channel::*)(IPC::Message*), Tuple1<IPC::Message*> >::Run() (tuple.h:393) ==13261== by 0x5A44F63: MessageLoop::RunTask(Task*) (message_loop.cc:339) ==13261== by 0x5A45731: MessageLoop::DeferOrRunPendingTask(MessageLoop::PendingTask const&) (message_loop.cc:347) ==13261== by 0x5A45ED4: MessageLoop::DoWork() (message_loop.cc:447) ==13261== by 0x5A7D230: base::MessagePumpLibevent::Run(base::MessagePump::Delegate*) (message_pump_libevent.cc:309) ==13261== by 0x5A45568: MessageLoop::RunInternal() (message_loop.cc:219) ==13261== by 0x5A45584: MessageLoop::RunHandler() (message_loop.cc:202) ==13261== by 0x5A455EF: MessageLoop::Run() (message_loop.cc:176) ==13261== by 0x5A5A2E2: base::Thread::ThreadMain() (thread.cc:156) ==13261== Address 0xc3e18a4 is 436 bytes inside a block of size 512 alloc'd ==13261== at 0x4025016: realloc (vg_replace_malloc.c:525) ==13261== by 0x6458EDE: moz_realloc (mozalloc.cpp:140) ==13261== by 0x5A4BE5C: Pickle::Resize(unsigned int) (pickle.cc:423) ==13261== by 0x5A4C301: Pickle::BeginWrite(unsigned int) (pickle.cc:325) ==13261== by 0x5A4C341: Pickle::WriteBytes(void const*, int) (pickle.cc:346) ==13261== by 0x58B2433: mozilla::net::PHttpChannelParent::SendOnStartRequest(nsHttpResponseHead const&, int const&, int const&, int const&, unsigned int const&, nsCString const&) (IPCMessageUtils.h:134) ==13261== by 0x43B29FA: mozilla::net::HttpChannelParent::OnStartRequest(nsIRequest*, nsISupports*) (HttpChannelParent.cpp:217) ==13261== by 0x439DF85: nsHttpChannel::CallOnStartRequest() (nsHttpChannel.cpp:732) ==13261== by 0x43A31F1: nsHttpChannel::ContinueProcessNormal(unsigned int) (nsHttpChannel.cpp:1087) ==13261== by 0x43A33FD: nsHttpChannel::ProcessNormal() (nsHttpChannel.cpp:1024) ==13261== by 0x43A7D2D: nsHttpChannel::ProcessResponse() (nsHttpChannel.cpp:974) ==13261== by 0x43A8566: nsHttpChannel::OnStartRequest(nsIRequest*, nsISupports*) (nsHttpChannel.cpp:3564) ==13261== Uninitialised value was created by a stack allocation ==13261== at 0x43B2706: mozilla::net::HttpChannelParent::OnStartRequest(nsIRequest*, nsISupports*) (HttpChannelParent.cpp:200) ==13261==
I don't see what's different about it at all except that the stack under OnStartRequest has changed, I assume because of the async redirection patch that landed.
Attached patch patch (deleted) — Splinter Review
GetCacheTokenExpirationTime (http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/http/HttpChannelParent.cpp#208) returned NS_ERROR_NOT_AVAILABLE because !mCacheEntry.
Attachment #463039 - Flags: review?(josh)
Comment on attachment 463039 [details] [diff] [review] patch I'm passing this off to somebody who knows what a sensible default is here.
Attachment #463039 - Flags: review?(josh) → review?(jduell.mcbugs)
Setting the HttpChannelChild's mCacheExpiration time in OnStartRequest to nsICache::NO_EXPIRATION_TIME looks right (that's the default value in the child at construction, at least, so it's as if we just left it alone). Cc-ing Michal and Byron in case that's deeply wrong.
Hmm. The NO_EXPIRATION_TIME fix looks correct, in that we'd give a bogus expirationTime to the child otherwise. But sending a random expirationTime shouldn't cause invalid memory usage in the IPDL serialization code. I don't see how this patch actually fixes this bug.
valgrind is pointing to the wrong place. After applying the patch, I didn't see the valgrind warning anymore.
I'm trying to reproduce it but I'm out of luck. Are there any known steps to reproduce? Browsing through programming.reddit.com is stable for me.
mozconfig: enable-debug, disable-optimize, disable-jemalloc, enable-valgrind valgrind --tool=memcheck --trace-children=yes (optional: --track-origins=yes) ~~~ test-ipc.xul Load http://www.reddit.com, and you should see the output in the description. Go to the site & wait, there is no need to browse.
Attachment #463039 - Flags: review?(jduell.mcbugs) → review+
Landed as part of http://hg.mozilla.org/projects/electrolysis/rev/5936477a4dc8 Note that this wasn't an actual behavior bug--just a use before init that valgrind didn't like.
Status: NEW → RESOLVED
Closed: 14 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: