Буфер назначения getwd
или realpath
меньше PATH_MAX
байты
Этот дефект возникает, когда целевой аргумент функции манипуляции путем, такой как realpath
или getwd
имеет buffer size меньше PATH_MAX
байты.
Буфер меньше PATH_MAX
байты могут переполняться, но вы не можете протестировать функцию возврата значением, чтобы определить, произошло ли переполнение. Если происходит переполнение, после вызова функции содержимое буфера не определено.
Для образца, char *getwd(char *buf)
копирует абсолютный путь к имени текущей папки в ее аргумент. Если длина абсолютного имени пути больше PATH_MAX
байты, getwd
возвращает NULL
и содержимое *buf
не определено. Можно проверить возврат значение getwd
для NULL
чтобы увидеть, был ли вызов функции успешным.
Однако, если разрешенный буфер для buf
меньше PATH_MAX
bytes, отказ может произойти для меньшего абсолютного имени пути. В этом случае getwd
не возвращается NULL
даже если произошел отказ. Поэтому допустимый буфер для buf
должен быть PATH_MAX
bytes long.
Возможные исправления:
Используйте buffer size PATH_MAX
байты. Если вы получаете буфер из неизвестного источника, прежде чем использовать буфер в качестве аргумента getwd
или realpath
function, убедитесь, что размер меньше PATH_MAX
байты.
Используйте функцию манипуляции путем, которая позволяет вам задать buffer size.
Например, если вы используете getwd
чтобы получить абсолютное имя пути к текущей папке, используйте char *getcwd(char *buf, size_t size);
вместо этого. Дополнительный аргумент size
позволяет вам задать размер, больший или равный PATH_MAX
.
Разрешить функции динамически выделять дополнительную память, если это возможно.
Для образца, char *realpath(const char *path, char *resolved_path);
динамически выделяет память, если resolved_path
является NULL
. Тем не менее, вы должны отселить эту память позже, используя free
функция.
Группа: Статическая память |
Язык: C | C++ |
По умолчанию: Off |
Синтаксис командной строки: PATH_BUFFER_OVERFLOW |
Влияние: Высокий |
ИДЕНТИФИКАТОР CWE: 785 |