David Fraser
davidf at sjsoft.com
Thu Nov 11 05:51:51 EST 2004
I'm having a wierd bug on Windows XP with sendfile. I'm trying to send an image and the image gets corrupted. Sending the bytes directly through write works fine. I've simplified my handler down to bare-bones level and the bug still happens. Even leaving out content_type and send_http_header doesn't fix it... I've tried to reproduce this problem on Linux and Windows 2000 to no avail ... not sure if it is the platform or a bug on this particular machine, but it sure is odd. The file that is sent has exactly the same length but certain bytes are changed in it. They seem to be at fairly regular offsets, so it may be a bug in Apache's sendfile routine. The mod_python req.sendfile method looks fairly simple so I doubt its that. In at least one case (animals2_corrupted1.jpg), it was exact 8k chunks of files being replaced with zeroes, but it didn't seem to be consistent. In another case, (animals2_corrupted2.jpg), 4 bytes at n*0x1000+0x10 where replaced with 0x90008112, for various n, and one 8k block was replaced by 0s and sent in place of the next 8k block. I have tested with Firefox and wget to confirm that the problem is not browser-related. I couldn't find any significant difference in the headers between the host that worked and the one that didn't (both using Transfer-Encoding: chunked). Using latest Apache 2.0.52 and mod_python 3.1.3 (with some minor mods but all python, none to the sendfile method.) Here's the handler: def handler(req): """return a page that will be sent to the user""" req.content_type = "image/jpeg" req.send_http_header() jpegfile = os.path.join(os.path.dirname(__file__), 'animals2.jpg') req.sendfile(jpegfile) # req.write(open(jpegfile, 'rb').read()) return apache.OK The original file, animals2.jpg and some munged versions of it, animals2_corrupted{1,2,3,4}.jpg are available here: http://davidf.sjsoft.com/files/sendfile_corruption/ There are also hex dumps and diffs between the hex dumps in case they're useful Any ideas appreciated David
|