Fermeture de fichier après utilisation zip.
Bonjour
J'aurais aimé faire mieux (voir http://www.developpez.net/forums/d11...copie-fichier/ ), mais encore faudrait-il que ce que je fais déjà marche correctement !
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11
| fichier=enregistre_tmp_xml(ooo);
tmp1=chemin_exe();
sprintf(affichage,"%s%cLibO%cfeuille.zip",tmp1,SEPARATEUR,SEPARATEUR);
sprintf(aff,"%s%c%s.odt",((char **)param)[CHEMIN],SEPARATEUR,((char **)param)[NOM]);
copie_fichier(aff,affichage);
f_zip=zip_open(aff,ZIP_CREATE,NULL); /* lignes (1) */
n_zip=zip_source_filep(f_zip,fichier,0,0); /* récupération du fichier sous forme FILE * sans avoir à le copier sur le disque */ /* lignes (1) */
zip_replace(f_zip,zip_name_locate(f_zip,"content.xml",ZIP_FL_NOCASE) ,n_zip); /* on l'injecte dans l'archive en lui donnant un nom */ /* lignes (1) */
zip_close(f_zip); /* on ferme l'archive */ /* lignes (1) */
free(tmp1);
fclose(fichier); |
La première ligne récupère un file * ouvert avec "FILE * sortie=tmpfile();"
Lors de la fermeture de ce fichier (dernière ligne), j'ai un plantage du programme :
Code:
1 2 3 4 5
| *** glibc detected *** ./perso: double free or corruption (!prev): 0x0000000001024100 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x78a96)[0x7f826a132a96]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x6c)[0x7f826a136d7c]
/lib/x86_64-linux-gnu/libc.so.6(fclose+0x155)[0x7f826a122715] |
Ce que je ne comprends pas, c'est que si je commente les 4 lignes marquées en fin avec /* lignes (1) */, je n'ai plus ce plantage :(
Le problème est encore simplifiable en remplaçant la première ligne par "fichier=tmpfile(); //enregistre_tmp_xml(ooo);", ça plante encore !
Le plantage a bien lieu lors du "fclose(fichier)" et tout ce qui a été fait avant a bien été fait (fichier de sortie vérifié).
J'avoue ne pas comprendre la raison de ce plantage testé sous ubuntu 11.10 et mageia 2.