CERT C: правило POS30-C

Используйте readlink () функция правильно

Описание

Управляйте определением

Используйте readlink () функция правильно. [1]

Примеры

развернуть все

Описание

Неправильное употребление readlink () происходит, когда вы передаете аргумент buffer size readlink(), который не оставляет пробел для пустого терминатора строки в буфере.

Например:

ssize_t len = readlink("/usr/bin/perl", buf, sizeof(buf));
Третий аргумент точно равен размеру второго аргумента. Для достаточно больших символьных ссылок это использование readlink() не покидает пробел, чтобы ввести пустой терминатор строки.

Риск

Функция readlink() копирует содержимое символьной ссылки (первый аргумент) к буферу (второй аргумент). Однако функция не добавляет пустой терминатор строки к скопированному содержимому. После использования readlink() необходимо явным образом добавить пустой терминатор строки в буфер.

Если вы заполняете целый буфер при использовании readlink, вы не оставляете пробел для этого пустого терминатора строки.

Фиксация

При использовании функции readlink() убедитесь, что третий аргумент является тем меньше, чем buffer size.

Затем добавьте пустой терминатор строки к буферу. Чтобы определить, где добавить пустой терминатор строки, проверяйте возвращаемое значение readlink(). Если возвращаемое значение-1, ошибка произошла. В противном случае возвращаемое значение является количеством символов скопированные (байты).

Пример - неправильный аргумент размера readlink

#include <unistd.h>

#define SIZE1024 1024

extern void display_path(const char *);

void func() {
    char buf[SIZE1024];
    ssize_t len = readlink("/usr/bin/perl", buf, sizeof(buf));
    if (len > 0) {
        buf[len - 1] = '\0';
    }
    display_path(buf);
}

В этом примере третий аргумент readlink является точно размером буфера (второй аргумент). Если первый аргумент достаточно длинен, это использование readlink не оставляет пробел для пустого терминатора строки.

Кроме того, если никакие символы не копируются, возвращаемое значение readlink 0. Следующий оператор приводит к недостаточному наполнению буфера, когда len 0.

buf[len - 1] = '\0';

Исправление — Убеждается, что Аргумент Размера является Тем Меньше, Чем Buffer Size

Одно возможное исправление должно убедиться, что третий аргумент readlink является тем меньше, чем размер второго аргумента.

Следующий исправленный код также составляет readlink, возвращающийся 0.

#include <stdlib.h>
#include <unistd.h>

#define fatal_error() abort()
#define SIZE1024 1024

extern void display_path(const char *);

void func() {
    char buf[SIZE1024];
    ssize_t len = readlink("/usr/bin/perl", buf, sizeof(buf) - 1); 
    if (len != -1) {
        buf[len] = '\0';
        display_path(buf);
    }
    else {
        /* Handle error */
        fatal_error();
    }
}

Проверяйте информацию

Группа: правило 50. POSIX (POS)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.