Memory leak in the virtual device applesmc

Host environment

  • Operating system: Ubuntu 22.04.4 LTS

  • OS/kernel version: Linux 6.5.0-25-generic

  • Architecture: x86_64

  • QEMU flavor: 8.2.92

  • QEMU version: commit ce64e622

  • QEMU command line:

    ./qemu-system-x86_64 -m 2G -enable-kvm -hda ./buster.img -kernel ./kernel/arch/x86/boot/bzImage -display none -serial mon:stdio -device isa-applesmc

Emulated/Virtualized environment

  • Operating system: Debian GNU/Linux 10 (buster)
  • OS/kernel version: Linux syzkaller 6.6.0
  • Architecture: x86_64

Description of problem

In the function qdev_applesmc_isa_reset, the device mallocs the AppleSMCData but does not free them, causing a memory leak.

The following log reveals it:

==1029295==ERROR: LeakSanitizer: detected memory leaksDirect leak of 80 byte(s) in 2 object(s) allocated from:
#0 0x5574dc600a82 in __interceptor_calloc compiler-rt/lib/asan/asan_malloc_linux.cpp:138:3 
#1 0x7f4919b22c50 in g_malloc0 (/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x5ec50)
#2 0x5574dcdb0dfe in qdev_applesmc_isa_reset qemu/hw/misc/applesmc.c:285:5 
#3 0x5574de30e099 in resettable_phase_hold qemu/hw/core/resettable.c 
#4 0x5574de2ef753 in bus_reset_child_foreach qemu/hw/core/bus.c:97:13 
#5 0x5574de30dcfe in resettable_child_foreach qemu/hw/core/resettable.c:96:9 
#6 0x5574de30dcfe in resettable_phase_hold qemu/hw/core/resettable.c:173:5 
#7 0x5574de3059b3 in device_reset_child_foreach qemu/hw/core/qdev.c:276:9

Steps to reproduce

  1. Build qemu with the sanitizer
  2. Boot the Linux kernel with the above command line.
  3. Stop the qemu process