Неправильное употребление readlink ()

Третий аргумент 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