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.

[参考译文] PROCESSOR-SDK-AM64X:当端点名称达到 31 个字符时、TI-rpmsg-char 端点创建失败

Guru**** 2564565 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1568112/processor-sdk-am64x-ti-rpmsg-char-endpoint-creation-failure-when-endpoint-name-reaches-31-characters

器件型号:PROCESSOR-SDK-AM64X


工具/软件:

您好:

我正在使用 ti-rpmsg-char v0.6.7原理图库。
它通常按预期工作、但如果生成的端点器件名称长度超过 31 个字符、应用程序将终止、并出现错误。
此时、/dev/rpmsg*器件也在不断增加。

以下是一个statusd应用示例(长度 31)eptdev_name = "rpmsg-char-fpgaconfig-9-1364841"

statusd[1364841]: 32 bytes read from /sys/devices/platform/bus@f4000/bus@f4000:bus@4000000/5000000.m4fss/remoteproc/remoteproc0/rproc-virtio.0.auto/virtio0/virtio0.rpmsg_ctrl.0.0/rpmsg/rpmsg_ctrl0/rpmsg16/name are larger than size 32

应用代码片段:

int rpmsg_open(void){
    char eptdev_name[64] = { 0 };
    int flags = 0;

    sprintf(eptdev_name, "rpmsg-char-fpgaconfig-%d-%d", RPROC_ID, getpid());
    rcdev = rpmsg_char_open(RPROC_ID, NULL, RPMSG_ADDR_ANY, FPGACONFIG_ENDPT,
                eptdev_name, flags);
    if (!rcdev) {
        perror("Can't create FPGA config endpoint device");
        return -EPERM;
    }
    printf("Created FPGA config endpt device %s, fd = %d port = %d\n",
           eptdev_name, rcdev->fd, rcdev->endpt);
    return 0;
}

从库源代码中、它看起来像:

  • "_rpmsg_char_create_eptdev"成功。

  • "_rpmsg_char_open_eptdev"呼叫“"。“。 _rpmsg_char_get_rpmsg_id"

  • 在“_rpmsg_char_get_rpmsg_id"、“内、file_read_string()"读取的字节超过 32 个 ( 包括换行符 )、这会导致错误。

  • "_rpmsg_char_destroy_eptdev"从不调用、从而留下/dev/rpmsg*设备。

相关检查:

if (!eptdev_name || strlen(eptdev_name) >= 32) {
    fprintf(stderr, "%s: invalid eptdev_name\n", __func__);
    goto unlock;
}

因此、当eptdev_name到达确切的 31 个字符时、函数通过了长度检查、但之后由于字符串加换行符超过缓冲区限制而失败。

问题:

  • 这是中的已知限制ti-rpmsg-char吗?

  • 是否应始终将端点命名限制为≤30 个字符以避免这种情况?

  • 或者file_read_string()"“和“是否应该_rpmsg_char_get_rpmsg_id()"更优雅地处理修剪/更长的名称?

希望提供有关预期行为和建议修复的任何指导。

谢谢、
一则

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    我已将该主题重新分配给合适的专家。 请稍后回复。

    谢谢您、

    Vaibhav

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Kazunori-San、

    感谢您报告此错误。 我们计划通过更改第一行来确认 strlen < 31 来修复它。 这在您的测试用例中是否有效?

    diff --git a/src/rpmsg_char.c b/src/rpmsg_char.c
    index cbf176f..9141a0f 100644
    --- a/src/rpmsg_char.c
    +++ b/src/rpmsg_char.c
    @@ -631,7 +631,7 @@ rpmsg_char_dev_t *rpmsg_char_open(enum rproc_id id, char *dev_name,
    goto unlock;
    }
    
    - if (!eptdev_name || strlen(eptdev_name) >= 32) {
    + if (!eptdev_name || strlen(eptdev_name) >= 31) {
    fprintf(stderr, "%s: invalid eptdev_name\n", __func__);
    goto unlock;
    }
    

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nick、

    感谢您的快速修复和澄清。

    我应用了建议的更改(检查 strlen < 31)并重新测试。
    通过此修改、当端点名称长度达到 32 个字符时、应用程序现在会报告:

    rpmsg_char_open: invalid eptdev_name
    Can't create FPGA config endpoint device

    在这种情况下、打开会按预期失败、并且不再创建其他/dev/rpmsg 设备。
    这解决了我们观察到的问题。

    感谢您的支持和及时解决。

    谢谢、
    一则

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Kazunori-San、

    很好、感谢您的测试! 接下来、我们将此修改合并到 ti-rpmsg-char 存储库中。

    此致、

    Nick