Re: Possible endless loop in lto-wrapper
Hi Rafael, I'm sorry I cannot try the patch until next weekend. However, from a first look, it should work but I wonder: if the first maybe_unlink_file fails the others are never reached, leaving some temporary files in place. Is this ok? Yes, I talked with Diego and he thinks that this is an unusual case and it is better to just give up when the first unlink fails. I have committed the patch, let me know if you see any issues. Thank you, Leandro -- Caselle da 1GB, trasmetti allegati fino a 3GB e in piu' IMAP, POP3 e SMTP autenticato? GRATIS solo con Email.it: http://www.email.it/f Cheers, -- Rafael Ávila de Espíndola
Re: Possible endless loop in lto-wrapper
2009/11/22 Leandro Nini drfiem...@email.it: Hi, in gcc-4.5 lto-wrapper may end up in an endless loop in case of error: if for example a 'maybe_unlink_file' call from 'lto_wrapper_exit' fails it calls 'fatal_perror' which in turn calls 'lto_wrapper_exit' again causing an infinity of lto-wrapper: deleting LTRANS file /tmp/ccWjXUv8.lto.o: No such file or directory error messages on the console. I've solved this by substituting 'maybe_unlink_file' with 'unlink_if_ordinary' whithin the 'lto_wrapper_exit' function. Not sure if this is the best fix but hope it helps. Thanks for finding the bug! I think that we need something similar to what was done in the linker: Avoid trying to start a new cleanup if we are already in one. Leandro, can you try the attached patch? Diego, OK if it works? 2009-11-23 Rafael Avila de Espindola espind...@google.com * lto-wrapper.c (lto_wrapper_exit): Don't try to delete files if being called recursively. Best Regards, Leandro -- Cheers, -- Rafael Ávila de Espíndola Index: gcc/lto-wrapper.c === --- gcc/lto-wrapper.c (revision 154452) +++ gcc/lto-wrapper.c (working copy) @@ -66,12 +66,20 @@ static void lto_wrapper_exit (int status) { - if (ltrans_output_file) -maybe_unlink_file (ltrans_output_file); - if (flto_out) -maybe_unlink_file (flto_out); - if (args_name) -maybe_unlink_file (args_name); + static bool cleanup_done = false; + if (!cleanup_done) +{ + /* Setting cleanup_done prevents an infinite loop if one of the + calls to maybe_unlink_file fails. */ + cleanup_done = true; + + if (ltrans_output_file) +maybe_unlink_file (ltrans_output_file); + if (flto_out) +maybe_unlink_file (flto_out); + if (args_name) +maybe_unlink_file (args_name); +} exit (status); }
Re: Possible endless loop in lto-wrapper
On Mon, Nov 23, 2009 at 13:59, Rafael Espindola espind...@google.com wrote: 2009-11-23 Rafael Avila de Espindola espind...@google.com * lto-wrapper.c (lto_wrapper_exit): Don't try to delete files if being called recursively. OK. Diego.