• # Sécurité ?

    Posté par (site web personnel, Mastodon) . En réponse à la dépêche Un nouveau serveur httpd : Ashd, A Sane HTTP Daemon. Évalué à 9.

    Fichier ashd/src/sendfile.c (je suis tombé sur ce fichier en tentant de compiler le bousin)

    static char *attrmimetype(char *file)
    {
    #ifdef HAVE_XATTR
    static char buf[1024];
    int i;
    ssize_t sz;

    if((sz = getxattr(file, "user.ash-mime-type", buf, sizeof(buf) - 1)) > 0)
    goto found;
    if((sz = getxattr(file, "user.mime-type", buf, sizeof(buf) - 1)) > 0)
    goto found;
    if((sz = getxattr(file, "user.mime_type", buf, sizeof(buf) - 1)) > 0)
    goto found;
    if((sz = getxattr(file, "user.Content-Type", buf, sizeof(buf) - 1)) > 0)
    goto found;
    return(NULL);
    found:
    for(i = 0; i < sz; i++) {
    if((buf[sz] < 32) || (buf[sz] >= 128))
    return(NULL);
    }
    buf[sz] = 0;
    return(buf);
    #else
    return(NULL);
    #endif
    }


    Bon, goto bien utilisé ça peut être pratique.

    Cependant, renvoyer l'adresse d'une variable locale c'est pas bien, et c'est encore pire quand elle est statique. Quid d'appels consécutifs, parallèles ?
    Les débutants utilisent la post-incrémentation et ne comprennent pas que ni sizeof ni return ne sont des fonctions.
    Le copier-coller c'est mal, DRY qu'il y'en a qui disent.

    Tiens, c'est pas documenté, donc on ne sait même pas qu'il faut copier 1024 - 1 caractère depuis le pointeur retourné dans un nouvel emplacement. Une fonction difficile à utiliser manipulant des chaînes conduit inexorablement à des problèmes de sécurité.

    Et je n'ai regardé qu'une fonciton.