[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