On 8/21/07, Hrvoje Nikšić <[EMAIL PROTECTED]> wrote: > On Mon, 2007-08-20 at 20:27 +0200, Maciej Fijalkowski wrote: > > import thread > > > > while 1: > > f = open("/tmp/dupa", "w") > > thread.start_new_thread(f.close, ()) > > f.close() > > file_close inadvertently allows fclose to be called twice on the same > stdio file. This patch should fix the problem:
The patch is insufficient to prevent all types of crashes that occur when accessing a file from 2 threads (closing in one and doing whatever in another). Almost every place that accesses f_fp is a problem. For example, try changing one of the f.close to f.tell. Or in the main thread do a write. With all of these changes to the test above, I was able to crash python with the patch (until I fixed the uses of f_fp). For example: import thread while 1: f = open("/tmp/dupa", "w") thread.start_new_thread(f.close, ()) try: f.write('a') f.close() except: pass I've attached a patch (against 2.5) that fixes most of the problems, but there are still a few more. (Search for Py_BEGIN_ALLOW_THREADS and check for usage of f_fp within the block.) I'm not convinced the attached patch is good enough though. I think there might already be a bug report about file not being thread-safe. (It could have also been socket, but I think Martin fixed a problem in socket a while ago.) n _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com