This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MCU-PLUS-SDK-AM263X: CANFD drivers: CANFD_isDataSizeValid() function can lead to out-of-bounds memory access

Part Number: MCU-PLUS-SDK-AM263X
Other Parts Discussed in Thread: SYSCONFIG

The function CANFD_isDataSizeValid() contains an implementation error that can lead to out-of-bounds memory access.

int32_t CANFD_isDataSizeValid(uint32_t dataSize)
{
    uint32_t canfdDataSize[CANFD_MAX_DLC_MAPPING] =
                    {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U,
                     12U, 16U, 20U, 24U, 32U, 48U, 64U};

    if((canfdDataSize[dataSize] == 0U) ||
       (canfdDataSize[dataSize] == 1U) ||
       (canfdDataSize[dataSize] == 2U) ||
       (canfdDataSize[dataSize] == 3U) ||
       (canfdDataSize[dataSize] == 4U) ||
       (canfdDataSize[dataSize] == 5U) ||
       (canfdDataSize[dataSize] == 6U) ||
       (canfdDataSize[dataSize] == 7U) ||
       (canfdDataSize[dataSize] == 8U) ||
       (canfdDataSize[dataSize] == 12U) ||
       (canfdDataSize[dataSize] == 16U) ||
       (canfdDataSize[dataSize] == 20U) ||
       (canfdDataSize[dataSize] == 24U) ||
       (canfdDataSize[dataSize] == 32U) ||
       (canfdDataSize[dataSize] == 48U) ||
       (canfdDataSize[dataSize] == 64U))
    {
        return SystemP_SUCCESS;
    }

    return SystemP_FAILURE;
}
 
The function incorrectly uses the input parameter dataSize as an index into the canfdDataSize[] array. However, dataSize represents the number of bytes in the CAN FD frame, which can range from 0 to 64. The canfdDataSize[] array contains only 16 elements, so passing a dataSize value greater than 15 results in accessing memory outside the bounds of the array.

Below is the correct implementation of the function:

int32_t CANFD_isDataSizeValid(uint32_t dataSize)
{
    uint32_t canfdDataSize[CANFD_MAX_DLC_MAPPING] = 
                    {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U,
                     12U, 16U, 20U, 24U, 32U, 48U, 64U};

    if((canfdDataSize[0U] == dataSize) || 
       (canfdDataSize[1U] == dataSize) ||
       (canfdDataSize[2U] == dataSize) ||
       (canfdDataSize[3U] == dataSize) ||
       (canfdDataSize[4U] == dataSize) ||
       (canfdDataSize[5U] == dataSize) ||
       (canfdDataSize[6U] == dataSize) ||
       (canfdDataSize[7U] == dataSize) ||
       (canfdDataSize[8U] == dataSize) ||
       (canfdDataSize[9U] == dataSize) ||
       (canfdDataSize[10U] == dataSize) ||
       (canfdDataSize[11U] == dataSize) ||
       (canfdDataSize[12U] == dataSize) ||
       (canfdDataSize[13U] == dataSize) ||
       (canfdDataSize[14U] == dataSize) ||
       (canfdDataSize[15U] == dataSize))
    {
        return SystemP_SUCCESS;
    }

    return SystemP_FAILURE;
}