Misuse of readlink()

Третий аргумент readlink не оставляет пробел для пустого терминатора строки в буфере

Описание

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

Например:

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

Риск

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

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

Фиксация

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

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

Примеры

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

#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();
    }
}

Информация о результате

Группа: безопасность
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: READLINK_MISUSE
Удар: Средняя
ID CWE: 170
Введенный в R2017a