[GEDI] [PATCH v2 7/7] qapi: More complex uses of QAPI_LIST_APPEND

Dr. David Alan Gilbert dgilbert at redhat.com
Fri Nov 13 19:39:03 UTC 2020


* Eric Blake (eblake at redhat.com) wrote:
> These cases require a bit more thought to review; in each case, the
> code was appending to a list, but not with a FOOList **tail variable.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  block/gluster.c            |  13 +---
>  block/qapi.c               |  14 +----
>  dump/dump.c                |  22 ++-----
>  hw/core/machine-qmp-cmds.c | 125 +++++++++++++++----------------------
>  hw/mem/memory-device.c     |  12 +---
>  hw/pci/pci.c               |  60 ++++++------------
>  migration/migration.c      |  20 ++----
>  monitor/hmp-cmds.c         |  23 +++----
>  net/net.c                  |  13 +---
>  qga/commands-posix.c       | 101 +++++++++++-------------------
>  qga/commands-win32.c       |  88 +++++++++-----------------
>  softmmu/tpm.c              |  38 ++---------
>  ui/spice-core.c            |  27 +++-----
>  13 files changed, 180 insertions(+), 376 deletions(-)
> 

<snip>

> diff --git a/migration/migration.c b/migration/migration.c
> index 84e5f4982fb2..b97eb2d0494e 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -797,29 +797,21 @@ void migrate_send_rp_resume_ack(MigrationIncomingState *mis, uint32_t value)
> 
>  MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
>  {
> -    MigrationCapabilityStatusList *head = NULL;
> -    MigrationCapabilityStatusList *caps;
> +    MigrationCapabilityStatusList *head = NULL, **tail = &head;
> +    MigrationCapabilityStatus *caps;
>      MigrationState *s = migrate_get_current();
>      int i;
> 
> -    caps = NULL; /* silence compiler warning */
>      for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) {
>  #ifndef CONFIG_LIVE_BLOCK_MIGRATION
>          if (i == MIGRATION_CAPABILITY_BLOCK) {
>              continue;
>          }
>  #endif
> -        if (head == NULL) {
> -            head = g_malloc0(sizeof(*caps));
> -            caps = head;
> -        } else {
> -            caps->next = g_malloc0(sizeof(*caps));
> -            caps = caps->next;
> -        }
> -        caps->value =
> -            g_malloc(sizeof(*caps->value));
> -        caps->value->capability = i;
> -        caps->value->state = s->enabled_capabilities[i];
> +        caps = g_malloc(sizeof(*caps));
> +        caps->capability = i;
> +        caps->state = s->enabled_capabilities[i];
> +        QAPI_LIST_APPEND(tail, caps);
>      }
> 
>      return head;
> diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
> index 01a7d317c3c9..678f388d2e1f 100644
> --- a/monitor/hmp-cmds.c
> +++ b/monitor/hmp-cmds.c
> @@ -1699,7 +1699,8 @@ void hmp_closefd(Monitor *mon, const QDict *qdict)
>  void hmp_sendkey(Monitor *mon, const QDict *qdict)
>  {
>      const char *keys = qdict_get_str(qdict, "keys");
> -    KeyValueList *keylist, *head = NULL, *tmp = NULL;
> +    KeyValue *v;
> +    KeyValueList *head = NULL, **tail = &head;
>      int has_hold_time = qdict_haskey(qdict, "hold-time");
>      int hold_time = qdict_get_try_int(qdict, "hold-time", -1);
>      Error *err = NULL;
> @@ -1716,16 +1717,7 @@ void hmp_sendkey(Monitor *mon, const QDict *qdict)
>              keyname_len = 4;
>          }
> 
> -        keylist = g_malloc0(sizeof(*keylist));
> -        keylist->value = g_malloc0(sizeof(*keylist->value));
> -
> -        if (!head) {
> -            head = keylist;
> -        }
> -        if (tmp) {
> -            tmp->next = keylist;
> -        }
> -        tmp = keylist;
> +        v = g_malloc0(sizeof(*v));
> 
>          if (strstart(keys, "0x", NULL)) {
>              char *endp;
> @@ -1734,16 +1726,17 @@ void hmp_sendkey(Monitor *mon, const QDict *qdict)
>              if (endp != keys + keyname_len) {
>                  goto err_out;
>              }
> -            keylist->value->type = KEY_VALUE_KIND_NUMBER;
> -            keylist->value->u.number.data = value;
> +            v->type = KEY_VALUE_KIND_NUMBER;
> +            v->u.number.data = value;
>          } else {
>              int idx = index_from_key(keys, keyname_len);
>              if (idx == Q_KEY_CODE__MAX) {
>                  goto err_out;
>              }
> -            keylist->value->type = KEY_VALUE_KIND_QCODE;
> -            keylist->value->u.qcode.data = idx;
> +            v->type = KEY_VALUE_KIND_QCODE;
> +            v->u.qcode.data = idx;
>          }
> +        QAPI_LIST_APPEND(tail, v);
> 
>          if (!*separator) {
>              break;

Don't you need to arrange for 'v' to be free'd in the err_out case?

Dave

> diff --git a/net/net.c b/net/net.c
> index eb65e110871a..453865db6f10 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -1199,10 +1199,9 @@ RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
>                                        Error **errp)
>  {
>      NetClientState *nc;
> -    RxFilterInfoList *filter_list = NULL, *last_entry = NULL;
> +    RxFilterInfoList *filter_list = NULL, **last = &filter_list;
> 
>      QTAILQ_FOREACH(nc, &net_clients, next) {
> -        RxFilterInfoList *entry;
>          RxFilterInfo *info;
> 
>          if (has_name && strcmp(nc->name, name) != 0) {
> @@ -1227,15 +1226,7 @@ RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
> 
>          if (nc->info->query_rx_filter) {
>              info = nc->info->query_rx_filter(nc);
> -            entry = g_malloc0(sizeof(*entry));
> -            entry->value = info;
> -
> -            if (!filter_list) {
> -                filter_list = entry;
> -            } else {
> -                last_entry->next = entry;
> -            }
> -            last_entry = entry;
> +            QAPI_LIST_APPEND(last, info);
>          } else if (has_name) {
>              error_setg(errp, "net client(%s) doesn't support"
>                         " rx-filter querying", name);
> diff --git a/qga/commands-posix.c b/qga/commands-posix.c
> index d8bc40ea9f6e..55087e268cda 100644
> --- a/qga/commands-posix.c
> +++ b/qga/commands-posix.c
> @@ -2118,17 +2118,17 @@ void qmp_guest_suspend_hybrid(Error **errp)
>      guest_suspend(SUSPEND_MODE_HYBRID, errp);
>  }
> 
> -static GuestNetworkInterfaceList *
> +static GuestNetworkInterface *
>  guest_find_interface(GuestNetworkInterfaceList *head,
>                       const char *name)
>  {
>      for (; head; head = head->next) {
>          if (strcmp(head->value->name, name) == 0) {
> -            break;
> +            return head->value;
>          }
>      }
> 
> -    return head;
> +    return NULL;
>  }
> 
>  static int guest_get_network_stats(const char *name,
> @@ -2197,7 +2197,7 @@ static int guest_get_network_stats(const char *name,
>   */
>  GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>  {
> -    GuestNetworkInterfaceList *head = NULL, *cur_item = NULL;
> +    GuestNetworkInterfaceList *head = NULL, **tail = &head;
>      struct ifaddrs *ifap, *ifa;
> 
>      if (getifaddrs(&ifap) < 0) {
> @@ -2206,9 +2206,10 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>      }
> 
>      for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
> -        GuestNetworkInterfaceList *info;
> -        GuestIpAddressList **address_list = NULL, *address_item = NULL;
> -        GuestNetworkInterfaceStat  *interface_stat = NULL;
> +        GuestNetworkInterface *info;
> +        GuestIpAddressList **address_tail;
> +        GuestIpAddress *address_item = NULL;
> +        GuestNetworkInterfaceStat *interface_stat = NULL;
>          char addr4[INET_ADDRSTRLEN];
>          char addr6[INET6_ADDRSTRLEN];
>          int sock;
> @@ -2222,19 +2223,14 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
> 
>          if (!info) {
>              info = g_malloc0(sizeof(*info));
> -            info->value = g_malloc0(sizeof(*info->value));
> -            info->value->name = g_strdup(ifa->ifa_name);
> +            info->name = g_strdup(ifa->ifa_name);
> 
> -            if (!cur_item) {
> -                head = cur_item = info;
> -            } else {
> -                cur_item->next = info;
> -                cur_item = info;
> -            }
> +            QAPI_LIST_APPEND(tail, info);
>          }
> 
> -        if (!info->value->has_hardware_address &&
> -            ifa->ifa_flags & SIOCGIFHWADDR) {
> +        address_tail = &info->ip_addresses;
> +
> +        if (!info->has_hardware_address && ifa->ifa_flags & SIOCGIFHWADDR) {
>              /* we haven't obtained HW address yet */
>              sock = socket(PF_INET, SOCK_STREAM, 0);
>              if (sock == -1) {
> @@ -2243,7 +2239,7 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>              }
> 
>              memset(&ifr, 0, sizeof(ifr));
> -            pstrcpy(ifr.ifr_name, IF_NAMESIZE, info->value->name);
> +            pstrcpy(ifr.ifr_name, IF_NAMESIZE, info->name);
>              if (ioctl(sock, SIOCGIFHWADDR, &ifr) == -1) {
>                  error_setg_errno(errp, errno,
>                                   "failed to get MAC address of %s",
> @@ -2255,13 +2251,13 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>              close(sock);
>              mac_addr = (unsigned char *) &ifr.ifr_hwaddr.sa_data;
> 
> -            info->value->hardware_address =
> +            info->hardware_address =
>                  g_strdup_printf("%02x:%02x:%02x:%02x:%02x:%02x",
>                                  (int) mac_addr[0], (int) mac_addr[1],
>                                  (int) mac_addr[2], (int) mac_addr[3],
>                                  (int) mac_addr[4], (int) mac_addr[5]);
> 
> -            info->value->has_hardware_address = true;
> +            info->has_hardware_address = true;
>          }
> 
>          if (ifa->ifa_addr &&
> @@ -2274,15 +2270,14 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>              }
> 
>              address_item = g_malloc0(sizeof(*address_item));
> -            address_item->value = g_malloc0(sizeof(*address_item->value));
> -            address_item->value->ip_address = g_strdup(addr4);
> -            address_item->value->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV4;
> +            address_item->ip_address = g_strdup(addr4);
> +            address_item->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV4;
> 
>              if (ifa->ifa_netmask) {
>                  /* Count the number of set bits in netmask.
>                   * This is safe as '1' and '0' cannot be shuffled in netmask. */
>                  p = &((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr;
> -                address_item->value->prefix = ctpop32(((uint32_t *) p)[0]);
> +                address_item->prefix = ctpop32(((uint32_t *) p)[0]);
>              }
>          } else if (ifa->ifa_addr &&
>                     ifa->ifa_addr->sa_family == AF_INET6) {
> @@ -2294,15 +2289,14 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>              }
> 
>              address_item = g_malloc0(sizeof(*address_item));
> -            address_item->value = g_malloc0(sizeof(*address_item->value));
> -            address_item->value->ip_address = g_strdup(addr6);
> -            address_item->value->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV6;
> +            address_item->ip_address = g_strdup(addr6);
> +            address_item->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV6;
> 
>              if (ifa->ifa_netmask) {
>                  /* Count the number of set bits in netmask.
>                   * This is safe as '1' and '0' cannot be shuffled in netmask. */
>                  p = &((struct sockaddr_in6 *)ifa->ifa_netmask)->sin6_addr;
> -                address_item->value->prefix =
> +                address_item->prefix =
>                      ctpop32(((uint32_t *) p)[0]) +
>                      ctpop32(((uint32_t *) p)[1]) +
>                      ctpop32(((uint32_t *) p)[2]) +
> @@ -2314,29 +2308,18 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>              continue;
>          }
> 
> -        address_list = &info->value->ip_addresses;
> +        QAPI_LIST_APPEND(address_tail, address_item);
> 
> -        while (*address_list && (*address_list)->next) {
> -            address_list = &(*address_list)->next;
> -        }
> +        info->has_ip_addresses = true;
> 
> -        if (!*address_list) {
> -            *address_list = address_item;
> -        } else {
> -            (*address_list)->next = address_item;
> -        }
> -
> -        info->value->has_ip_addresses = true;
> -
> -        if (!info->value->has_statistics) {
> +        if (!info->has_statistics) {
>              interface_stat = g_malloc0(sizeof(*interface_stat));
> -            if (guest_get_network_stats(info->value->name,
> -                interface_stat) == -1) {
> -                info->value->has_statistics = false;
> +            if (guest_get_network_stats(info->name, interface_stat) == -1) {
> +                info->has_statistics = false;
>                  g_free(interface_stat);
>              } else {
> -                info->value->statistics = interface_stat;
> -                info->value->has_statistics = true;
> +                info->statistics = interface_stat;
> +                info->has_statistics = true;
>              }
>          }
>      }
> @@ -2863,7 +2846,6 @@ qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
> 
>      while (mem_blks != NULL) {
>          GuestMemoryBlockResponse *result;
> -        GuestMemoryBlockResponseList *entry;
>          GuestMemoryBlock *current_mem_blk = mem_blks->value;
> 
>          result = g_malloc0(sizeof(*result));
> @@ -2872,11 +2854,7 @@ qmp_guest_set_memory_blocks(GuestMemoryBlockList *mem_blks, Error **errp)
>          if (local_err) { /* should never happen */
>              goto err;
>          }
> -        entry = g_malloc0(sizeof *entry);
> -        entry->value = result;
> -
> -        *link = entry;
> -        link = &entry->next;
> +        QAPI_LIST_APPEND(link, result);
>          mem_blks = mem_blks->next;
>      }
> 
> @@ -3107,11 +3085,10 @@ static double ga_get_login_time(struct utmpx *user_info)
>  GuestUserList *qmp_guest_get_users(Error **errp)
>  {
>      GHashTable *cache = NULL;
> -    GuestUserList *head = NULL, *cur_item = NULL;
> +    GuestUserList *head = NULL, **tail = &head;
>      struct utmpx *user_info = NULL;
>      gpointer value = NULL;
>      GuestUser *user = NULL;
> -    GuestUserList *item = NULL;
>      double login_time = 0;
> 
>      cache = g_hash_table_new(g_str_hash, g_str_equal);
> @@ -3134,19 +3111,13 @@ GuestUserList *qmp_guest_get_users(Error **errp)
>              continue;
>          }
> 
> -        item = g_new0(GuestUserList, 1);
> -        item->value = g_new0(GuestUser, 1);
> -        item->value->user = g_strdup(user_info->ut_user);
> -        item->value->login_time = ga_get_login_time(user_info);
> +        user = g_new0(GuestUser, 1);
> +        user->user = g_strdup(user_info->ut_user);
> +        user->login_time = ga_get_login_time(user_info);
> 
> -        g_hash_table_insert(cache, item->value->user, item->value);
> +        g_hash_table_insert(cache, user->user, user);
> 
> -        if (!cur_item) {
> -            head = cur_item = item;
> -        } else {
> -            cur_item->next = item;
> -            cur_item = item;
> -        }
> +        QAPI_LIST_APPEND(tail, user);
>      }
>      endutxent();
>      g_hash_table_destroy(cache);
> diff --git a/qga/commands-win32.c b/qga/commands-win32.c
> index 031bbe223ecf..cfc530975170 100644
> --- a/qga/commands-win32.c
> +++ b/qga/commands-win32.c
> @@ -1625,11 +1625,11 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>  {
>      IP_ADAPTER_ADDRESSES *adptr_addrs, *addr;
>      IP_ADAPTER_UNICAST_ADDRESS *ip_addr = NULL;
> -    GuestNetworkInterfaceList *head = NULL, *cur_item = NULL;
> -    GuestIpAddressList *head_addr, *cur_addr;
> -    GuestNetworkInterfaceList *info;
> +    GuestNetworkInterfaceList *head = NULL, **tail = &head;
> +    GuestIpAddressList *head_addr, **tail_addr;
> +    GuestNetworkInterface *info;
>      GuestNetworkInterfaceStat *interface_stat = NULL;
> -    GuestIpAddressList *address_item = NULL;
> +    GuestIpAddress *address_item = NULL;
>      unsigned char *mac_addr;
>      char *addr_str;
>      WORD wsa_version;
> @@ -1652,30 +1652,24 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
>      for (addr = adptr_addrs; addr; addr = addr->Next) {
>          info = g_malloc0(sizeof(*info));
> 
> -        if (cur_item == NULL) {
> -            head = cur_item = info;
> -        } else {
> -            cur_item->next = info;
> -            cur_item = info;
> -        }
> +        QAPI_LIST_APPEND(tail, info);
> 
> -        info->value = g_malloc0(sizeof(*info->value));
> -        info->value->name = guest_wctomb_dup(addr->FriendlyName);
> +        info->name = guest_wctomb_dup(addr->FriendlyName);
> 
>          if (addr->PhysicalAddressLength != 0) {
>              mac_addr = addr->PhysicalAddress;
> 
> -            info->value->hardware_address =
> +            info->hardware_address =
>                  g_strdup_printf("%02x:%02x:%02x:%02x:%02x:%02x",
>                                  (int) mac_addr[0], (int) mac_addr[1],
>                                  (int) mac_addr[2], (int) mac_addr[3],
>                                  (int) mac_addr[4], (int) mac_addr[5]);
> 
> -            info->value->has_hardware_address = true;
> +            info->has_hardware_address = true;
>          }
> 
>          head_addr = NULL;
> -        cur_addr = NULL;
> +        tail_addr = &head_addr;
>          for (ip_addr = addr->FirstUnicastAddress;
>                  ip_addr;
>                  ip_addr = ip_addr->Next) {
> @@ -1686,37 +1680,29 @@ GuestNetworkInterfaceList *qmp_guest_network_get_interfaces(Error **errp)
> 
>              address_item = g_malloc0(sizeof(*address_item));
> 
> -            if (!cur_addr) {
> -                head_addr = cur_addr = address_item;
> -            } else {
> -                cur_addr->next = address_item;
> -                cur_addr = address_item;
> -            }
> +            QAPI_LIST_APPEND(tail_addr, address_item);
> 
> -            address_item->value = g_malloc0(sizeof(*address_item->value));
> -            address_item->value->ip_address = addr_str;
> -            address_item->value->prefix = guest_ip_prefix(ip_addr);
> +            address_item->ip_address = addr_str;
> +            address_item->prefix = guest_ip_prefix(ip_addr);
>              if (ip_addr->Address.lpSockaddr->sa_family == AF_INET) {
> -                address_item->value->ip_address_type =
> -                    GUEST_IP_ADDRESS_TYPE_IPV4;
> +                address_item->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV4;
>              } else if (ip_addr->Address.lpSockaddr->sa_family == AF_INET6) {
> -                address_item->value->ip_address_type =
> -                    GUEST_IP_ADDRESS_TYPE_IPV6;
> +                address_item->ip_address_type = GUEST_IP_ADDRESS_TYPE_IPV6;
>              }
>          }
>          if (head_addr) {
> -            info->value->has_ip_addresses = true;
> -            info->value->ip_addresses = head_addr;
> +            info->has_ip_addresses = true;
> +            info->ip_addresses = head_addr;
>          }
> -        if (!info->value->has_statistics) {
> +        if (!info->has_statistics) {
>              interface_stat = g_malloc0(sizeof(*interface_stat));
>              if (guest_get_network_stats(addr->AdapterName,
>                  interface_stat) == -1) {
> -                info->value->has_statistics = false;
> +                info->has_statistics = false;
>                  g_free(interface_stat);
>              } else {
> -                info->value->statistics = interface_stat;
> -                info->value->has_statistics = true;
> +                info->statistics = interface_stat;
> +                info->has_statistics = true;
>              }
>          }
>      }
> @@ -2083,12 +2069,11 @@ GuestUserList *qmp_guest_get_users(Error **errp)
>  #define QGA_NANOSECONDS 10000000
> 
>      GHashTable *cache = NULL;
> -    GuestUserList *head = NULL, *cur_item = NULL;
> +    GuestUserList *head = NULL, **tail = &head;
> 
>      DWORD buffer_size = 0, count = 0, i = 0;
>      GA_WTSINFOA *info = NULL;
>      WTS_SESSION_INFOA *entries = NULL;
> -    GuestUserList *item = NULL;
>      GuestUser *user = NULL;
>      gpointer value = NULL;
>      INT64 login = 0;
> @@ -2124,23 +2109,17 @@ GuestUserList *qmp_guest_get_users(Error **errp)
>                          user->login_time = login_time;
>                      }
>                  } else {
> -                    item = g_new0(GuestUserList, 1);
> -                    item->value = g_new0(GuestUser, 1);
> +                    user = g_new0(GuestUser, 1);
> 
> -                    item->value->user = g_strdup(info->UserName);
> -                    item->value->domain = g_strdup(info->Domain);
> -                    item->value->has_domain = true;
> +                    user->user = g_strdup(info->UserName);
> +                    user->domain = g_strdup(info->Domain);
> +                    user->has_domain = true;
> 
> -                    item->value->login_time = login_time;
> +                    user->login_time = login_time;
> 
> -                    g_hash_table_add(cache, item->value->user);
> +                    g_hash_table_add(cache, user->user);
> 
> -                    if (!cur_item) {
> -                        head = cur_item = item;
> -                    } else {
> -                        cur_item->next = item;
> -                        cur_item = item;
> -                    }
> +                    QAPI_LIST_APPEND(tail, user);
>                  }
>              }
>              WTSFreeMemory(info);
> @@ -2425,7 +2404,7 @@ static GStrv ga_get_hardware_ids(DEVINST devInstance)
> 
>  GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
>  {
> -    GuestDeviceInfoList *head = NULL, *cur_item = NULL, *item = NULL;
> +    GuestDeviceInfoList *head = NULL, **tail = &head;
>      HDEVINFO dev_info = INVALID_HANDLE_VALUE;
>      SP_DEVINFO_DATA dev_info_data;
>      int i, j;
> @@ -2523,14 +2502,7 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error **errp)
>          slog("driver: %s\ndriver version: %" PRId64 ",%s\n",
>               device->driver_name, device->driver_date,
>               device->driver_version);
> -        item = g_new0(GuestDeviceInfoList, 1);
> -        item->value = g_steal_pointer(&device);
> -        if (!cur_item) {
> -            head = cur_item = item;
> -        } else {
> -            cur_item->next = item;
> -            cur_item = item;
> -        }
> +        QAPI_LIST_APPEND(tail, g_steal_pointer(&device));
>      }
> 
>      if (dev_info != INVALID_HANDLE_VALUE) {
> diff --git a/softmmu/tpm.c b/softmmu/tpm.c
> index cab206355afd..578563f05a7b 100644
> --- a/softmmu/tpm.c
> +++ b/softmmu/tpm.c
> @@ -196,22 +196,14 @@ int tpm_config_parse(QemuOptsList *opts_list, const char *optarg)
>  TPMInfoList *qmp_query_tpm(Error **errp)
>  {
>      TPMBackend *drv;
> -    TPMInfoList *info, *head = NULL, *cur_item = NULL;
> +    TPMInfoList *head = NULL, **tail = &head;
> 
>      QLIST_FOREACH(drv, &tpm_backends, list) {
>          if (!drv->tpmif) {
>              continue;
>          }
> 
> -        info = g_new0(TPMInfoList, 1);
> -        info->value = tpm_backend_query_tpm(drv);
> -
> -        if (!cur_item) {
> -            head = cur_item = info;
> -        } else {
> -            cur_item->next = info;
> -            cur_item = info;
> -        }
> +        QAPI_LIST_APPEND(tail, tpm_backend_query_tpm(drv));
>      }
> 
>      return head;
> @@ -220,44 +212,26 @@ TPMInfoList *qmp_query_tpm(Error **errp)
>  TpmTypeList *qmp_query_tpm_types(Error **errp)
>  {
>      unsigned int i = 0;
> -    TpmTypeList *head = NULL, *prev = NULL, *cur_item;
> +    TpmTypeList *head = NULL, **tail = &head;
> 
>      for (i = 0; i < TPM_TYPE__MAX; i++) {
>          if (!tpm_be_find_by_type(i)) {
>              continue;
>          }
> -        cur_item = g_new0(TpmTypeList, 1);
> -        cur_item->value = i;
> -
> -        if (prev) {
> -            prev->next = cur_item;
> -        }
> -        if (!head) {
> -            head = cur_item;
> -        }
> -        prev = cur_item;
> +        QAPI_LIST_APPEND(tail, i);
>      }
> 
>      return head;
>  }
>  TpmModelList *qmp_query_tpm_models(Error **errp)
>  {
> -    TpmModelList *head = NULL, *prev = NULL, *cur_item;
> +    TpmModelList *head = NULL, **tail = &head;
>      GSList *e, *l = object_class_get_list(TYPE_TPM_IF, false);
> 
>      for (e = l; e; e = e->next) {
>          TPMIfClass *c = TPM_IF_CLASS(e->data);
> 
> -        cur_item = g_new0(TpmModelList, 1);
> -        cur_item->value = c->model;
> -
> -        if (prev) {
> -            prev->next = cur_item;
> -        }
> -        if (!head) {
> -            head = cur_item;
> -        }
> -        prev = cur_item;
> +        QAPI_LIST_APPEND(tail, c->model);
>      }
>      g_slist_free(l);
> 
> diff --git a/ui/spice-core.c b/ui/spice-core.c
> index eea52f538999..58232b649e60 100644
> --- a/ui/spice-core.c
> +++ b/ui/spice-core.c
> @@ -355,11 +355,11 @@ static const char *wan_compression_names[] = {
> 
>  static SpiceChannelList *qmp_query_spice_channels(void)
>  {
> -    SpiceChannelList *cur_item = NULL, *head = NULL;
> +    SpiceChannelList *head = NULL, **tail = &head;
>      ChannelList *item;
> 
>      QTAILQ_FOREACH(item, &channel_list, link) {
> -        SpiceChannelList *chan;
> +        SpiceChannel *chan;
>          char host[NI_MAXHOST], port[NI_MAXSERV];
>          struct sockaddr *paddr;
>          socklen_t plen;
> @@ -367,29 +367,22 @@ static SpiceChannelList *qmp_query_spice_channels(void)
>          assert(item->info->flags & SPICE_CHANNEL_EVENT_FLAG_ADDR_EXT);
> 
>          chan = g_malloc0(sizeof(*chan));
> -        chan->value = g_malloc0(sizeof(*chan->value));
> 
>          paddr = (struct sockaddr *)&item->info->paddr_ext;
>          plen = item->info->plen_ext;
>          getnameinfo(paddr, plen,
>                      host, sizeof(host), port, sizeof(port),
>                      NI_NUMERICHOST | NI_NUMERICSERV);
> -        chan->value->host = g_strdup(host);
> -        chan->value->port = g_strdup(port);
> -        chan->value->family = inet_netfamily(paddr->sa_family);
> +        chan->host = g_strdup(host);
> +        chan->port = g_strdup(port);
> +        chan->family = inet_netfamily(paddr->sa_family);
> 
> -        chan->value->connection_id = item->info->connection_id;
> -        chan->value->channel_type = item->info->type;
> -        chan->value->channel_id = item->info->id;
> -        chan->value->tls = item->info->flags & SPICE_CHANNEL_EVENT_FLAG_TLS;
> +        chan->connection_id = item->info->connection_id;
> +        chan->channel_type = item->info->type;
> +        chan->channel_id = item->info->id;
> +        chan->tls = item->info->flags & SPICE_CHANNEL_EVENT_FLAG_TLS;
> 
> -       /* XXX: waiting for the qapi to support GSList */
> -        if (!cur_item) {
> -            head = cur_item = chan;
> -        } else {
> -            cur_item->next = chan;
> -            cur_item = chan;
> -        }
> +        QAPI_LIST_APPEND(tail, chan);
>      }
> 
>      return head;
> -- 
> 2.28.0
> 
-- 
Dr. David Alan Gilbert / dgilbert at redhat.com / Manchester, UK



More information about the integration mailing list