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!)