Carlos a écrit :
That was my first try of the program :).

Darn! Not a good first impression I presume :p

It happens every time I try to
download that site. I tried now with

Okay, this is probably a difference with my glibc.

Yes, but the message is slightly different (51 files written instead of 50):

Okay - anyway this confirm my feeling (the uninitializing is bogus)

#4  0xb7d53141 in vfprintf () from /lib/i686/cmov/libc.so.6
#5  0xb7d5c152 in fprintf () from /lib/i686/cmov/libc.so.6
#6  0xb7e937b5 in filenote () from /usr/lib/libhttrack.so.2
#7  0xb7e92e1a in filecreate () from /usr/lib/libhttrack.so.2
#8  0xb7f3991f in verif_backblue () from /usr/lib/libhttrack.so.2

Ahah! verif_backblue() is using opt->state.strc.lst (a FILE*), which has a copy in another place (cache.lst), and which is being closed, and set to NULL, but not the copy (opt->state.strc.lst is still != NULL even after the file closing)

This is the probably explaination of this horrible bug (trying to write to a free'd FILE* object)

If you can, rebuild the sources using this patch:

--- htscore.c.orig      2008-03-16 22:12:14.184014020 +0100
+++ htscore.c   2008-03-16 22:11:26.000000000 +0100
@@ -167,7 +167,7 @@
     cache.zipInput = NULL; \
   } \
   if (cache.olddat) { fclose(cache.olddat); cache.olddat=NULL; } \
-  if (cache.lst) { fclose(cache.lst); cache.lst=NULL; } \
+ if (cache.lst) { fclose(cache.lst); cache.lst=opt->state.strc.lst=NULL; } \
   if (cache.txt) { fclose(cache.txt); cache.txt=NULL; } \
   if (opt->log) fflush(opt->log); \
   if (opt->log) fflush(opt->log);\

Or I can provide you a .deb package if you want to give it a try.

Thanks for the complete stack trace, which was really helpful (I spent two hours before that, trying to reproduce the issue without luck - my glibc is definitely nice when dealing with corruptions!)



Reply via email to