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:
commit
33e60e0198
|
@ -60,6 +60,8 @@ typedef struct GUSState {
|
|||
int64_t last_ticks;
|
||||
qemu_irq pic;
|
||||
IsaDma *isa_dma;
|
||||
PortioList portio_list1;
|
||||
PortioList portio_list2;
|
||||
} GUSState;
|
||||
|
||||
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->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->port + 0x100) & 0xf00,
|
||||
gus_portio_list2, s, "gus");
|
||||
isa_register_portio_list(d, &s->portio_list1, s->port,
|
||||
gus_portio_list1, 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);
|
||||
k = ISADMA_GET_CLASS(s->isa_dma);
|
||||
|
|
|
@ -106,6 +106,7 @@ typedef struct SB16State {
|
|||
/* mixer state */
|
||||
int mixer_nreg;
|
||||
uint8_t mixer_regs[256];
|
||||
PortioList portio_list;
|
||||
} SB16State;
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
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);
|
||||
k = ISADMA_GET_CLASS(s->isa_hdma);
|
||||
|
|
|
@ -692,6 +692,7 @@ struct FDCtrl {
|
|||
/* Timers state */
|
||||
uint8_t timer0;
|
||||
uint8_t timer1;
|
||||
PortioList portio_list;
|
||||
};
|
||||
|
||||
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;
|
||||
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");
|
||||
|
||||
isa_init_irq(isadev, &fdctrl->irq, isa->irq);
|
||||
|
|
|
@ -80,6 +80,7 @@ typedef struct ParallelState {
|
|||
uint32_t last_read_offset; /* For debugging */
|
||||
/* Memory-mapped interface */
|
||||
int it_shift;
|
||||
PortioList portio_list;
|
||||
} ParallelState;
|
||||
|
||||
#define TYPE_ISA_PARALLEL "isa-parallel"
|
||||
|
@ -532,7 +533,7 @@ static void parallel_isa_realizefn(DeviceState *dev, Error **errp)
|
|||
s->status = dummy;
|
||||
}
|
||||
|
||||
isa_register_portio_list(isadev, base,
|
||||
isa_register_portio_list(isadev, &s->portio_list, base,
|
||||
(s->hw_driver
|
||||
? &isa_parallel_portio_hw_list[0]
|
||||
: &isa_parallel_portio_sw_list[0]),
|
||||
|
|
|
@ -78,8 +78,7 @@ static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
|
|||
{
|
||||
const char *typename = object_get_typename(OBJECT(bus));
|
||||
BusClass *bc;
|
||||
char *buf;
|
||||
int i, len, bus_id;
|
||||
int i, bus_id;
|
||||
|
||||
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) {
|
||||
/* parent device has id -> use it plus parent-bus-id for bus name */
|
||||
bus_id = bus->parent->num_child_bus;
|
||||
|
||||
len = strlen(bus->parent->id) + 16;
|
||||
buf = g_malloc(len);
|
||||
snprintf(buf, len, "%s.%d", bus->parent->id, bus_id);
|
||||
bus->name = buf;
|
||||
bus->name = g_strdup_printf("%s.%d", bus->parent->id, bus_id);
|
||||
} else {
|
||||
/* no id -> use lowercase bus type plus global bus-id for bus name */
|
||||
bc = BUS_GET_CLASS(bus);
|
||||
bus_id = bc->automatic_ids++;
|
||||
|
||||
len = strlen(typename) + 16;
|
||||
buf = g_malloc(len);
|
||||
len = snprintf(buf, len, "%s.%d", typename, bus_id);
|
||||
for (i = 0; i < len; i++) {
|
||||
buf[i] = qemu_tolower(buf[i]);
|
||||
bus->name = g_strdup_printf("%s.%d", typename, bus_id);
|
||||
for (i = 0; bus->name[i]; i++) {
|
||||
bus->name[i] = qemu_tolower(bus->name[i]);
|
||||
}
|
||||
bus->name = buf;
|
||||
}
|
||||
|
||||
if (bus->parent) {
|
||||
|
@ -229,7 +220,7 @@ static void qbus_finalize(Object *obj)
|
|||
{
|
||||
BusState *bus = BUS(obj);
|
||||
|
||||
g_free((char *)bus->name);
|
||||
g_free(bus->name);
|
||||
}
|
||||
|
||||
static const TypeInfo bus_info = {
|
||||
|
|
|
@ -561,6 +561,7 @@ static void machine_class_finalize(ObjectClass *klass, void *data)
|
|||
if (mc->compat_props) {
|
||||
g_array_free(mc->compat_props, true);
|
||||
}
|
||||
g_free(mc->name);
|
||||
}
|
||||
|
||||
void machine_register_compat_props(MachineState *machine)
|
||||
|
|
|
@ -39,6 +39,8 @@ typedef struct ISAVGAState {
|
|||
ISADevice parent_obj;
|
||||
|
||||
struct VGACommonState state;
|
||||
PortioList portio_vga;
|
||||
PortioList portio_vbe;
|
||||
} ISAVGAState;
|
||||
|
||||
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);
|
||||
s->legacy_address_space = isa_address_space(isadev);
|
||||
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) {
|
||||
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),
|
||||
0x000a0000,
|
||||
|
|
|
@ -553,10 +553,12 @@ static void i8257_realize(DeviceState *dev, Error **errp)
|
|||
memory_region_add_subregion(isa_address_space_io(isa),
|
||||
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");
|
||||
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");
|
||||
}
|
||||
|
||||
|
|
|
@ -789,7 +789,7 @@ static gint crs_range_compare(gconstpointer a, gconstpointer b)
|
|||
static void crs_replace_with_free_ranges(GPtrArray *ranges,
|
||||
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;
|
||||
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_free(free_ranges, false);
|
||||
g_ptr_array_free(free_ranges, true);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -530,9 +530,9 @@ static uint64_t port92_read(void *opaque, hwaddr addr,
|
|||
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 = {
|
||||
|
@ -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);
|
||||
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) {
|
||||
vmport_init(isa_bus);
|
||||
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);
|
||||
}
|
||||
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);
|
||||
|
||||
|
|
|
@ -74,7 +74,6 @@ static void pc_init1(MachineState *machine,
|
|||
ISABus *isa_bus;
|
||||
PCII440FXState *i440fx_state;
|
||||
int piix3_devfn = -1;
|
||||
qemu_irq *gsi;
|
||||
qemu_irq *i8259;
|
||||
qemu_irq smi_irq;
|
||||
GSIState *gsi_state;
|
||||
|
@ -185,16 +184,16 @@ static void pc_init1(MachineState *machine,
|
|||
gsi_state = g_malloc0(sizeof(*gsi_state));
|
||||
if (kvm_ioapic_in_kernel()) {
|
||||
kvm_pc_setup_irq_routing(pcmc->pci_enabled);
|
||||
gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
|
||||
GSI_NUM_PINS);
|
||||
pcms->gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
|
||||
GSI_NUM_PINS);
|
||||
} 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) {
|
||||
pci_bus = i440fx_init(host_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,
|
||||
pcms->below_4g_mem_size,
|
||||
pcms->above_4g_mem_size,
|
||||
|
@ -207,7 +206,7 @@ static void pc_init1(MachineState *machine,
|
|||
&error_abort);
|
||||
no_hpet = 1;
|
||||
}
|
||||
isa_bus_irqs(isa_bus, gsi);
|
||||
isa_bus_irqs(isa_bus, pcms->gsi);
|
||||
|
||||
if (kvm_pic_in_kernel()) {
|
||||
i8259 = kvm_i8259_init(isa_bus);
|
||||
|
@ -225,7 +224,7 @@ static void pc_init1(MachineState *machine,
|
|||
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);
|
||||
|
||||
|
@ -235,7 +234,7 @@ static void pc_init1(MachineState *machine,
|
|||
}
|
||||
|
||||
/* 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);
|
||||
|
||||
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);
|
||||
/* TODO: Populate SPD eeprom data. */
|
||||
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),
|
||||
&piix4_pm);
|
||||
smbus_eeprom_init(smbus, 8, NULL, 0);
|
||||
|
|
|
@ -69,7 +69,6 @@ static void pc_q35_init(MachineState *machine)
|
|||
MemoryRegion *ram_memory;
|
||||
GSIState *gsi_state;
|
||||
ISABus *isa_bus;
|
||||
qemu_irq *gsi;
|
||||
qemu_irq *i8259;
|
||||
int i;
|
||||
ICH9LPCState *ich9_lpc;
|
||||
|
@ -153,10 +152,10 @@ static void pc_q35_init(MachineState *machine)
|
|||
gsi_state = g_malloc0(sizeof(*gsi_state));
|
||||
if (kvm_ioapic_in_kernel()) {
|
||||
kvm_pc_setup_irq_routing(pcmc->pci_enabled);
|
||||
gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
|
||||
GSI_NUM_PINS);
|
||||
pcms->gsi = qemu_allocate_irqs(kvm_pc_gsi_handler, gsi_state,
|
||||
GSI_NUM_PINS);
|
||||
} 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 */
|
||||
|
@ -195,7 +194,7 @@ static void pc_q35_init(MachineState *machine)
|
|||
ich9_lpc = ICH9_LPC_DEVICE(lpc);
|
||||
lpc_dev = DEVICE(lpc);
|
||||
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,
|
||||
ICH9_LPC_NB_PIRQS);
|
||||
|
@ -213,11 +212,13 @@ static void pc_q35_init(MachineState *machine)
|
|||
for (i = 0; i < ISA_NUM_IRQS; i++) {
|
||||
gsi_state->i8259_irq[i] = i8259[i];
|
||||
}
|
||||
g_free(i8259);
|
||||
|
||||
if (pcmc->pci_enabled) {
|
||||
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);
|
||||
if (pcms->vmport == ON_OFF_AUTO_AUTO) {
|
||||
|
@ -225,7 +226,7 @@ static void pc_q35_init(MachineState *machine)
|
|||
}
|
||||
|
||||
/* 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);
|
||||
|
||||
/* connect pm stuff to lpc */
|
||||
|
|
|
@ -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
|
||||
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) {
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -499,9 +499,9 @@ void i8042_isa_mouse_fake_event(void *opaque)
|
|||
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 = {
|
||||
|
|
|
@ -487,6 +487,14 @@ static void ipmi_bmc_extern_init(Object *obj)
|
|||
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[] = {
|
||||
DEFINE_PROP_CHR("chardev", IPMIBmcExtern, chr),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
|
@ -508,6 +516,7 @@ static const TypeInfo ipmi_bmc_extern_type = {
|
|||
.parent = TYPE_IPMI_BMC,
|
||||
.instance_size = sizeof(IPMIBmcExtern),
|
||||
.instance_init = ipmi_bmc_extern_init,
|
||||
.instance_finalize = ipmi_bmc_extern_finalize,
|
||||
.class_init = ipmi_bmc_extern_class_init,
|
||||
};
|
||||
|
||||
|
|
|
@ -131,24 +131,20 @@ void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t 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,
|
||||
void *opaque, const char *name)
|
||||
{
|
||||
PortioList piolist;
|
||||
assert(piolist && !piolist->owner);
|
||||
|
||||
/* START is how we should treat DEV, regardless of the actual
|
||||
contents of the portio array. This is how the old code
|
||||
actually handled e.g. the FDC device. */
|
||||
isa_init_ioport(dev, start);
|
||||
|
||||
/* FIXME: the device should store created PortioList in its state. Note
|
||||
that DEV can be NULL here and that single device can register several
|
||||
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);
|
||||
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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
SDState *sd = SD_CARD(dev);
|
||||
|
@ -1927,6 +1935,7 @@ static const TypeInfo sd_info = {
|
|||
.class_size = sizeof(SDCardClass),
|
||||
.class_init = sd_class_init,
|
||||
.instance_init = sd_instance_init,
|
||||
.instance_finalize = sd_instance_finalize,
|
||||
};
|
||||
|
||||
static void sd_register_types(void)
|
||||
|
|
|
@ -280,4 +280,28 @@ static inline void g_hash_table_add(GHashTable *hash_table, gpointer key)
|
|||
} while (0)
|
||||
#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
|
||||
|
|
|
@ -93,7 +93,7 @@ struct MachineClass {
|
|||
/*< public >*/
|
||||
|
||||
const char *family; /* NULL iff @name identifies a standalone machtype */
|
||||
const char *name;
|
||||
char *name;
|
||||
const char *alias;
|
||||
const char *desc;
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@ struct PCMachineState {
|
|||
ISADevice *rtc;
|
||||
PCIBus *bus;
|
||||
FWCfgState *fw_cfg;
|
||||
qemu_irq *gsi;
|
||||
|
||||
/* Configuration options: */
|
||||
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,
|
||||
hwaddr mask);
|
||||
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 */
|
||||
extern int fd_bootchk;
|
||||
|
@ -903,7 +904,6 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
|
|||
{ \
|
||||
MachineClass *mc = MACHINE_CLASS(oc); \
|
||||
optsfn(mc); \
|
||||
mc->name = namestr; \
|
||||
mc->init = initfn; \
|
||||
} \
|
||||
static const TypeInfo pc_machine_type_##suffix = { \
|
||||
|
|
|
@ -480,6 +480,8 @@ struct IDEBus {
|
|||
uint8_t retry_unit;
|
||||
int64_t retry_sector_num;
|
||||
uint32_t retry_nsector;
|
||||
PortioList portio_list;
|
||||
PortioList portio2_list;
|
||||
};
|
||||
|
||||
#define TYPE_IDE_DEVICE "ide-device"
|
||||
|
|
|
@ -36,6 +36,8 @@ typedef struct I8257State {
|
|||
QEMUBH *dma_bh;
|
||||
bool dma_bh_scheduled;
|
||||
int running;
|
||||
PortioList portio_page;
|
||||
PortioList portio_pageh;
|
||||
} I8257State;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -134,12 +134,15 @@ void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start);
|
|||
* device and use the legacy portio routines.
|
||||
*
|
||||
* @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.
|
||||
* @portio: the ports, sorted by offset.
|
||||
* @opaque: passed into the portio callbacks.
|
||||
* @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,
|
||||
void *opaque, const char *name);
|
||||
|
||||
|
|
|
@ -224,7 +224,7 @@ typedef struct BusChild {
|
|||
struct BusState {
|
||||
Object obj;
|
||||
DeviceState *parent;
|
||||
const char *name;
|
||||
char *name;
|
||||
HotplugHandler *hotplug_handler;
|
||||
int max_index;
|
||||
bool realized;
|
||||
|
|
|
@ -71,3 +71,9 @@ GACommandState *ga_command_state_new(void)
|
|||
cs->groups = NULL;
|
||||
return cs;
|
||||
}
|
||||
|
||||
void ga_command_state_free(GACommandState *cs)
|
||||
{
|
||||
g_slist_free_full(cs->groups, g_free);
|
||||
g_free(cs);
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ void ga_command_state_add(GACommandState *cs,
|
|||
void ga_command_state_init_all(GACommandState *cs);
|
||||
void ga_command_state_cleanup_all(GACommandState *cs);
|
||||
GACommandState *ga_command_state_new(void);
|
||||
void ga_command_state_free(GACommandState *cs);
|
||||
bool ga_logging_enabled(GAState *s);
|
||||
void ga_disable_logging(GAState *s);
|
||||
void ga_enable_logging(GAState *s);
|
||||
|
|
13
qga/main.c
13
qga/main.c
|
@ -1175,6 +1175,7 @@ static void config_free(GAConfig *config)
|
|||
#ifdef CONFIG_FSFREEZE
|
||||
g_free(config->fsfreeze_hook);
|
||||
#endif
|
||||
g_list_free_full(config->blacklist, g_free);
|
||||
g_free(config);
|
||||
}
|
||||
|
||||
|
@ -1310,11 +1311,6 @@ static int run_agent(GAState *s, GAConfig *config)
|
|||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
static void free_blacklist_entry(gpointer entry, gpointer unused)
|
||||
{
|
||||
g_free(entry);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret = EXIT_SUCCESS;
|
||||
|
@ -1375,11 +1371,12 @@ int main(int argc, char **argv)
|
|||
end:
|
||||
if (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) {
|
||||
ga_channel_free(s->channel);
|
||||
}
|
||||
g_list_foreach(config->blacklist, free_blacklist_entry, NULL);
|
||||
g_free(s->pstate_filepath);
|
||||
g_free(s->state_filepath_isfrozen);
|
||||
|
||||
|
@ -1388,6 +1385,10 @@ end:
|
|||
}
|
||||
|
||||
config_free(config);
|
||||
if (s->main_loop) {
|
||||
g_main_loop_unref(s->main_loop);
|
||||
}
|
||||
g_free(s);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -76,6 +76,7 @@ static void test_interface_impl(const char *type)
|
|||
|
||||
g_assert(iobj);
|
||||
g_assert(ioc->test == PATTERN);
|
||||
object_unref(obj);
|
||||
}
|
||||
|
||||
static void interface_direct_test(void)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
}
|
||||
|
@ -283,6 +297,7 @@ static const TypeInfo dummy_dev_info = {
|
|||
.parent = TYPE_OBJECT,
|
||||
.instance_size = sizeof(DummyDev),
|
||||
.instance_init = dummy_dev_init,
|
||||
.instance_finalize = dummy_dev_finalize,
|
||||
.class_size = sizeof(DummyDevClass),
|
||||
.class_init = dummy_dev_class_init,
|
||||
};
|
||||
|
@ -292,6 +307,7 @@ static const TypeInfo dummy_bus_info = {
|
|||
.parent = TYPE_OBJECT,
|
||||
.instance_size = sizeof(DummyBus),
|
||||
.instance_init = dummy_bus_init,
|
||||
.instance_finalize = dummy_bus_finalize,
|
||||
.class_size = sizeof(DummyBusClass),
|
||||
.class_init = dummy_bus_class_init,
|
||||
};
|
||||
|
|
|
@ -758,6 +758,25 @@ void qtest_add_func(const char *str, void (*fn)(void))
|
|||
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 (*fn)(const void *))
|
||||
{
|
||||
|
|
|
@ -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 (*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:
|
||||
* @testpath: Test case path
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#include "qapi/qmp/types.h"
|
||||
|
||||
struct PCTestData {
|
||||
const char *machine;
|
||||
char *machine;
|
||||
const char *cpu_model;
|
||||
unsigned sockets;
|
||||
unsigned cores;
|
||||
|
@ -71,6 +71,14 @@ static void test_pc_without_cpu_add(gconstpointer data)
|
|||
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)
|
||||
{
|
||||
QDict *response, *minfo;
|
||||
|
@ -78,7 +86,8 @@ static void add_pc_test_cases(void)
|
|||
const QListEntry *p;
|
||||
QObject *qobj;
|
||||
QString *qstr;
|
||||
const char *mname, *path;
|
||||
const char *mname;
|
||||
char *path;
|
||||
PCTestData *data;
|
||||
|
||||
qtest_start("-machine none");
|
||||
|
@ -99,7 +108,7 @@ static void add_pc_test_cases(void)
|
|||
continue;
|
||||
}
|
||||
data = g_malloc(sizeof(PCTestData));
|
||||
data->machine = mname;
|
||||
data->machine = g_strdup(mname);
|
||||
data->cpu_model = "Haswell"; /* 1.3+ theoretically */
|
||||
data->sockets = 1;
|
||||
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",
|
||||
mname, data->sockets, data->cores,
|
||||
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 {
|
||||
path = g_strdup_printf("cpu/%s/add/%ux%ux%u&maxcpus=%u",
|
||||
mname, data->sockets, data->cores,
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
@ -176,6 +176,7 @@ static void wait_for_serial(const char *side)
|
|||
int started = (strcmp(side, "src_serial") == 0 &&
|
||||
strcmp(arch, "ppc64") == 0) ? 0 : 1;
|
||||
|
||||
g_free(serialpath);
|
||||
do {
|
||||
int readvalue = fgetc(serialfile);
|
||||
|
||||
|
@ -203,7 +204,6 @@ static void wait_for_serial(const char *side)
|
|||
case 'B':
|
||||
/* It's alive! */
|
||||
fclose(serialfile);
|
||||
g_free(serialpath);
|
||||
return;
|
||||
|
||||
case EOF:
|
||||
|
@ -260,8 +260,8 @@ static uint64_t get_migration_pass(void)
|
|||
} else {
|
||||
rsp_ram = qdict_get_qdict(rsp_return, "ram");
|
||||
result = qdict_get_try_int(rsp_ram, "dirty-sync-count", 0);
|
||||
QDECREF(rsp);
|
||||
}
|
||||
QDECREF(rsp);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -350,6 +350,7 @@ static void cleanup(const char *filename)
|
|||
char *path = g_strdup_printf("%s/%s", tmpfs, filename);
|
||||
|
||||
unlink(path);
|
||||
g_free(path);
|
||||
}
|
||||
|
||||
static void test_migrate(void)
|
||||
|
@ -394,6 +395,8 @@ static void test_migrate(void)
|
|||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
g_free(bootpath);
|
||||
|
||||
from = qtest_start(cmd_src);
|
||||
g_free(cmd_src);
|
||||
|
||||
|
|
|
@ -115,7 +115,7 @@ static void add_machine_test_cases(void)
|
|||
const QListEntry *p;
|
||||
QObject *qobj;
|
||||
QString *qstr;
|
||||
const char *mname, *path;
|
||||
const char *mname;
|
||||
|
||||
qtest_start("-machine none");
|
||||
response = qmp("{ 'execute': 'query-machines' }");
|
||||
|
@ -132,8 +132,9 @@ static void add_machine_test_cases(void)
|
|||
g_assert(qstr);
|
||||
mname = qstring_get_str(qstr);
|
||||
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);
|
||||
g_free(path);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -378,7 +378,7 @@ static void test_qemu_strtol_hex(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';
|
||||
const char *endptr = &f;
|
||||
long res = 999;
|
||||
|
@ -389,6 +389,7 @@ static void test_qemu_strtol_max(void)
|
|||
g_assert_cmpint(err, ==, 0);
|
||||
g_assert_cmpint(res, ==, LONG_MAX);
|
||||
g_assert(endptr == str + strlen(str));
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
const char *str = g_strdup_printf("%ld", LONG_MAX);
|
||||
char *str = g_strdup_printf("%ld", LONG_MAX);
|
||||
long res;
|
||||
int err;
|
||||
|
||||
|
@ -505,6 +506,7 @@ static void test_qemu_strtol_full_max(void)
|
|||
|
||||
g_assert_cmpint(err, ==, 0);
|
||||
g_assert_cmpint(res, ==, LONG_MAX);
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
const char *str = g_strdup_printf("%lu", ULONG_MAX);
|
||||
char *str = g_strdup_printf("%lu", ULONG_MAX);
|
||||
char f = 'X';
|
||||
const char *endptr = &f;
|
||||
unsigned long res = 999;
|
||||
|
@ -673,6 +675,7 @@ static void test_qemu_strtoul_max(void)
|
|||
g_assert_cmpint(err, ==, 0);
|
||||
g_assert_cmpint(res, ==, ULONG_MAX);
|
||||
g_assert(endptr == str + strlen(str));
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
const char *str = g_strdup_printf("%lu", ULONG_MAX);
|
||||
char *str = g_strdup_printf("%lu", ULONG_MAX);
|
||||
unsigned long res = 999;
|
||||
int err;
|
||||
|
||||
|
@ -784,6 +787,7 @@ static void test_qemu_strtoul_full_max(void)
|
|||
|
||||
g_assert_cmpint(err, ==, 0);
|
||||
g_assert_cmpint(res, ==, ULONG_MAX);
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
const char *str = g_strdup_printf("%lld", LLONG_MAX);
|
||||
char *str = g_strdup_printf("%lld", LLONG_MAX);
|
||||
char f = 'X';
|
||||
const char *endptr = &f;
|
||||
int64_t res = 999;
|
||||
|
@ -952,6 +956,7 @@ static void test_qemu_strtoll_max(void)
|
|||
g_assert_cmpint(err, ==, 0);
|
||||
g_assert_cmpint(res, ==, LLONG_MAX);
|
||||
g_assert(endptr == str + strlen(str));
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
const char *str = g_strdup_printf("%lld", LLONG_MAX);
|
||||
char *str = g_strdup_printf("%lld", LLONG_MAX);
|
||||
int64_t res;
|
||||
int err;
|
||||
|
||||
|
@ -1066,6 +1071,7 @@ static void test_qemu_strtoll_full_max(void)
|
|||
|
||||
g_assert_cmpint(err, ==, 0);
|
||||
g_assert_cmpint(res, ==, LLONG_MAX);
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
const char *str = g_strdup_printf("%llu", ULLONG_MAX);
|
||||
char *str = g_strdup_printf("%llu", ULLONG_MAX);
|
||||
char f = 'X';
|
||||
const char *endptr = &f;
|
||||
uint64_t res = 999;
|
||||
|
@ -1234,6 +1240,7 @@ static void test_qemu_strtoull_max(void)
|
|||
g_assert_cmpint(err, ==, 0);
|
||||
g_assert_cmpint(res, ==, ULLONG_MAX);
|
||||
g_assert(endptr == str + strlen(str));
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
const char *str = g_strdup_printf("%lld", ULLONG_MAX);
|
||||
char *str = g_strdup_printf("%lld", ULLONG_MAX);
|
||||
uint64_t res = 999;
|
||||
int err;
|
||||
|
||||
|
@ -1347,6 +1354,7 @@ static void test_qemu_strtoull_full_max(void)
|
|||
|
||||
g_assert_cmpint(err, ==, 0);
|
||||
g_assert_cmpint(res, ==, ULLONG_MAX);
|
||||
g_free(str);
|
||||
}
|
||||
|
||||
static void test_qemu_strtosz_simple(void)
|
||||
|
|
|
@ -208,6 +208,9 @@ static void test_io(void)
|
|||
} while(k < j);
|
||||
}
|
||||
}
|
||||
iov_free(iov, niov);
|
||||
g_free(buf);
|
||||
g_free(siov);
|
||||
exit(0);
|
||||
|
||||
} else {
|
||||
|
@ -246,6 +249,10 @@ static void test_io(void)
|
|||
test_iov_bytes(iov, niov, i, j - i);
|
||||
}
|
||||
}
|
||||
|
||||
iov_free(iov, niov);
|
||||
g_free(buf);
|
||||
g_free(siov);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -398,6 +398,7 @@ static void test_qga_file_ops(gconstpointer fix)
|
|||
/* check content */
|
||||
path = g_build_filename(fixture->test_dir, "foo", NULL);
|
||||
f = fopen(path, "r");
|
||||
g_free(path);
|
||||
g_assert_nonnull(f);
|
||||
count = fread(tmp, 1, sizeof(tmp), f);
|
||||
g_assert_cmpint(count, ==, sizeof(helloworld));
|
||||
|
@ -700,7 +701,9 @@ static void test_qga_config(gconstpointer data)
|
|||
cwd = g_get_current_dir();
|
||||
cmd = g_strdup_printf("%s%cqemu-ga -D",
|
||||
cwd, G_DIR_SEPARATOR);
|
||||
g_free(cwd);
|
||||
g_shell_parse_argv(cmd, NULL, &argv, &error);
|
||||
g_free(cmd);
|
||||
g_assert_no_error(error);
|
||||
|
||||
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;
|
||||
g_spawn_sync(NULL, argv, env, 0,
|
||||
NULL, NULL, &out, &err, &status, &error);
|
||||
g_strfreev(argv);
|
||||
|
||||
g_assert_no_error(error);
|
||||
g_assert_cmpstr(err, ==, "");
|
||||
g_assert_cmpint(status, ==, 0);
|
||||
|
|
|
@ -228,6 +228,7 @@ static void test_visitor_in_fuzz(TestInputVisitorData *data,
|
|||
|
||||
v = visitor_input_test_init(data, buf);
|
||||
visit_type_intList(v, NULL, &ilres, NULL);
|
||||
qapi_free_intList(ilres);
|
||||
visitor_input_teardown(data, NULL);
|
||||
|
||||
v = visitor_input_test_init(data, buf);
|
||||
|
|
|
@ -50,16 +50,20 @@ static QEMUFile *open_test_file(bool write)
|
|||
{
|
||||
int fd = dup(temp_fd);
|
||||
QIOChannel *ioc;
|
||||
QEMUFile *f;
|
||||
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
if (write) {
|
||||
g_assert_cmpint(ftruncate(fd, 0), ==, 0);
|
||||
}
|
||||
ioc = QIO_CHANNEL(qio_channel_file_new_fd(fd));
|
||||
if (write) {
|
||||
return qemu_fopen_channel_output(ioc);
|
||||
f = qemu_fopen_channel_output(ioc);
|
||||
} else {
|
||||
return qemu_fopen_channel_input(ioc);
|
||||
f = qemu_fopen_channel_input(ioc);
|
||||
}
|
||||
object_unref(OBJECT(ioc));
|
||||
return f;
|
||||
}
|
||||
|
||||
#define SUCCESS(val) \
|
||||
|
|
Loading…
Reference in a new issue