[ovs-dev] [PATCH v3 ovn] ovn-sbctl: Prevent core dump from ovn-sbctl lflow-list [datpath] 0xflow

Mark Michelson mmichels at redhat.com
Mon May 10 20:59:42 UTC 2021


I pushed this to master, branch-21.03 and branch-20.12.

On 4/27/21 2:46 PM, Mark Michelson wrote:
> Excellent! Looks good to me!
> 
> Acked-by: Mark Michelson <mmichels at redhat.com>
> 
> On 4/21/21 12:17 PM, Alexey Roytman wrote:
>> From: Alexey Roytman <roytman at il.ibm.com>
>>
>> When ovn-sbctl lflow-list gets lflow argument with 0x prefix, e.g. 
>> 0x8131c8a8,
>> it prints correct output, but fails with coredump.
>> For example:
>> ovn-sbctl --uuid lflow-list sw1 0x8131c8a8
>> Datapath: "sw1" (4b1e53d8-9f0f-4768-b4a6-6cbc58a4bfda)  Pipeline: egress
>>      uuid=0x8131c8a8, table=10(ls_out_port_sec_l2 ), priority=100  ,
>> match=(eth.mcast), action=(output;)
>> free(): invalid pointer
>> [2]    616553 abort (core dumped)  ovn-sbctl --uuid dump-flows sw1 
>> 0x8131c8a8
>>   This patch fixes it.
>>
>> Signed-off-by: Alexey Roytman <roytman at il.ibm.com>
>> ---
>>   utilities/ovn-sbctl.c | 28 +++++++++++++++++-----------
>>   1 file changed, 17 insertions(+), 11 deletions(-)
>>
>> diff --git a/utilities/ovn-sbctl.c b/utilities/ovn-sbctl.c
>> index e3aa7a68e..99c112358 100644
>> --- a/utilities/ovn-sbctl.c
>> +++ b/utilities/ovn-sbctl.c
>> @@ -764,23 +764,28 @@ sbctl_lflow_cmp(const void *a_, const void *b_)
>>       return cmp ? cmp : strcmp(a->actions, b->actions);
>>   }
>> -static char *
>> +static bool
>> +is_uuid_with_prefix(const char *uuid)
>> +{
>> +     return uuid[0] == '0' && (uuid[1] == 'x' || uuid[1] == 'X');
>> +}
>> +
>> +static bool
>>   parse_partial_uuid(char *s)
>>   {
>>       /* Accept a full or partial UUID. */
>>       if (uuid_is_partial_string(s)) {
>> -        return s;
>> +        return true;
>>       }
>>       /* Accept a full or partial UUID prefixed by 0x, since "ovs-ofctl
>>        * dump-flows" prints cookies prefixed by 0x. */
>> -    if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X')
>> -        && uuid_is_partial_string(s + 2)) {
>> -        return s + 2;
>> +    if (is_uuid_with_prefix(s) && uuid_is_partial_string(s + 2)) {
>> +        return true;
>>       }
>>       /* Not a (partial) UUID. */
>> -    return NULL;
>> +    return false;
>>   }
>>   static const char *
>> @@ -799,8 +804,11 @@ is_partial_uuid_match(const struct uuid *uuid, 
>> const char *match)
>>        * from UUIDs, and cookie values are printed without leading 
>> zeros because
>>        * they're just numbers. */
>>       const char *s1 = strip_leading_zero(uuid_s);
>> -    const char *s2 = strip_leading_zero(match);
>> -
>> +    const char *s2 = match;
>> +    if (is_uuid_with_prefix(s2)) {
>> +        s2 = s2 + 2;
>> +    }
>> +    s2 = strip_leading_zero(s2);
>>       return !strncmp(s1, s2, strlen(s2));
>>   }
>> @@ -1134,12 +1142,10 @@ cmd_lflow_list(struct ctl_context *ctx)
>>       }
>>       for (size_t i = 1; i < ctx->argc; i++) {
>> -        char *s = parse_partial_uuid(ctx->argv[i]);
>> -        if (!s) {
>> +        if (!parse_partial_uuid(ctx->argv[i])) {
>>               ctl_fatal("%s is not a UUID or the beginning of a UUID",
>>                         ctx->argv[i]);
>>           }
>> -        ctx->argv[i] = s;
>>       }
>>       struct vconn *vconn = sbctl_open_vconn(&ctx->options);
>>
> 



More information about the dev mailing list