Главная проблема C-строк — функция strcpy(dest, src). Она копирует байты, пока не встретит нулевой символ. Если исходная строка длиннее буфера или в ней нет нулевого терминатора, происходит переполнение. Данные затираются, а если буфер на стеке — злоущик может переписать адрес возврата функции и выполнить свой код.
Первым исправлением стала strncpy(dest, src, n), где n — размер буфера назначения. Копирование останавливается на n байтах, но строка на выходе не гарантированно завершается нулём. Это породило горы кода вроде strncpy(dest, src, sizeof(dest)); dest[sizeof(dest)-1] = '\0'; — люди забывали про вторую строку, ошибались с размером (забывали -1). Кроме того, strncpy всегда копирует ровно n байт: если источник короче, она добивает буфер нулями. Программисты об этом часто не знали, а делалась лишняя работа.
Зачистка strncpy из ядра Linux заняла шесть лет и больше 360 патчей. Каждый случай разбирали отдельно — тупо заменить одну функцию на другую было нельзя. Новые функции ещё и возвращают понятные коды ошибок.
На смену strncpy пришёл набор функций, которые разделяют защиту от переполнения и добивку буфера. Основная замена — strscpy(dest, src, n). Она гарантирует, что dest будет строкой: если надо, ставит '\0' в конец, добивку нулями не делает, а при урезании возвращает E2BIG. Если нужно именно добить нулями — есть strscpy_pad(). Для копирования в фиксированное поле памяти (не в C-строку) — strtomem_pad(). Для копирования байт с явным заполнением — memcpy_and_pad(). Для обычного копирования фиксированного объёма — memcpy().
Старые функции в ядре часто имеют ассемблерные реализации под разные процессоры. Для новых таких версий почти нет — есть пространство для ускорения.
Итог: C со своей строковой библиотекой живёт с 1972 года. Тогда хакеры не волновали, а компьютеры не были в сети. API проектировали под скорость, а не под безопасность. Заплатки вроде strncpy давали трещины в других местах. Новые функции, по замыслу, сохраняют эффективность, но закрывают самые очевидные дыры. История с strncpy лишний раз напоминает, насколько важен хороший дизайн API.