Уроки программирования от Red Hat

Security-отдел Red Hat (не "безопасники" в отечественном смысле слова) опубликовал пост в своем блоке, посвященный проблеме с семейством функций strcpy, strcat, sprintf. Увы, но несмотря на общее распространенное мнение, что эти функции использовать нежелательно, их все еще используют в разных проектах, в т.ч. и очень известных. Но проблема в том, что за просто так, просто перейдя на использование strncpy, strncat, strnprintf, программа не станет безопасной, волшебным образом лишившись buffer overflow. В заметке как раз и разбирают еще один типичный паттерн программирования, который теоретически (и порой, практически) приводит к buffer overflow. Обратите внимание, если вы разрабатываете на C, и если вы пока еще не видите проблем в данном фрагменте кода:

    /* buff is a pointer to a buffer of blen characters. */
    /* Note well: This example is now incorrect. */
    char *cp = buff;
    if ((n = snprintf(cp, blen, "AF=%d ", sau->soa.sa_family)) < 0) {
        Warn1("sockaddr_info(): buffer too short ("F_Zu")", blen);
        *buff = '';
        return buff;
    }
    cp += n,  blen -= n;


Заметили? Если нет, то прочитайте.