gpt4 book ai didi

c - 依赖 PATH_MAX 会导致溢出

转载 作者:太空狗 更新时间:2023-10-29 11:26:46 27 4
gpt4 key购买 nike

如您所知,PATH_MAX 是用于指示环境变量(在本例中为 PATH 变量)的最大大小的值,但在大多数情况下并非局部情况看一下用于将环境变量复制到大小为 PATH_MAX

的数组中的代码
  char env[PATH_MAX]; 
strcpy(path, getenv("PATH"));

如果你看到它很容易溢出,有人会说使用 strncpy 这样你就可以避免溢出,但是如果你使用它并且 PATH 很大那么 MAX_PATH 我们将无法获得完整的 PATH env 变量,这让我思考,我如何在不应该​​溢出或丢失的假设下获得 PATH env 变量数据

最佳答案

一般如果您需要复制一个未知长度的字符串,使用 strncpy 复制到具有大小限制的固定大小缓冲区(但要注意如果字符串太长则不终止字符串的不便行为)。

或使用 strdup malloc 一个副本。


as you know PATH_MAX is value use to indicate the max size of an environment variable (in this case PATH variable)

不,不是;它与$PATH无关还是环境!!

这是单个文件系统路径名的最大长度。例如/foo/bar/verylongdirectoryname/x/y.txt保证最多为 PATH_MAX在长度上。否则您可能无法使用绝对路径读取它,而不得不改用 chdir 进入该树并使用相对路径。

PATH environment 就像任何其他 env var 一样只是一个扁平字符串;内核不会将它们裁剪到固定长度。或者肯定不会限制在 PATH_MAX .

how I could get the PATH env variable with the assumption that should be no overflow nor loss of data

呃,你已经有了 getenv("PATH") 。这将返回指向进程内存空间中现有字符串的指针。它在静态存储中有效;你不需要复制它和将来调用 getenv不会破坏指针。 (在 Linux 上,环境变量在进程启动时位于 argv 之上的堆栈上。在任何东西移动堆栈指针之前运行的 CRT 启动代码在全局 envp 中存储指向它们的指针,稍后 getenv 可以在其中找到它。)

如果你想复制环境变量的缓冲区以便你可以延长它,或者在不改变原来的情况下修改它,最简单的选择是 strdup(3) from <string.h> malloc 一个副本。(POSIX 2008,以及之前的 BSD、GNU C 和之前的各种其他系统)。或者 strndup设置要复制的字节数限制。

GNU C 甚至有一个基于 alloca 而不是 malloc 的版本,以防你想要一个更便宜的自动临时存储。


PATH_MAX

PATH_MAX例如在类似 getwd(3) 的 POSIX 函数中是相关的 您提供缓冲区但没有长度限制的地方。 (但实际上您应该改用 char *getcwd(char *buf, size_t size);请参阅与 getwd 相同的链接。手册页还说:

Note that on some systems, PATH_MAX may not be a compile-time constant; furthermore, its value may depend on the filesystem, see pathconf(3).


Linux readdir(3)手册页没有这么说,但是 struct dirent成员(member)char d_name[256]; /* Null-terminated filename */之所以这样调整大小是因为 PATH_MAX = 255。(或更准确地说,由于 readdir 大小限制,PATH_MAX 为 255。)


此外,系统调用如 chdir(2)open(2)允许在长于 PATH_MAX 的路径上失败( ENAMETOOLONG ):

ENAMETOOLONG
A pathname, or a component of a pathname, was too long.

readlink(2) 采用缓冲区大小,因此不需要限制链接目标的长度;它只提到 ENAMETOOLONG 作为您提供的路径可能出现的错误,而不是链接名称。


即使在现代 Linux 上,单个文件名 255 个字节也是硬性限制。但是 IIRC 它确实选择允许更长的路径名(具有多个目录组件)。 POSIX 规范不要求 open() 的错误在很长的路径上,因此操作系统可以提供一个相当小的 PATH_MAX,但在可能的情况下仍然适用于更长的路径。

关于c - 依赖 PATH_MAX 会导致溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56921129/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com