Skip to content

[Bug] Incorrect size limitation for string attribute in meta_generic_validation_create #1663

@oplklum

Description

@oplklum

I want to create a new SAI object with MANDATORY_ON_CREATE char type attribute in SWSS. But when I set the attribute value to 'OCM0-0|0|191262500' and call SAI create function, it will be failed with error "SAI_ATTR_VALUE_TYPE_CHARDATA host interface name is too long".

I checked sairedis meta.cpp code, found the string size check is incorrect. It always uses the SAI_HOSTIF_NAME_SIZE (16) for all string attributes. This part of code is shown below:

sai_status_t Meta::meta_generic_validation_create(...)
{
...
        switch (md.attrvaluetype)
        {
            case SAI_ATTR_VALUE_TYPE_CHARDATA:

                {
                    const char* chardata = value.chardata;

                    size_t len = strnlen(chardata, SAI_HOSTIF_NAME_SIZE);

                    if (len == SAI_HOSTIF_NAME_SIZE)
                    {
                        META_LOG_ERROR(md, "host interface name is too long");

                        return SAI_STATUS_INVALID_PARAMETER;
                    }

...
}

I think this size check should only apply to host interface name and genetlink multicast group name but not for all string attributes, as SAI defined the maximum name size in saihostif.h, but others are not which should be in the range of chardata[32]. Please see the below definition code from SAI:

/**
 * @brief Defines maximum host interface name
 */
#define SAI_HOSTIF_NAME_SIZE 16

/**
 * @brief Defines maximum length of generic netlink multicast group name
 */
#define SAI_HOSTIF_GENETLINK_MCGRP_NAME_SIZE 16
typedef union _sai_attribute_value_t
{
    /** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_BOOL */
    bool booldata;

    /** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_CHARDATA */
    char chardata[32];

    /** @validonly meta->attrvaluetype == SAI_ATTR_VALUE_TYPE_UINT8 */
    sai_uint8_t u8;

My error log is shown as follows:

2025 Oct  9 20:57:30.033605 sonic NOTICE swss#orchagent: :- translateObjectAttr: translateObjectAttr, field = name, value = OCM0-0|0|191262500
2025 Oct  9 20:57:30.033605 sonic NOTICE swss#orchagent: :- translateObjectAttr: translateObjectAttr, field = upper_frequency, value = 191337500
2025 Oct  9 20:57:30.033605 sonic ERR swss#orchagent: :- meta_generic_validation_create: SAI_OTN_OCM_CHANNEL_ATTR_NAME:SAI_ATTR_VALUE_TYPE_CHARDATA host interface name is too long
2025 Oct  9 20:57:30.033605 sonic ERR swss#orchagent: :- createObject: Failed to create SAI_OBJECT_TYPE_OTN_OCM_CHANNEL|OCM0-0|0|191262500, rv=-5
2025 Oct  9 20:57:30.033605 sonic ERR swss#orchagent: :- doTask: Failed to create object
2025 Oct  9 20:57:30.035943 sonic INFO swss#supervisord: message repeated 12 times: [ orchagent ]
2025 Oct  9 20:57:30.035943 sonic INFO swss#supervisord: orchagent terminate called after throwing an instance of 'std::runtime_error'
2025 Oct  9 20:57:30.035943 sonic INFO swss#supervisord: orchagent   what():  :- doTask: Failed to create object
2025 Oct  9 20:57:30.363750 sonic INFO swss#supervisord 2025-10-09 20:57:30,363 WARN exited: orchagent (terminated by SIGABRT (core dumped); not expected)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions