[Linux-bruxelles] segfault dans evolution-vcard-importer

Frederic Peters fpeters at entrouvert.com
Jeu 20 Mai 19:06:53 CEST 2004


Dany De Bontridder écrivait :

> Les problèmes est si len devient > à 65536 alors plantage, car buf
> limité à 65536 (et dernier char doit être égal à \0)
> 
> Que faire ? 
> ajouter un test : if ( (len += strlen(line) ) > sizeof (buf) ) 
> 							g_error("File too big !!!");

Pas du tout, c'est de l'amputage inutile.  Pourquoi partir en pleurant
des points d'exclamation alors qu'il est tout à fait possible de gérer
les fichiers de toute taille ?


Le code pourrait ainsi devenir:

char* read_file (char *name)
{
	char *buf;
	size_t len;
	FILE *f;

	f = fopen(name, "r");
	if (f == NULL) {
		g_error ("Unable to open %s!\n", name);
	}

	fseek(f, 0, SEEK_END);
	len = ftell(f);
	buf = g_malloc(len+1);
                /* non, ne venez pas dire que la valeur de buf devrait
                 * être vérifiée ici avant d'avoir lu g_malloc() */
	fseek(f, 0, SEEK_SET);
	fread(buf, len, 1, f);
        fclose(f);
	
	return buf;
}

Et puis, on peut continuer à explorer la GLib et découvrir qu'il y a
moyen de faire:

char* readfile (char *name)
{
        gboolean rc;
        gsize len;
        gchar *contents;
        GError *errors;

        rc = g_file_get_contents(name, &contents, &len, &errors);
        if ( rc == FALSE ) {
                /* ici, on pourrait regarder dans errors pour dire ce
                 * qui s'est mal passé */
                g_error("badaboom\n");
        }
        
        return contents;
}



        Frédéric

-- 
Clear Channel ou comment aider la réélection de Bush Jr en allant
à Rock Werchter !  -> toutes les infos sur http://www.hailtocc.org




Plus d'informations sur la liste de diffusion Linux-bruxelles