mirror of
https://github.com/qemu/qemu.git
synced 2025-08-02 04:35:42 +00:00
usb-ccid: Plug memory leak on qdev exit()
ccid_initfn() allocates CCIDBus dynamically, but there is no exit callback to free it. Fix by getting rid of the allocation. Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
44dc0ca3d2
commit
6df658f55c
@ -255,17 +255,18 @@ enum {
|
|||||||
MIGRATION_MIGRATED,
|
MIGRATION_MIGRATED,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct CCIDBus CCIDBus;
|
typedef struct CCIDBus {
|
||||||
typedef struct USBCCIDState USBCCIDState;
|
BusState qbus;
|
||||||
|
} CCIDBus;
|
||||||
|
|
||||||
#define MAX_PROTOCOL_SIZE 7
|
#define MAX_PROTOCOL_SIZE 7
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* powered - defaults to true, changed by PowerOn/PowerOff messages
|
* powered - defaults to true, changed by PowerOn/PowerOff messages
|
||||||
*/
|
*/
|
||||||
struct USBCCIDState {
|
typedef struct USBCCIDState {
|
||||||
USBDevice dev;
|
USBDevice dev;
|
||||||
CCIDBus *bus;
|
CCIDBus bus;
|
||||||
CCIDCardState *card;
|
CCIDCardState *card;
|
||||||
CCIDCardInfo *cardinfo; /* caching the info pointer */
|
CCIDCardInfo *cardinfo; /* caching the info pointer */
|
||||||
BulkIn bulk_in_pending[BULK_IN_PENDING_NUM]; /* circular */
|
BulkIn bulk_in_pending[BULK_IN_PENDING_NUM]; /* circular */
|
||||||
@ -293,7 +294,7 @@ struct USBCCIDState {
|
|||||||
uint8_t powered;
|
uint8_t powered;
|
||||||
uint8_t notify_slot_change;
|
uint8_t notify_slot_change;
|
||||||
uint8_t debug;
|
uint8_t debug;
|
||||||
};
|
} USBCCIDState;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CCID Spec chapter 4: CCID uses a standard device descriptor per Chapter 9,
|
* CCID Spec chapter 4: CCID uses a standard device descriptor per Chapter 9,
|
||||||
@ -1113,10 +1114,6 @@ static void ccid_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CCIDBus {
|
|
||||||
BusState qbus;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct BusInfo ccid_bus_info = {
|
static struct BusInfo ccid_bus_info = {
|
||||||
.name = "ccid-bus",
|
.name = "ccid-bus",
|
||||||
.size = sizeof(CCIDBus),
|
.size = sizeof(CCIDBus),
|
||||||
@ -1127,16 +1124,6 @@ static struct BusInfo ccid_bus_info = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static CCIDBus *ccid_bus_new(DeviceState *dev)
|
|
||||||
{
|
|
||||||
CCIDBus *bus;
|
|
||||||
|
|
||||||
bus = FROM_QBUS(CCIDBus, qbus_create(&ccid_bus_info, dev, NULL));
|
|
||||||
bus->qbus.allow_hotplug = 1;
|
|
||||||
|
|
||||||
return bus;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ccid_card_send_apdu_to_guest(CCIDCardState *card,
|
void ccid_card_send_apdu_to_guest(CCIDCardState *card,
|
||||||
uint8_t *apdu, uint32_t len)
|
uint8_t *apdu, uint32_t len)
|
||||||
{
|
{
|
||||||
@ -1276,7 +1263,8 @@ static int ccid_initfn(USBDevice *dev)
|
|||||||
{
|
{
|
||||||
USBCCIDState *s = DO_UPCAST(USBCCIDState, dev, dev);
|
USBCCIDState *s = DO_UPCAST(USBCCIDState, dev, dev);
|
||||||
|
|
||||||
s->bus = ccid_bus_new(&dev->qdev);
|
qbus_create_inplace(&s->bus.qbus, &ccid_bus_info, &dev->qdev, NULL);
|
||||||
|
s->bus.qbus.allow_hotplug = 1;
|
||||||
s->card = NULL;
|
s->card = NULL;
|
||||||
s->cardinfo = NULL;
|
s->cardinfo = NULL;
|
||||||
s->migration_state = MIGRATION_NONE;
|
s->migration_state = MIGRATION_NONE;
|
||||||
|
Loading…
Reference in New Issue
Block a user