Hi Peter,

On Mon, Jul 1, 2024 at 2:43 PM Peter Maydell <peter.mayd...@linaro.org>
wrote:

> On Sun, 30 Jun 2024 at 17:33, Zheyu Ma <zheyum...@gmail.com> wrote:
> >
> > The musb_reset function was causing a memory leak by not properly freeing
> > the memory associated with USBPacket instances before reinitializing
> them.
> > This commit addresses the memory leak by adding calls to
> usb_packet_cleanup
> > for each USBPacket instance before reinitializing them with
> usb_packet_init.
> >
> > Asan log:
> >
> > =2970623==ERROR: LeakSanitizer: detected memory leaks
> > Direct leak of 256 byte(s) in 16 object(s) allocated from:
> >     #0 0x561e20629c3d in malloc
> llvm/compiler-rt/lib/asan/asan_malloc_linux.cpp:129:3
> >     #1 0x7fee91885738 in g_malloc
> (/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x5e738)
> >     #2 0x561e21b4d0e1 in usb_packet_init hw/usb/core.c:531:5
> >     #3 0x561e21c5016b in musb_reset hw/usb/hcd-musb.c:372:9
> >     #4 0x561e21c502a9 in musb_init hw/usb/hcd-musb.c:385:5
> >     #5 0x561e21c893ef in tusb6010_realize hw/usb/tusb6010.c:827:15
> >     #6 0x561e23443355 in device_set_realized hw/core/qdev.c:510:13
> >     #7 0x561e2346ac1b in property_set_bool qom/object.c:2354:5
> >     #8 0x561e23463895 in object_property_set qom/object.c:1463:5
> >     #9 0x561e23477909 in object_property_set_qobject
> qom/qom-qobject.c:28:10
> >     #10 0x561e234645ed in object_property_set_bool qom/object.c:1533:15
> >     #11 0x561e2343c830 in qdev_realize hw/core/qdev.c:291:12
> >     #12 0x561e2343c874 in qdev_realize_and_unref hw/core/qdev.c:298:11
> >     #13 0x561e20ad5091 in sysbus_realize_and_unref
> hw/core/sysbus.c:261:12
> >     #14 0x561e22553283 in n8x0_usb_setup hw/arm/nseries.c:800:5
> >     #15 0x561e2254e99b in n8x0_init hw/arm/nseries.c:1356:5
> >     #16 0x561e22561170 in n810_init hw/arm/nseries.c:1418:5
> >
> > Signed-off-by: Zheyu Ma <zheyum...@gmail.com>
> > ---
> >  hw/usb/hcd-musb.c | 2 ++
> >  1 file changed, 2 insertions(+)
> >
> > diff --git a/hw/usb/hcd-musb.c b/hw/usb/hcd-musb.c
> > index 6dca373cb1..0300aeaec6 100644
> > --- a/hw/usb/hcd-musb.c
> > +++ b/hw/usb/hcd-musb.c
> > @@ -368,6 +368,8 @@ void musb_reset(MUSBState *s)
> >          s->ep[i].maxp[1] = 0x40;
> >          s->ep[i].musb = s;
> >          s->ep[i].epnum = i;
> > +        usb_packet_cleanup(&s->ep[i].packey[0].p);
> > +        usb_packet_cleanup(&s->ep[i].packey[1].p);
> >          usb_packet_init(&s->ep[i].packey[0].p);
> >          usb_packet_init(&s->ep[i].packey[1].p);
> >      }
>
> I don't think it's valid to call usb_packet_cleanup() on
> a USBPacket that's never been inited, which is what will
> happen on the first reset with this patch.
>
> Looking at how hcd-ehci.c handles its s->ipacket (which has
> the same "allocated at device creation and reused for the
> whole lifetime of the device" semantics) I think what we
> want is:
>  * at device init, call usb_packet_init()
>  * at device reset, do nothing
>  * at device finalize, call usb_packet_cleanup()
>
> (There is currently no hcd-musb function for finalize
> because the only uses of it are for devices which continue
> to exist for the whole lifetime of the simulation. So we
> can ignore the last part of that.)
>
> PS: the tusb6010 and hcd-musb are both used only by deprecated
> board types which are scheduled to be deleted by the end
> of the year (basically after we get the 9.1 release out,
> and before 9.2). You might prefer to target your fuzzing
> efforts to board types which aren't deprecated.
>

Thanks for your kind reminder. I'll check the bug list and ignore
the devices which will be deprecated :)

Regards,
Zheyu

Reply via email to