On 15.05.2025 11:58, Daniel P. Berrangé wrote:

> On Wed, Apr 30, 2025 at 07:27:29AM +0200, Mario Fleischmann wrote:
>> This commit implements the necessary operations required to establish
>> a connection with the MCD server:
>>
>> * query information about the server
>> * connect to "
>> * disconnect from "
>>
>> Signed-off-by: Mario Fleischmann <mario.fleischm...@lauterbach.com>
>> ---
>>  mcd/mcd_qapi.c         |  13 +++
>>  mcd/mcd_qapi.h         |   2 +
>>  mcd/mcd_server.c       | 110 +++++++++++++++++++++-
>>  mcd/mcd_stub.c         |  98 ++++++++++++++++++++
>>  qapi/mcd.json          | 205 +++++++++++++++++++++++++++++++++++++++++
>>  tests/qtest/mcd-test.c |  96 +++++++++++++++++++
>>  tests/qtest/mcd-util.c |  60 ++++++++++++
>>  tests/qtest/mcd-util.h |   9 ++
>>  8 files changed, 588 insertions(+), 5 deletions(-)
>>
>> diff --git a/mcd/mcd_qapi.c b/mcd/mcd_qapi.c
>> index 9a99866..d2a2926 100644
>> --- a/mcd/mcd_qapi.c
>> +++ b/mcd/mcd_qapi.c
> 
> 
>> +MCDQryServersResult *qmp_mcd_qry_servers(const char *host, bool running,
>> +                                         uint32_t start_index,
>> +                                         uint32_t num_servers, Error **errp)
>> +{
>> +    MCDServerInfoList **tailp;
>> +    MCDServerInfo *info;
>> +    mcd_server_info_st *server_info = NULL;
>> +    bool query_num_only = num_servers == 0;
>> +    MCDQryServersResult *result = g_malloc0(sizeof(*result));
>> +
>> +    if (!query_num_only) {
>> +        server_info = g_malloc0(num_servers * sizeof(*server_info));
> 
> This multiplication is (theoretically) subject to overflow. To eliminate
> this risk, this should use
> 
>     g_new0(mcd_server_info_st, num_servers)
> 
> which will validate overflow & abort if hit.
> 
> There are many more instances of this code pattern in the series
> 
> $ git diff -r master | grep g_malloc | grep ' \* '
> +        .tx = g_malloc(txlist->num_tx * sizeof(mcd_tx_st)),
> +        server_info = g_malloc0(num_servers * sizeof(*server_info));
> +        system_con_info = g_malloc0(num_systems * sizeof(*system_con_info));
> +        device_con_info = g_malloc0(num_devices * sizeof(*device_con_info));
> +        core_con_info = g_malloc0(num_cores * sizeof(*core_con_info));
> +        memspaces = g_malloc0(num_mem_spaces * sizeof(*memspaces));
> +        reg_groups = g_malloc0(num_reg_groups * sizeof(*reg_groups));
> +        regs = g_malloc0(num_regs * sizeof(*regs));
> +        ctrig_info = g_malloc0(num_ctrigs * sizeof(*ctrig_info));
> +        trig_ids = g_malloc0(num_trigs * sizeof(*trig_ids));
> 
> 
> QEMU is a bit inconsistent, but we have a slight bias in favour
> of using g_new0, even for single struct allocations.
> 
> IMHO being in the habit of always using g_new0 instead of g_malloc
> makes it less likely for people to inadvertantly introduce the
> multiplication overflow code pattern with g_malloc.

Oh, I didn't know that function, thanks for pointing it out! I agree,
it's the more elegant option.

Reply via email to