Pull request

v2:
 - dropped "tests: fix small leak in test-io-channel-command" that Daniel Berrange will pick
 - fixed "tests: add qtest_add_data_func_full" to work with glib < 2.26
 -----BEGIN PGP SIGNATURE-----
 
 iQIcBAABAgAGBQJX0XLWAAoJENro4Ql1lpzlToQP/1xJYMnm2xiMqD26puiRikoH
 nM6SMxNmympuLWZC8A3y/MZhjtfLzXQsx7SiErdemvkDa+hL/nH2csTL5hAh1DE2
 j4sEo3Gl+VwvnAIiiF4hnv2Q19OcxcGVR1VgZK0XVicgtVe5M0qHFV0XFrA+M/6R
 zPt/Qz64DXXzYbFoQIa9ghSfqH7ilk3JhCL67CmVcHu+44CLRpo/TMQfAfMOqXfo
 pRwozW67m3K6QUcDRERjkGAP0uPCp6n64cCBuYpf34uEiULnAnjz/IZJ6GeqryLt
 p4dX1CiAvvD5OlqjooRYbB3n2O0xmixjlCfGtbx/TQrNT4Lr66Q6k1aYpsA5VAdf
 4w+km8N11mgS0a9lzjAaS1Z6SMmOxcl/D4/J3SbFBl2XbrR5Y9pGXixWytkVTMUU
 YuJYZAuJteqmtOhKaP17qiidOAXDXrf96DEASlst8i4WgiTNaHk5MtCCaGNTgP+s
 030wVe++zISVpriobwu63qfnHIxnpMVzk+6NcF977niVJnGOkWgZdA4CYgGdqyEQ
 pog0j8H+KCDfonLtYPTKgn1dflQm0NYGFSbiDL8vzD5rzunmS2YNOf1UTB1qlxf1
 FOF3DycoHtBD9/BCgoFeASUM5VF1LJbOB5UyUedkEzartcFrme6FVC77XQQMfSQb
 JjBuVUDWvJ4UhXIGOSad
 =Xzb1
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/elmarco/tags/leak-pull-request' into staging

Pull request

v2:
- dropped "tests: fix small leak in test-io-channel-command" that Daniel Berrange will pick
- fixed "tests: add qtest_add_data_func_full" to work with glib < 2.26

# gpg: Signature made Thu 08 Sep 2016 15:16:54 BST
# gpg:                using RSA key 0xDAE8E10975969CE5
# gpg: Good signature from "Marc-André Lureau <marcandre.lureau@redhat.com>"
# gpg:                 aka "Marc-André Lureau <marcandre.lureau@gmail.com>"
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg:          It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 87A9 BD93 3F87 C606 D276  F62D DAE8 E109 7596 9CE5

* remotes/elmarco/tags/leak-pull-request: (25 commits)
  tests: fix postcopy-test leaks
  tests: fix rsp leak in postcopy-test
  tests: pc-cpu-test leaks fixes
  tests: add qtest_add_data_func_full
  bus: simplify name handling
  ipmi: free extern timer
  sd: free timer
  pc: keep gsi reference
  pc: free i8259
  tests: fix qom-test leaks
  acpi-build: fix array leak
  machine: use class base init generated name
  pc: don't leak a20_line
  pc: simplify passing qemu_irq
  portio: keep references on portio
  tests: fix leak in test-string-input-visitor
  tests: fix check-qom-proplist leaks
  tests: fix check-qom-interface leaks
  tests: fix test-iov leaks
  tests: fix test-vmstate leaks
  ...

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2016-09-08 15:22:50 +01:00
commit 33e60e0198
39 changed files with 248 additions and 90 deletions

View File

@ -60,6 +60,8 @@ typedef struct GUSState {
int64_t last_ticks; int64_t last_ticks;
qemu_irq pic; qemu_irq pic;
IsaDma *isa_dma; IsaDma *isa_dma;
PortioList portio_list1;
PortioList portio_list2;
} GUSState; } GUSState;
static uint32_t gus_readb(void *opaque, uint32_t nport) static uint32_t gus_readb(void *opaque, uint32_t nport)
@ -265,9 +267,10 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
s->samples = AUD_get_buffer_size_out (s->voice) >> s->shift; s->samples = AUD_get_buffer_size_out (s->voice) >> s->shift;
s->mixbuf = g_malloc0 (s->samples << s->shift); s->mixbuf = g_malloc0 (s->samples << s->shift);
isa_register_portio_list (d, s->port, gus_portio_list1, s, "gus"); isa_register_portio_list(d, &s->portio_list1, s->port,
isa_register_portio_list (d, (s->port + 0x100) & 0xf00, gus_portio_list1, s, "gus");
gus_portio_list2, s, "gus"); isa_register_portio_list(d, &s->portio_list2, (s->port + 0x100) & 0xf00,
gus_portio_list2, s, "gus");
s->isa_dma = isa_get_dma(isa_bus_from_device(d), s->emu.gusdma); s->isa_dma = isa_get_dma(isa_bus_from_device(d), s->emu.gusdma);
k = ISADMA_GET_CLASS(s->isa_dma); k = ISADMA_GET_CLASS(s->isa_dma);

View File

@ -106,6 +106,7 @@ typedef struct SB16State {
/* mixer state */ /* mixer state */
int mixer_nreg; int mixer_nreg;
uint8_t mixer_regs[256]; uint8_t mixer_regs[256];
PortioList portio_list;
} SB16State; } SB16State;
static void SB_audio_callback (void *opaque, int free); static void SB_audio_callback (void *opaque, int free);
@ -1378,7 +1379,8 @@ static void sb16_realizefn (DeviceState *dev, Error **errp)
dolog ("warning: Could not create auxiliary timer\n"); dolog ("warning: Could not create auxiliary timer\n");
} }
isa_register_portio_list (isadev, s->port, sb16_ioport_list, s, "sb16"); isa_register_portio_list(isadev, &s->portio_list, s->port,
sb16_ioport_list, s, "sb16");
s->isa_hdma = isa_get_dma(isa_bus_from_device(isadev), s->hdma); s->isa_hdma = isa_get_dma(isa_bus_from_device(isadev), s->hdma);
k = ISADMA_GET_CLASS(s->isa_hdma); k = ISADMA_GET_CLASS(s->isa_hdma);

View File

@ -692,6 +692,7 @@ struct FDCtrl {
/* Timers state */ /* Timers state */
uint8_t timer0; uint8_t timer0;
uint8_t timer1; uint8_t timer1;
PortioList portio_list;
}; };
static FloppyDriveType get_fallback_drive_type(FDrive *drv) static FloppyDriveType get_fallback_drive_type(FDrive *drv)
@ -2495,7 +2496,8 @@ static void isabus_fdc_realize(DeviceState *dev, Error **errp)
FDCtrl *fdctrl = &isa->state; FDCtrl *fdctrl = &isa->state;
Error *err = NULL; Error *err = NULL;
isa_register_portio_list(isadev, isa->iobase, fdc_portio_list, fdctrl, isa_register_portio_list(isadev, &fdctrl->portio_list,
isa->iobase, fdc_portio_list, fdctrl,
"fdc"); "fdc");
isa_init_irq(isadev, &fdctrl->irq, isa->irq); isa_init_irq(isadev, &fdctrl->irq, isa->irq);

View File

@ -80,6 +80,7 @@ typedef struct ParallelState {
uint32_t last_read_offset; /* For debugging */ uint32_t last_read_offset; /* For debugging */
/* Memory-mapped interface */ /* Memory-mapped interface */
int it_shift; int it_shift;
PortioList portio_list;
} ParallelState; } ParallelState;
#define TYPE_ISA_PARALLEL "isa-parallel" #define TYPE_ISA_PARALLEL "isa-parallel"
@ -532,7 +533,7 @@ static void parallel_isa_realizefn(DeviceState *dev, Error **errp)
s->status = dummy; s->status = dummy;
} }
isa_register_portio_list(isadev, base, isa_register_portio_list(isadev, &s->portio_list, base,
(s->hw_driver (s->hw_driver
? &isa_parallel_portio_hw_list[0] ? &isa_parallel_portio_hw_list[0]
: &isa_parallel_portio_sw_list[0]), : &isa_parallel_portio_sw_list[0]),

View File

@ -78,8 +78,7 @@ static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
{ {
const char *typename = object_get_typename(OBJECT(bus)); const char *typename = object_get_typename(OBJECT(bus));
BusClass *bc; BusClass *bc;
char *buf; int i, bus_id;
int i, len, bus_id;
bus->parent = parent; bus->parent = parent;
@ -88,23 +87,15 @@ static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
} else if (bus->parent && bus->parent->id) { } else if (bus->parent && bus->parent->id) {
/* parent device has id -> use it plus parent-bus-id for bus name */ /* parent device has id -> use it plus parent-bus-id for bus name */
bus_id = bus->parent->num_child_bus; bus_id = bus->parent->num_child_bus;
bus->name = g_strdup_printf("%s.%d", bus->parent->id, bus_id);
len = strlen(bus->parent->id) + 16;
buf = g_malloc(len);
snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
bus->name = buf;
} else { } else {
/* no id -> use lowercase bus type plus global bus-id for bus name */ /* no id -> use lowercase bus type plus global bus-id for bus name */
bc = BUS_GET_CLASS(bus); bc = BUS_GET_CLASS(bus);
bus_id = bc->automatic_ids++; bus_id = bc->automatic_ids++;
bus->name = g_strdup_printf("%s.%d", typename, bus_id);
len = strlen(typename) + 16; for (i = 0; bus->name[i]; i++) {
buf = g_malloc(len); bus->name[i] = qemu_tolower(bus->name[i]);
len = snprintf(buf, len, "%s.%d", typename, bus_id);
for (i = 0; i < len; i++) {
buf[i] = qemu_tolower(buf[i]);
} }
bus->name = buf;
} }
if (bus->parent) { if (bus->parent) {
@ -229,7 +220,7 @@ static void qbus_finalize(Object *obj)
{ {
BusState *bus = BUS(obj); BusState *bus = BUS(obj);
g_free((char *)bus->name); g_free(bus->name);
} }
static const TypeInfo bus_info = { static const TypeInfo bus_info = {

View File

@ -561,6 +561,7 @@ static void machine_class_finalize(ObjectClass *klass, void *data)
if (mc->compat_props) { if (mc->compat_props) {
g_array_free(mc->compat_props, true); g_array_free(mc->compat_props, true);
} }
g_free(mc->name);
} }
void machine_register_compat_props(MachineState *machine) void machine_register_compat_props(MachineState *machine)

View File

@ -39,6 +39,8 @@ typedef struct ISAVGAState {
ISADevice parent_obj; ISADevice parent_obj;
struct VGACommonState state; struct VGACommonState state;
PortioList portio_vga;
PortioList portio_vbe;
} ISAVGAState; } ISAVGAState;
static void vga_isa_reset(DeviceState *dev) static void vga_isa_reset(DeviceState *dev)
@ -60,9 +62,11 @@ static void vga_isa_realizefn(DeviceState *dev, Error **errp)
vga_common_init(s, OBJECT(dev), true); vga_common_init(s, OBJECT(dev), true);
s->legacy_address_space = isa_address_space(isadev); s->legacy_address_space = isa_address_space(isadev);
vga_io_memory = vga_init_io(s, OBJECT(dev), &vga_ports, &vbe_ports); vga_io_memory = vga_init_io(s, OBJECT(dev), &vga_ports, &vbe_ports);
isa_register_portio_list(isadev, 0x3b0, vga_ports, s, "vga"); isa_register_portio_list(isadev, &d->portio_vga,
0x3b0, vga_ports, s, "vga");
if (vbe_ports) { if (vbe_ports) {
isa_register_portio_list(isadev, 0x1ce, vbe_ports, s, "vbe"); isa_register_portio_list(isadev, &d->portio_vbe,
0x1ce, vbe_ports, s, "vbe");
} }
memory_region_add_subregion_overlap(isa_address_space(isadev), memory_region_add_subregion_overlap(isa_address_space(isadev),
0x000a0000, 0x000a0000,

View File

@ -553,10 +553,12 @@ static void i8257_realize(DeviceState *dev, Error **errp)
memory_region_add_subregion(isa_address_space_io(isa), memory_region_add_subregion(isa_address_space_io(isa),
d->base, &d->channel_io); d->base, &d->channel_io);
isa_register_portio_list(isa, d->page_base, page_portio_list, d, isa_register_portio_list(isa, &d->portio_page,
d->page_base, page_portio_list, d,
"dma-page"); "dma-page");
if (d->pageh_base >= 0) { if (d->pageh_base >= 0) {
isa_register_portio_list(isa, d->pageh_base, pageh_portio_list, d, isa_register_portio_list(isa, &d->portio_pageh,
d->pageh_base, pageh_portio_list, d,
"dma-pageh"); "dma-pageh");
} }

View File

@ -789,7 +789,7 @@ static gint crs_range_compare(gconstpointer a, gconstpointer b)
static void crs_replace_with_free_ranges(GPtrArray *ranges, static void crs_replace_with_free_ranges(GPtrArray *ranges,
uint64_t start, uint64_t end) uint64_t start, uint64_t end)
{ {
GPtrArray *free_ranges = g_ptr_array_new_with_free_func(crs_range_free); GPtrArray *free_ranges = g_ptr_array_new();
uint64_t free_base = start; uint64_t free_base = start;
int i; int i;
@ -813,7 +813,7 @@ static void crs_replace_with_free_ranges(GPtrArray *ranges,
g_ptr_array_add(ranges, g_ptr_array_index(free_ranges, i)); g_ptr_array_add(ranges, g_ptr_array_index(free_ranges, i));
} }
g_ptr_array_free(free_ranges, false); g_ptr_array_free(free_ranges, true);
} }
/* /*

View File

@ -530,9 +530,9 @@ static uint64_t port92_read(void *opaque, hwaddr addr,
return ret; return ret;
} }
static void port92_init(ISADevice *dev, qemu_irq *a20_out) static void port92_init(ISADevice *dev, qemu_irq a20_out)
{ {
qdev_connect_gpio_out_named(DEVICE(dev), PORT92_A20_LINE, 0, *a20_out); qdev_connect_gpio_out_named(DEVICE(dev), PORT92_A20_LINE, 0, a20_out);
} }
static const VMStateDescription vmstate_port92_isa = { static const VMStateDescription vmstate_port92_isa = {
@ -1594,7 +1594,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2); a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
i8042 = isa_create_simple(isa_bus, "i8042"); i8042 = isa_create_simple(isa_bus, "i8042");
i8042_setup_a20_line(i8042, &a20_line[0]); i8042_setup_a20_line(i8042, a20_line[0]);
if (!no_vmport) { if (!no_vmport) {
vmport_init(isa_bus); vmport_init(isa_bus);
vmmouse = isa_try_create(isa_bus, "vmmouse"); vmmouse = isa_try_create(isa_bus, "vmmouse");
@ -1607,7 +1607,8 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
qdev_init_nofail(dev); qdev_init_nofail(dev);
} }
port92 = isa_create_simple(isa_bus, "port92"); port92 = isa_create_simple(isa_bus, "port92");
port92_init(port92, &a20_line[1]); port92_init(port92, a20_line[1]);
g_free(a20_line);
DMA_init(isa_bus, 0); DMA_init(isa_bus, 0);

View File

@ -74,7 +74,6 @@ static void pc_init1(MachineState *machine,
ISABus *isa_bus; ISABus *isa_bus;
PCII440FXState *i440fx_state; PCII440FXState *i440fx_state;
int piix3_devfn = -1; int piix3_devfn = -1;
qemu_irq *gsi;
qemu_irq *i8259; qemu_irq *i8259;
qemu_irq smi_irq; qemu_irq smi_irq;
GSIState *gsi_state; GSIState *gsi_state;
@ -185,16 +184,16 @@ static void pc_init1(MachineState *machine,
gsi_state = g_malloc0(sizeof(*gsi_state)); gsi_state = g_malloc0(sizeof(*gsi_state));
if (kvm_ioapic_in_kernel()) { if (kvm_ioapic_in_kernel()) {
kvm_pc_setup_irq_routing(pcmc->pci_enabled); kvm_pc_setup_irq_routing(pcmc->pci_enabled);
gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state, pcms->gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
GSI_NUM_PINS); GSI_NUM_PINS);
} else { } else {
gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS); pcms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
} }
if (pcmc->pci_enabled) { if (pcmc->pci_enabled) {
pci_bus = i440fx_init(host_type, pci_bus = i440fx_init(host_type,
pci_type, pci_type,
&i440fx_state, &piix3_devfn, &isa_bus, gsi, &i440fx_state, &piix3_devfn, &isa_bus, pcms->gsi,
system_memory, system_io, machine->ram_size, system_memory, system_io, machine->ram_size,
pcms->below_4g_mem_size, pcms->below_4g_mem_size,
pcms->above_4g_mem_size, pcms->above_4g_mem_size,
@ -207,7 +206,7 @@ static void pc_init1(MachineState *machine,
&error_abort); &error_abort);
no_hpet = 1; no_hpet = 1;
} }
isa_bus_irqs(isa_bus, gsi); isa_bus_irqs(isa_bus, pcms->gsi);
if (kvm_pic_in_kernel()) { if (kvm_pic_in_kernel()) {
i8259 = kvm_i8259_init(isa_bus); i8259 = kvm_i8259_init(isa_bus);
@ -225,7 +224,7 @@ static void pc_init1(MachineState *machine,
ioapic_init_gsi(gsi_state, "i440fx"); ioapic_init_gsi(gsi_state, "i440fx");
} }
pc_register_ferr_irq(gsi[13]); pc_register_ferr_irq(pcms->gsi[13]);
pc_vga_init(isa_bus, pcmc->pci_enabled ? pci_bus : NULL); pc_vga_init(isa_bus, pcmc->pci_enabled ? pci_bus : NULL);
@ -235,7 +234,7 @@ static void pc_init1(MachineState *machine,
} }
/* init basic PC hardware */ /* init basic PC hardware */
pc_basic_device_init(isa_bus, gsi, &rtc_state, true, pc_basic_device_init(isa_bus, pcms->gsi, &rtc_state, true,
(pcms->vmport != ON_OFF_AUTO_ON), 0x4); (pcms->vmport != ON_OFF_AUTO_ON), 0x4);
pc_nic_init(isa_bus, pci_bus); pc_nic_init(isa_bus, pci_bus);
@ -279,7 +278,7 @@ static void pc_init1(MachineState *machine,
smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0); smi_irq = qemu_allocate_irq(pc_acpi_smi_interrupt, first_cpu, 0);
/* TODO: Populate SPD eeprom data. */ /* TODO: Populate SPD eeprom data. */
smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
gsi[9], smi_irq, pcms->gsi[9], smi_irq,
pc_machine_is_smm_enabled(pcms), pc_machine_is_smm_enabled(pcms),
&piix4_pm); &piix4_pm);
smbus_eeprom_init(smbus, 8, NULL, 0); smbus_eeprom_init(smbus, 8, NULL, 0);

View File

@ -69,7 +69,6 @@ static void pc_q35_init(MachineState *machine)
MemoryRegion *ram_memory; MemoryRegion *ram_memory;
GSIState *gsi_state; GSIState *gsi_state;
ISABus *isa_bus; ISABus *isa_bus;
qemu_irq *gsi;
qemu_irq *i8259; qemu_irq *i8259;
int i; int i;
ICH9LPCState *ich9_lpc; ICH9LPCState *ich9_lpc;
@ -153,10 +152,10 @@ static void pc_q35_init(MachineState *machine)
gsi_state = g_malloc0(sizeof(*gsi_state)); gsi_state = g_malloc0(sizeof(*gsi_state));
if (kvm_ioapic_in_kernel()) { if (kvm_ioapic_in_kernel()) {
kvm_pc_setup_irq_routing(pcmc->pci_enabled); kvm_pc_setup_irq_routing(pcmc->pci_enabled);
gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state, pcms->gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
GSI_NUM_PINS); GSI_NUM_PINS);
} else { } else {
gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS); pcms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state, GSI_NUM_PINS);
} }
/* create pci host bus */ /* create pci host bus */
@ -195,7 +194,7 @@ static void pc_q35_init(MachineState *machine)
ich9_lpc = ICH9_LPC_DEVICE(lpc); ich9_lpc = ICH9_LPC_DEVICE(lpc);
lpc_dev = DEVICE(lpc); lpc_dev = DEVICE(lpc);
for (i = 0; i < GSI_NUM_PINS; i++) { for (i = 0; i < GSI_NUM_PINS; i++) {
qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI, i, gsi[i]); qdev_connect_gpio_out_named(lpc_dev, ICH9_GPIO_GSI, i, pcms->gsi[i]);
} }
pci_bus_irqs(host_bus, ich9_lpc_set_irq, ich9_lpc_map_irq, ich9_lpc, pci_bus_irqs(host_bus, ich9_lpc_set_irq, ich9_lpc_map_irq, ich9_lpc,
ICH9_LPC_NB_PIRQS); ICH9_LPC_NB_PIRQS);
@ -213,11 +212,13 @@ static void pc_q35_init(MachineState *machine)
for (i = 0; i < ISA_NUM_IRQS; i++) { for (i = 0; i < ISA_NUM_IRQS; i++) {
gsi_state->i8259_irq[i] = i8259[i]; gsi_state->i8259_irq[i] = i8259[i];
} }
g_free(i8259);
if (pcmc->pci_enabled) { if (pcmc->pci_enabled) {
ioapic_init_gsi(gsi_state, "q35"); ioapic_init_gsi(gsi_state, "q35");
} }
pc_register_ferr_irq(gsi[13]); pc_register_ferr_irq(pcms->gsi[13]);
assert(pcms->vmport != ON_OFF_AUTO__MAX); assert(pcms->vmport != ON_OFF_AUTO__MAX);
if (pcms->vmport == ON_OFF_AUTO_AUTO) { if (pcms->vmport == ON_OFF_AUTO_AUTO) {
@ -225,7 +226,7 @@ static void pc_q35_init(MachineState *machine)
} }
/* init basic PC hardware */ /* init basic PC hardware */
pc_basic_device_init(isa_bus, gsi, &rtc_state, !mc->no_floppy, pc_basic_device_init(isa_bus, pcms->gsi, &rtc_state, !mc->no_floppy,
(pcms->vmport != ON_OFF_AUTO_ON), 0xff0104); (pcms->vmport != ON_OFF_AUTO_ON), 0xff0104);
/* connect pm stuff to lpc */ /* connect pm stuff to lpc */

View File

@ -2619,10 +2619,12 @@ void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
{ {
/* ??? Assume only ISA and PCI configurations, and that the PCI-ISA /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
bridge has been setup properly to always register with ISA. */ bridge has been setup properly to always register with ISA. */
isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide"); isa_register_portio_list(dev, &bus->portio_list,
iobase, ide_portio_list, bus, "ide");
if (iobase2) { if (iobase2) {
isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide"); isa_register_portio_list(dev, &bus->portio2_list,
iobase2, ide_portio2_list, bus, "ide");
} }
} }

View File

@ -499,9 +499,9 @@ void i8042_isa_mouse_fake_event(void *opaque)
ps2_mouse_fake_event(s->mouse); ps2_mouse_fake_event(s->mouse);
} }
void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out) void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out)
{ {
qdev_connect_gpio_out_named(DEVICE(dev), I8042_A20_LINE, 0, *a20_out); qdev_connect_gpio_out_named(DEVICE(dev), I8042_A20_LINE, 0, a20_out);
} }
static const VMStateDescription vmstate_kbd_isa = { static const VMStateDescription vmstate_kbd_isa = {

View File

@ -487,6 +487,14 @@ static void ipmi_bmc_extern_init(Object *obj)
vmstate_register(NULL, 0, &vmstate_ipmi_bmc_extern, ibe); vmstate_register(NULL, 0, &vmstate_ipmi_bmc_extern, ibe);
} }
static void ipmi_bmc_extern_finalize(Object *obj)
{
IPMIBmcExtern *ibe = IPMI_BMC_EXTERN(obj);
timer_del(ibe->extern_timer);
timer_free(ibe->extern_timer);
}
static Property ipmi_bmc_extern_properties[] = { static Property ipmi_bmc_extern_properties[] = {
DEFINE_PROP_CHR("chardev", IPMIBmcExtern, chr), DEFINE_PROP_CHR("chardev", IPMIBmcExtern, chr),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
@ -508,6 +516,7 @@ static const TypeInfo ipmi_bmc_extern_type = {
.parent = TYPE_IPMI_BMC, .parent = TYPE_IPMI_BMC,
.instance_size = sizeof(IPMIBmcExtern), .instance_size = sizeof(IPMIBmcExtern),
.instance_init = ipmi_bmc_extern_init, .instance_init = ipmi_bmc_extern_init,
.instance_finalize = ipmi_bmc_extern_finalize,
.class_init = ipmi_bmc_extern_class_init, .class_init = ipmi_bmc_extern_class_init,
}; };

View File

@ -131,24 +131,20 @@ void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start)
isa_init_ioport(dev, start); isa_init_ioport(dev, start);
} }
void isa_register_portio_list(ISADevice *dev, uint16_t start, void isa_register_portio_list(ISADevice *dev,
PortioList *piolist, uint16_t start,
const MemoryRegionPortio *pio_start, const MemoryRegionPortio *pio_start,
void *opaque, const char *name) void *opaque, const char *name)
{ {
PortioList piolist; assert(piolist && !piolist->owner);
/* START is how we should treat DEV, regardless of the actual /* START is how we should treat DEV, regardless of the actual
contents of the portio array. This is how the old code contents of the portio array. This is how the old code
actually handled e.g. the FDC device. */ actually handled e.g. the FDC device. */
isa_init_ioport(dev, start); isa_init_ioport(dev, start);
/* FIXME: the device should store created PortioList in its state. Note portio_list_init(piolist, OBJECT(dev), pio_start, opaque, name);
that DEV can be NULL here and that single device can register several portio_list_add(piolist, isabus->address_space_io, start);
portio lists. Current implementation is leaking memory allocated
in portio_list_init. The leak is not critical because it happens only
at initialization time. */
portio_list_init(&piolist, OBJECT(dev), pio_start, opaque, name);
portio_list_add(&piolist, isabus->address_space_io, start);
} }
static void isa_device_init(Object *obj) static void isa_device_init(Object *obj)

View File

@ -1876,6 +1876,14 @@ static void sd_instance_init(Object *obj)
sd->ocr_power_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sd_ocr_powerup, sd); sd->ocr_power_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sd_ocr_powerup, sd);
} }
static void sd_instance_finalize(Object *obj)
{
SDState *sd = SD_CARD(obj);
timer_del(sd->ocr_power_timer);
timer_free(sd->ocr_power_timer);
}
static void sd_realize(DeviceState *dev, Error **errp) static void sd_realize(DeviceState *dev, Error **errp)
{ {
SDState *sd = SD_CARD(dev); SDState *sd = SD_CARD(dev);
@ -1927,6 +1935,7 @@ static const TypeInfo sd_info = {
.class_size = sizeof(SDCardClass), .class_size = sizeof(SDCardClass),
.class_init = sd_class_init, .class_init = sd_class_init,
.instance_init = sd_instance_init, .instance_init = sd_instance_init,
.instance_finalize = sd_instance_finalize,
}; };
static void sd_register_types(void) static void sd_register_types(void)

View File

@ -280,4 +280,28 @@ static inline void g_hash_table_add(GHashTable *hash_table, gpointer key)
} while (0) } while (0)
#endif #endif
#if !GLIB_CHECK_VERSION(2, 28, 0)
static inline void g_list_free_full(GList *list, GDestroyNotify free_func)
{
GList *l;
for (l = list; l; l = l->next) {
free_func(l->data);
}
g_list_free(list);
}
static inline void g_slist_free_full(GSList *list, GDestroyNotify free_func)
{
GSList *l;
for (l = list; l; l = l->next) {
free_func(l->data);
}
g_slist_free(list);
}
#endif
#endif #endif

View File

@ -93,7 +93,7 @@ struct MachineClass {
/*< public >*/ /*< public >*/
const char *family; /* NULL iff @name identifies a standalone machtype */ const char *family; /* NULL iff @name identifies a standalone machtype */
const char *name; char *name;
const char *alias; const char *alias;
const char *desc; const char *desc;

View File

@ -53,6 +53,7 @@ struct PCMachineState {
ISADevice *rtc; ISADevice *rtc;
PCIBus *bus; PCIBus *bus;
FWCfgState *fw_cfg; FWCfgState *fw_cfg;
qemu_irq *gsi;
/* Configuration options: */ /* Configuration options: */
uint64_t max_ram_below_4g; uint64_t max_ram_below_4g;
@ -220,7 +221,7 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
MemoryRegion *region, ram_addr_t size, MemoryRegion *region, ram_addr_t size,
hwaddr mask); hwaddr mask);
void i8042_isa_mouse_fake_event(void *opaque); void i8042_isa_mouse_fake_event(void *opaque);
void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out); void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out);
/* pc.c */ /* pc.c */
extern int fd_bootchk; extern int fd_bootchk;
@ -903,7 +904,6 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
{ \ { \
MachineClass *mc = MACHINE_CLASS(oc); \ MachineClass *mc = MACHINE_CLASS(oc); \
optsfn(mc); \ optsfn(mc); \
mc->name = namestr; \
mc->init = initfn; \ mc->init = initfn; \
} \ } \
static const TypeInfo pc_machine_type_##suffix = { \ static const TypeInfo pc_machine_type_##suffix = { \

View File

@ -480,6 +480,8 @@ struct IDEBus {
uint8_t retry_unit; uint8_t retry_unit;
int64_t retry_sector_num; int64_t retry_sector_num;
uint32_t retry_nsector; uint32_t retry_nsector;
PortioList portio_list;
PortioList portio2_list;
}; };
#define TYPE_IDE_DEVICE "ide-device" #define TYPE_IDE_DEVICE "ide-device"

View File

@ -36,6 +36,8 @@ typedef struct I8257State {
QEMUBH *dma_bh; QEMUBH *dma_bh;
bool dma_bh_scheduled; bool dma_bh_scheduled;
int running; int running;
PortioList portio_page;
PortioList portio_pageh;
} I8257State; } I8257State;
#endif #endif

View File

@ -134,12 +134,15 @@ void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start);
* device and use the legacy portio routines. * device and use the legacy portio routines.
* *
* @dev: the ISADevice against which these are registered; may be NULL. * @dev: the ISADevice against which these are registered; may be NULL.
* @piolist: the PortioList associated with the io ports
* @start: the base I/O port against which the portio->offset is applied. * @start: the base I/O port against which the portio->offset is applied.
* @portio: the ports, sorted by offset. * @portio: the ports, sorted by offset.
* @opaque: passed into the portio callbacks. * @opaque: passed into the portio callbacks.
* @name: passed into memory_region_init_io. * @name: passed into memory_region_init_io.
*/ */
void isa_register_portio_list(ISADevice *dev, uint16_t start, void isa_register_portio_list(ISADevice *dev,
PortioList *piolist,
uint16_t start,
const MemoryRegionPortio *portio, const MemoryRegionPortio *portio,
void *opaque, const char *name); void *opaque, const char *name);

View File

@ -224,7 +224,7 @@ typedef struct BusChild {
struct BusState { struct BusState {
Object obj; Object obj;
DeviceState *parent; DeviceState *parent;
const char *name; char *name;
HotplugHandler *hotplug_handler; HotplugHandler *hotplug_handler;
int max_index; int max_index;
bool realized; bool realized;

View File

@ -71,3 +71,9 @@ GACommandState *ga_command_state_new(void)
cs->groups = NULL; cs->groups = NULL;
return cs; return cs;
} }
void ga_command_state_free(GACommandState *cs)
{
g_slist_free_full(cs->groups, g_free);
g_free(cs);
}

View File

@ -28,6 +28,7 @@ void ga_command_state_add(GACommandState *cs,
void ga_command_state_init_all(GACommandState *cs); void ga_command_state_init_all(GACommandState *cs);
void ga_command_state_cleanup_all(GACommandState *cs); void ga_command_state_cleanup_all(GACommandState *cs);
GACommandState *ga_command_state_new(void); GACommandState *ga_command_state_new(void);
void ga_command_state_free(GACommandState *cs);
bool ga_logging_enabled(GAState *s); bool ga_logging_enabled(GAState *s);
void ga_disable_logging(GAState *s); void ga_disable_logging(GAState *s);
void ga_enable_logging(GAState *s); void ga_enable_logging(GAState *s);

View File

@ -1175,6 +1175,7 @@ static void config_free(GAConfig *config)
#ifdef CONFIG_FSFREEZE #ifdef CONFIG_FSFREEZE
g_free(config->fsfreeze_hook); g_free(config->fsfreeze_hook);
#endif #endif
g_list_free_full(config->blacklist, g_free);
g_free(config); g_free(config);
} }
@ -1310,11 +1311,6 @@ static int run_agent(GAState *s, GAConfig *config)
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
static void free_blacklist_entry(gpointer entry, gpointer unused)
{
g_free(entry);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int ret = EXIT_SUCCESS; int ret = EXIT_SUCCESS;
@ -1375,11 +1371,12 @@ int main(int argc, char **argv)
end: end:
if (s->command_state) { if (s->command_state) {
ga_command_state_cleanup_all(s->command_state); ga_command_state_cleanup_all(s->command_state);
ga_command_state_free(s->command_state);
json_message_parser_destroy(&s->parser);
} }
if (s->channel) { if (s->channel) {
ga_channel_free(s->channel); ga_channel_free(s->channel);
} }
g_list_foreach(config->blacklist, free_blacklist_entry, NULL);
g_free(s->pstate_filepath); g_free(s->pstate_filepath);
g_free(s->state_filepath_isfrozen); g_free(s->state_filepath_isfrozen);
@ -1388,6 +1385,10 @@ end:
} }
config_free(config); config_free(config);
if (s->main_loop) {
g_main_loop_unref(s->main_loop);
}
g_free(s);
return ret; return ret;
} }

View File

@ -76,6 +76,7 @@ static void test_interface_impl(const char *type)
g_assert(iobj); g_assert(iobj);
g_assert(ioc->test == PATTERN); g_assert(ioc->test == PATTERN);
object_unref(obj);
} }
static void interface_direct_test(void) static void interface_direct_test(void)

View File

@ -230,6 +230,13 @@ struct DummyBackendClass {
}; };
static void dummy_dev_finalize(Object *obj)
{
DummyDev *dev = DUMMY_DEV(obj);
object_unref(OBJECT(dev->bus));
}
static void dummy_dev_init(Object *obj) static void dummy_dev_init(Object *obj)
{ {
DummyDev *dev = DUMMY_DEV(obj); DummyDev *dev = DUMMY_DEV(obj);
@ -257,6 +264,13 @@ static void dummy_dev_class_init(ObjectClass *klass, void *opaque)
} }
static void dummy_bus_finalize(Object *obj)
{
DummyBus *bus = DUMMY_BUS(obj);
object_unref(OBJECT(bus->backend));
}
static void dummy_bus_init(Object *obj) static void dummy_bus_init(Object *obj)
{ {
} }
@ -283,6 +297,7 @@ static const TypeInfo dummy_dev_info = {
.parent = TYPE_OBJECT, .parent = TYPE_OBJECT,
.instance_size = sizeof(DummyDev), .instance_size = sizeof(DummyDev),
.instance_init = dummy_dev_init, .instance_init = dummy_dev_init,
.instance_finalize = dummy_dev_finalize,
.class_size = sizeof(DummyDevClass), .class_size = sizeof(DummyDevClass),
.class_init = dummy_dev_class_init, .class_init = dummy_dev_class_init,
}; };
@ -292,6 +307,7 @@ static const TypeInfo dummy_bus_info = {
.parent = TYPE_OBJECT, .parent = TYPE_OBJECT,
.instance_size = sizeof(DummyBus), .instance_size = sizeof(DummyBus),
.instance_init = dummy_bus_init, .instance_init = dummy_bus_init,
.instance_finalize = dummy_bus_finalize,
.class_size = sizeof(DummyBusClass), .class_size = sizeof(DummyBusClass),
.class_init = dummy_bus_class_init, .class_init = dummy_bus_class_init,
}; };

View File

@ -758,6 +758,25 @@ void qtest_add_func(const char *str, void (*fn)(void))
g_free(path); g_free(path);
} }
void qtest_add_data_func_full(const char *str, void *data,
void (*fn)(const void *),
GDestroyNotify data_free_func)
{
gchar *path = g_strdup_printf("/%s/%s", qtest_get_arch(), str);
#if GLIB_CHECK_VERSION(2, 34, 0)
g_test_add_data_func_full(path, data, fn, data_free_func);
#elif GLIB_CHECK_VERSION(2, 26, 0)
/* back-compat casts, remove this once we can require new-enough glib */
g_test_add_vtable(path, 0, data, NULL,
(GTestFixtureFunc)fn, (GTestFixtureFunc) data_free_func);
#else
/* back-compat casts, remove this once we can require new-enough glib */
g_test_add_vtable(path, 0, data, NULL,
(void (*)(void)) fn, (void (*)(void)) data_free_func);
#endif
g_free(path);
}
void qtest_add_data_func(const char *str, const void *data, void qtest_add_data_func(const char *str, const void *data,
void (*fn)(const void *)) void (*fn)(const void *))
{ {

View File

@ -425,6 +425,23 @@ void qtest_add_func(const char *str, void (*fn)(void));
void qtest_add_data_func(const char *str, const void *data, void qtest_add_data_func(const char *str, const void *data,
void (*fn)(const void *)); void (*fn)(const void *));
/**
* qtest_add_data_func_full:
* @str: Test case path.
* @data: Test case data
* @fn: Test case function
* @data_free_func: GDestroyNotify for data
*
* Add a GTester testcase with the given name, data and function.
* The path is prefixed with the architecture under test, as
* returned by qtest_get_arch().
*
* @data is passed to @data_free_func() on test completion.
*/
void qtest_add_data_func_full(const char *str, void *data,
void (*fn)(const void *),
GDestroyNotify data_free_func);
/** /**
* qtest_add: * qtest_add:
* @testpath: Test case path * @testpath: Test case path

View File

@ -14,7 +14,7 @@
#include "qapi/qmp/types.h" #include "qapi/qmp/types.h"
struct PCTestData { struct PCTestData {
const char *machine; char *machine;
const char *cpu_model; const char *cpu_model;
unsigned sockets; unsigned sockets;
unsigned cores; unsigned cores;
@ -71,6 +71,14 @@ static void test_pc_without_cpu_add(gconstpointer data)
g_free(args); g_free(args);
} }
static void test_data_free(gpointer data)
{
PCTestData *pc = data;
g_free(pc->machine);
g_free(pc);
}
static void add_pc_test_cases(void) static void add_pc_test_cases(void)
{ {
QDict *response, *minfo; QDict *response, *minfo;
@ -78,7 +86,8 @@ static void add_pc_test_cases(void)
const QListEntry *p; const QListEntry *p;
QObject *qobj; QObject *qobj;
QString *qstr; QString *qstr;
const char *mname, *path; const char *mname;
char *path;
PCTestData *data; PCTestData *data;
qtest_start("-machine none"); qtest_start("-machine none");
@ -99,7 +108,7 @@ static void add_pc_test_cases(void)
continue; continue;
} }
data = g_malloc(sizeof(PCTestData)); data = g_malloc(sizeof(PCTestData));
data->machine = mname; data->machine = g_strdup(mname);
data->cpu_model = "Haswell"; /* 1.3+ theoretically */ data->cpu_model = "Haswell"; /* 1.3+ theoretically */
data->sockets = 1; data->sockets = 1;
data->cores = 3; data->cores = 3;
@ -119,14 +128,19 @@ static void add_pc_test_cases(void)
path = g_strdup_printf("cpu/%s/init/%ux%ux%u&maxcpus=%u", path = g_strdup_printf("cpu/%s/init/%ux%ux%u&maxcpus=%u",
mname, data->sockets, data->cores, mname, data->sockets, data->cores,
data->threads, data->maxcpus); data->threads, data->maxcpus);
qtest_add_data_func(path, data, test_pc_without_cpu_add); qtest_add_data_func_full(path, data, test_pc_without_cpu_add,
test_data_free);
g_free(path);
} else { } else {
path = g_strdup_printf("cpu/%s/add/%ux%ux%u&maxcpus=%u", path = g_strdup_printf("cpu/%s/add/%ux%ux%u&maxcpus=%u",
mname, data->sockets, data->cores, mname, data->sockets, data->cores,
data->threads, data->maxcpus); data->threads, data->maxcpus);
qtest_add_data_func(path, data, test_pc_with_cpu_add); qtest_add_data_func_full(path, data, test_pc_with_cpu_add,
test_data_free);
g_free(path);
} }
} }
QDECREF(response);
qtest_end(); qtest_end();
} }

View File

@ -176,6 +176,7 @@ static void wait_for_serial(const char *side)
int started = (strcmp(side, "src_serial") == 0 && int started = (strcmp(side, "src_serial") == 0 &&
strcmp(arch, "ppc64") == 0) ? 0 : 1; strcmp(arch, "ppc64") == 0) ? 0 : 1;
g_free(serialpath);
do { do {
int readvalue = fgetc(serialfile); int readvalue = fgetc(serialfile);
@ -203,7 +204,6 @@ static void wait_for_serial(const char *side)
case 'B': case 'B':
/* It's alive! */ /* It's alive! */
fclose(serialfile); fclose(serialfile);
g_free(serialpath);
return; return;
case EOF: case EOF:
@ -260,8 +260,8 @@ static uint64_t get_migration_pass(void)
} else { } else {
rsp_ram = qdict_get_qdict(rsp_return, "ram"); rsp_ram = qdict_get_qdict(rsp_return, "ram");
result = qdict_get_try_int(rsp_ram, "dirty-sync-count", 0); result = qdict_get_try_int(rsp_ram, "dirty-sync-count", 0);
QDECREF(rsp);
} }
QDECREF(rsp);
return result; return result;
} }
@ -350,6 +350,7 @@ static void cleanup(const char *filename)
char *path = g_strdup_printf("%s/%s", tmpfs, filename); char *path = g_strdup_printf("%s/%s", tmpfs, filename);
unlink(path); unlink(path);
g_free(path);
} }
static void test_migrate(void) static void test_migrate(void)
@ -394,6 +395,8 @@ static void test_migrate(void)
g_assert_not_reached(); g_assert_not_reached();
} }
g_free(bootpath);
from = qtest_start(cmd_src); from = qtest_start(cmd_src);
g_free(cmd_src); g_free(cmd_src);

View File

@ -115,7 +115,7 @@ static void add_machine_test_cases(void)
const QListEntry *p; const QListEntry *p;
QObject *qobj; QObject *qobj;
QString *qstr; QString *qstr;
const char *mname, *path; const char *mname;
qtest_start("-machine none"); qtest_start("-machine none");
response = qmp("{ 'execute': 'query-machines' }"); response = qmp("{ 'execute': 'query-machines' }");
@ -132,8 +132,9 @@ static void add_machine_test_cases(void)
g_assert(qstr); g_assert(qstr);
mname = qstring_get_str(qstr); mname = qstring_get_str(qstr);
if (!is_blacklisted(arch, mname)) { if (!is_blacklisted(arch, mname)) {
path = g_strdup_printf("qom/%s", mname); char *path = g_strdup_printf("qom/%s", mname);
qtest_add_data_func(path, g_strdup(mname), test_machine); qtest_add_data_func(path, g_strdup(mname), test_machine);
g_free(path);
} }
} }

View File

@ -378,7 +378,7 @@ static void test_qemu_strtol_hex(void)
static void test_qemu_strtol_max(void) static void test_qemu_strtol_max(void)
{ {
const char *str = g_strdup_printf("%ld", LONG_MAX); char *str = g_strdup_printf("%ld", LONG_MAX);
char f = 'X'; char f = 'X';
const char *endptr = &f; const char *endptr = &f;
long res = 999; long res = 999;
@ -389,6 +389,7 @@ static void test_qemu_strtol_max(void)
g_assert_cmpint(err, ==, 0); g_assert_cmpint(err, ==, 0);
g_assert_cmpint(res, ==, LONG_MAX); g_assert_cmpint(res, ==, LONG_MAX);
g_assert(endptr == str + strlen(str)); g_assert(endptr == str + strlen(str));
g_free(str);
} }
static void test_qemu_strtol_overflow(void) static void test_qemu_strtol_overflow(void)
@ -497,7 +498,7 @@ static void test_qemu_strtol_full_trailing(void)
static void test_qemu_strtol_full_max(void) static void test_qemu_strtol_full_max(void)
{ {
const char *str = g_strdup_printf("%ld", LONG_MAX); char *str = g_strdup_printf("%ld", LONG_MAX);
long res; long res;
int err; int err;
@ -505,6 +506,7 @@ static void test_qemu_strtol_full_max(void)
g_assert_cmpint(err, ==, 0); g_assert_cmpint(err, ==, 0);
g_assert_cmpint(res, ==, LONG_MAX); g_assert_cmpint(res, ==, LONG_MAX);
g_free(str);
} }
static void test_qemu_strtoul_correct(void) static void test_qemu_strtoul_correct(void)
@ -662,7 +664,7 @@ static void test_qemu_strtoul_hex(void)
static void test_qemu_strtoul_max(void) static void test_qemu_strtoul_max(void)
{ {
const char *str = g_strdup_printf("%lu", ULONG_MAX); char *str = g_strdup_printf("%lu", ULONG_MAX);
char f = 'X'; char f = 'X';
const char *endptr = &f; const char *endptr = &f;
unsigned long res = 999; unsigned long res = 999;
@ -673,6 +675,7 @@ static void test_qemu_strtoul_max(void)
g_assert_cmpint(err, ==, 0); g_assert_cmpint(err, ==, 0);
g_assert_cmpint(res, ==, ULONG_MAX); g_assert_cmpint(res, ==, ULONG_MAX);
g_assert(endptr == str + strlen(str)); g_assert(endptr == str + strlen(str));
g_free(str);
} }
static void test_qemu_strtoul_overflow(void) static void test_qemu_strtoul_overflow(void)
@ -776,7 +779,7 @@ static void test_qemu_strtoul_full_trailing(void)
static void test_qemu_strtoul_full_max(void) static void test_qemu_strtoul_full_max(void)
{ {
const char *str = g_strdup_printf("%lu", ULONG_MAX); char *str = g_strdup_printf("%lu", ULONG_MAX);
unsigned long res = 999; unsigned long res = 999;
int err; int err;
@ -784,6 +787,7 @@ static void test_qemu_strtoul_full_max(void)
g_assert_cmpint(err, ==, 0); g_assert_cmpint(err, ==, 0);
g_assert_cmpint(res, ==, ULONG_MAX); g_assert_cmpint(res, ==, ULONG_MAX);
g_free(str);
} }
static void test_qemu_strtoll_correct(void) static void test_qemu_strtoll_correct(void)
@ -941,7 +945,7 @@ static void test_qemu_strtoll_hex(void)
static void test_qemu_strtoll_max(void) static void test_qemu_strtoll_max(void)
{ {
const char *str = g_strdup_printf("%lld", LLONG_MAX); char *str = g_strdup_printf("%lld", LLONG_MAX);
char f = 'X'; char f = 'X';
const char *endptr = &f; const char *endptr = &f;
int64_t res = 999; int64_t res = 999;
@ -952,6 +956,7 @@ static void test_qemu_strtoll_max(void)
g_assert_cmpint(err, ==, 0); g_assert_cmpint(err, ==, 0);
g_assert_cmpint(res, ==, LLONG_MAX); g_assert_cmpint(res, ==, LLONG_MAX);
g_assert(endptr == str + strlen(str)); g_assert(endptr == str + strlen(str));
g_free(str);
} }
static void test_qemu_strtoll_overflow(void) static void test_qemu_strtoll_overflow(void)
@ -1058,7 +1063,7 @@ static void test_qemu_strtoll_full_trailing(void)
static void test_qemu_strtoll_full_max(void) static void test_qemu_strtoll_full_max(void)
{ {
const char *str = g_strdup_printf("%lld", LLONG_MAX); char *str = g_strdup_printf("%lld", LLONG_MAX);
int64_t res; int64_t res;
int err; int err;
@ -1066,6 +1071,7 @@ static void test_qemu_strtoll_full_max(void)
g_assert_cmpint(err, ==, 0); g_assert_cmpint(err, ==, 0);
g_assert_cmpint(res, ==, LLONG_MAX); g_assert_cmpint(res, ==, LLONG_MAX);
g_free(str);
} }
static void test_qemu_strtoull_correct(void) static void test_qemu_strtoull_correct(void)
@ -1223,7 +1229,7 @@ static void test_qemu_strtoull_hex(void)
static void test_qemu_strtoull_max(void) static void test_qemu_strtoull_max(void)
{ {
const char *str = g_strdup_printf("%llu", ULLONG_MAX); char *str = g_strdup_printf("%llu", ULLONG_MAX);
char f = 'X'; char f = 'X';
const char *endptr = &f; const char *endptr = &f;
uint64_t res = 999; uint64_t res = 999;
@ -1234,6 +1240,7 @@ static void test_qemu_strtoull_max(void)
g_assert_cmpint(err, ==, 0); g_assert_cmpint(err, ==, 0);
g_assert_cmpint(res, ==, ULLONG_MAX); g_assert_cmpint(res, ==, ULLONG_MAX);
g_assert(endptr == str + strlen(str)); g_assert(endptr == str + strlen(str));
g_free(str);
} }
static void test_qemu_strtoull_overflow(void) static void test_qemu_strtoull_overflow(void)
@ -1339,7 +1346,7 @@ static void test_qemu_strtoull_full_trailing(void)
static void test_qemu_strtoull_full_max(void) static void test_qemu_strtoull_full_max(void)
{ {
const char *str = g_strdup_printf("%lld", ULLONG_MAX); char *str = g_strdup_printf("%lld", ULLONG_MAX);
uint64_t res = 999; uint64_t res = 999;
int err; int err;
@ -1347,6 +1354,7 @@ static void test_qemu_strtoull_full_max(void)
g_assert_cmpint(err, ==, 0); g_assert_cmpint(err, ==, 0);
g_assert_cmpint(res, ==, ULLONG_MAX); g_assert_cmpint(res, ==, ULLONG_MAX);
g_free(str);
} }
static void test_qemu_strtosz_simple(void) static void test_qemu_strtosz_simple(void)

View File

@ -208,6 +208,9 @@ static void test_io(void)
} while(k < j); } while(k < j);
} }
} }
iov_free(iov, niov);
g_free(buf);
g_free(siov);
exit(0); exit(0);
} else { } else {
@ -246,6 +249,10 @@ static void test_io(void)
test_iov_bytes(iov, niov, i, j - i); test_iov_bytes(iov, niov, i, j - i);
} }
} }
iov_free(iov, niov);
g_free(buf);
g_free(siov);
} }
#endif #endif
} }

View File

@ -398,6 +398,7 @@ static void test_qga_file_ops(gconstpointer fix)
/* check content */ /* check content */
path = g_build_filename(fixture->test_dir, "foo", NULL); path = g_build_filename(fixture->test_dir, "foo", NULL);
f = fopen(path, "r"); f = fopen(path, "r");
g_free(path);
g_assert_nonnull(f); g_assert_nonnull(f);
count = fread(tmp, 1, sizeof(tmp), f); count = fread(tmp, 1, sizeof(tmp), f);
g_assert_cmpint(count, ==, sizeof(helloworld)); g_assert_cmpint(count, ==, sizeof(helloworld));
@ -700,7 +701,9 @@ static void test_qga_config(gconstpointer data)
cwd = g_get_current_dir(); cwd = g_get_current_dir();
cmd = g_strdup_printf("%s%cqemu-ga -D", cmd = g_strdup_printf("%s%cqemu-ga -D",
cwd, G_DIR_SEPARATOR); cwd, G_DIR_SEPARATOR);
g_free(cwd);
g_shell_parse_argv(cmd, NULL, &argv, &error); g_shell_parse_argv(cmd, NULL, &argv, &error);
g_free(cmd);
g_assert_no_error(error); g_assert_no_error(error);
env[0] = g_strdup_printf("QGA_CONF=tests%cdata%ctest-qga-config", env[0] = g_strdup_printf("QGA_CONF=tests%cdata%ctest-qga-config",
@ -708,6 +711,8 @@ static void test_qga_config(gconstpointer data)
env[1] = NULL; env[1] = NULL;
g_spawn_sync(NULL, argv, env, 0, g_spawn_sync(NULL, argv, env, 0,
NULL, NULL, &out, &err, &status, &error); NULL, NULL, &out, &err, &status, &error);
g_strfreev(argv);
g_assert_no_error(error); g_assert_no_error(error);
g_assert_cmpstr(err, ==, ""); g_assert_cmpstr(err, ==, "");
g_assert_cmpint(status, ==, 0); g_assert_cmpint(status, ==, 0);

View File

@ -228,6 +228,7 @@ static void test_visitor_in_fuzz(TestInputVisitorData *data,
v = visitor_input_test_init(data, buf); v = visitor_input_test_init(data, buf);
visit_type_intList(v, NULL, &ilres, NULL); visit_type_intList(v, NULL, &ilres, NULL);
qapi_free_intList(ilres);
visitor_input_teardown(data, NULL); visitor_input_teardown(data, NULL);
v = visitor_input_test_init(data, buf); v = visitor_input_test_init(data, buf);

View File

@ -50,16 +50,20 @@ static QEMUFile *open_test_file(bool write)
{ {
int fd = dup(temp_fd); int fd = dup(temp_fd);
QIOChannel *ioc; QIOChannel *ioc;
QEMUFile *f;
lseek(fd, 0, SEEK_SET); lseek(fd, 0, SEEK_SET);
if (write) { if (write) {
g_assert_cmpint(ftruncate(fd, 0), ==, 0); g_assert_cmpint(ftruncate(fd, 0), ==, 0);
} }
ioc = QIO_CHANNEL(qio_channel_file_new_fd(fd)); ioc = QIO_CHANNEL(qio_channel_file_new_fd(fd));
if (write) { if (write) {
return qemu_fopen_channel_output(ioc); f = qemu_fopen_channel_output(ioc);
} else { } else {
return qemu_fopen_channel_input(ioc); f = qemu_fopen_channel_input(ioc);
} }
object_unref(OBJECT(ioc));
return f;
} }
#define SUCCESS(val) \ #define SUCCESS(val) \