Overview
Artifact ID: | 0cf55f14c838020cd6666d951f70a17dab23de44 |
---|---|
Ticket: | 0990f53b1a77cacafccaf440d277edeae0cab70a
PNG files in Metakit4 VFSes fail to be read correctly |
User & Date: | rkeene on 2010-10-16 21:17:26 |
Changes
- comment changed to:
Reported by JDC: http://groups.google.com/group/starkit/browse_frm/thread/5827418f4a2b80e7 PNG files read from an mk4vfs can fail to be read. Likely an issue in vfs::zstreamed in tclvfs. It happens on non-KitCreator Tclkits too. <hr /><i>rkeene added on 2010-10-13 15:29:31:</i><br /> <ol> <li> Create mk4vfs <ol> <li><tt>$ mkdir x.vfs</tt></li> <li><tt>$ cp cross.png x.vfs/</tt></li> <li><tt>$ ./tclkit-8.5.9-linux-i686 sdx.kit wrap x</tt></li> <li><tt>1 updates applied</tt></li> </ol> </li> <li> Test reading "cross.png" from the mk4vfs <ol> <li><tt>% vfs::mk4::Mount x x</tt></li> <li><tt>mk4vfs1</tt></li> <li><tt>% cd x</tt></li> <li><tt>% glob *</tt></li> <li><tt>cross.png</tt></li> <li><tt>% set fd <nowiki>[open cross.png]</nowiki></tt></li> <li><tt>mk7</tt></li> <li><tt>% fconfigure $fd -translation binary</tt></li> <li><tt>% set data <nowiki>[read $fd]</nowiki>; puts <nowiki>[string length $data]</nowiki></tt></li> <li><tt>655</tt></li> <li><tt>% binary scan $data H* data_hex</tt></li> <li><tt>1</tt></li> <li><tt>% puts $data_hex</tt></li> <li><tt>89504e470d0a1a0a0000000d49484452</tt></li> <li><tt>...</tt></li> <li><tt>d9fef59bc28563bc6cfd0672bba4c7db</tt></li> <li><tt>edbe140000000049454e44ae426082</tt></li> </ol> </li> </ol> <hr /><i>rkeene added on 2010-10-13 15:42:47:</i><br /> It works in the trivial case posted previously, but fails with the following kit: http://code.google.com/p/wubwikit/downloads/detail?name=wub-20100922.kit In the kit: <verbatim> % set fd [open cross.png] mk7 % fconfigure $fd -encoding binary % set data [read $fd]; puts [string length $data] 654 % file stat cross.png x % parray x x(atime) = 1285147347 x(blksize) = 135312827 x(blocks) = 583863729869319636 x(ctime) = 1285147347 x(dev) = -143965300 x(gid) = 0 x(ino) = 0 x(mode) = 33279 x(mtime) = 1285147347 x(nlink) = 1 x(size) = 655 x(type) = file x(uid) = 0 </verbatim> <hr /><i>rkeene added on 2010-10-13 15:45:53:</i><br /> Still not sure where this is failing. <verbatim> % mk::loop x db.dirs!90.files { puts "$x, [mk::get $x name]" } db.dirs!90.files!0, cross.png db.dirs!90.files!1, tick.png db.dirs!90.files!2, tclp.gif % mk::view info db.dirs!90.files name size:I date:I contents:B % mk::get db.dirs!90.files!0 size 655 % string length [mk::get db.dirs!90.files!0 contents] 655 % mk::get db.dirs!90.files!0 -size contents 655 % </verbatim> <hr /><i>rkeene added on 2010-10-13 15:52:42:</i><br /> Oh, wait I did "-encoding binary" in my second test where it should have been "-translation binary". Using "-translation binary" causes it to be read correctly. <verbatim> % set fd [open cross.png r] mk7 % fconfigure $fd -translation binary % set data [read $fd]; puts [string length $data] 655 % binary scan $data H* data_hex 1 </verbatim> <hr /><i>rkeene added on 2010-10-16 21:12:41:</i><br /> The issue only occurs when using <nowiki>[fcopy]</nowiki> and mk4vfs channels without direct mode. Simple test: <verbatim> vfs::mk4::Mount test.mk /TEST set fd [open /TEST/cross.png] fconfigure $fd -translation binary set out [open /dev/null w] set ::fcopy_complete 0 proc fcopy_complete {args} { set ::fcopy_complete 1 } fcopy $fd $out -command fcopy_complete after 3000 update puts "FCOPY: $fcopy_complete" </verbatim> <hr /><i>rkeene added on 2010-10-16 21:14:10:</i><br /> P. Thoyts came up with a patch for this: http://github.com/patthoyts/kitgen/commit/3ee246892b79bb83c8c96a2646124c6da94bbd3e <hr /><i>rkeene added on 2010-10-16 21:15:12:</i><br /> Patch from P. Thoyts fixes the problem, but the test case segfaults on exit. Backtrace follows: <verbatim> (gdb) bt #0 0x08075599 in Tcl_GetAssocData () #1 0x0804d67a in mkClose (instanceData=0x8170380, interp=0x0) at ../tcl/mk4tcl.cpp:326 #2 0x080b86de in TclFinalizeIOSubsystem () #3 0x0809d004 in Tcl_FinalizeThread () #4 0x0809d160 in Tcl_Finalize () #5 0x0809d518 in Tcl_Exit () #6 0x08080274 in Tcl_ExitObjCmd () #7 0x08077903 in TclEvalObjvInternal () #8 0x0807857d in Tcl_EvalEx () #9 0x080bf7d7 in Tcl_FSEvalFile () #10 0x080c2d52 in Tcl_Main () #11 0x0804c2aa in main (argc=135724192, argv=0x2004) at main.c:11 (gdb) </verbatim>