Ticket Change Details
Overview

Artifact ID: 8761fe60558fdd422b8a3736036f7915cb6dd185
Ticket: 0990f53b1a77cacafccaf440d277edeae0cab70a
PNG files in Metakit4 VFSes fail to be read correctly
User & Date: rkeene on 2010-10-16 21:13:32
Changes

  1. 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</li></tt>
          <li><tt>mk4vfs1</li></tt>
          <li><tt>% cd x</li></tt>
          <li><tt>% glob *</li></tt>
          <li><tt>cross.png</li></tt>
          <li><tt>% set fd <nowiki>[open cross.png]</nowiki></li></tt>
          <li><tt>mk7</li></tt>
          <li><tt>% fconfigure $fd -translation binary</li></tt>
          <li><tt>% set data <nowiki>[read $fd]</nowiki>; puts <nowiki>[string length $data]</nowiki></li></tt>
          <li><tt>655</li></tt>
          <li><tt>% binary scan $data H* data_hex</li></tt>
          <li><tt>1</li></tt>
          <li><tt>% puts $data_hex</li></tt>
          <li><tt>89504e470d0a1a0a0000000d49484452</li></tt>
          <li><tt>000000100000001008060000001ff3ff</li></tt>
          <li><tt>610000000467414d410000afc837058a</li></tt>
          <li><tt>e90000001974455874536f6674776172</li></tt>
          <li><tt>650041646f626520496d616765526561</li></tt>
          <li><tt>647971c9653c000002214944415438cb</li></tt>
          <li><tt>9593eb4e135114858989c989cfa05689</li></tt>
          <li><tt>86c89180c41b425b0628ad0d0826d0fb</li></tt>
          <li><tt>855ea480b4a5eda44da136ea0f4d7c12</li></tt>
          <li><tt>9f0b44c5deb0d299763ad3e5ae984a2d</li></tt>
          <li><tt>25e1c74ece64cefaf6acb5f70c0018b8</li></tt>
          <li><tt>4cd5d742d7ce3e775f10333a2ade57ec</li></tt>
          <li><tt>0f72d9ed8dd76c4e432fa02dceeca295</li></tt>
          <li><tt>ce428b277b20755f80d703613436b6f0</li></tt>
          <li><tt>ebe5cae7eae2d2bd7f80bf62e4dfa145</li></tt>
          <li><tt>a525443437b73b10d9bbc6a93b9ad138</li></tt>
          <li><tt>90cba37d3e365be3e519d39553402acd</li></tt>
          <li><tt>5a09516bedbe013e7e8296cdb5016804</li></tt>
          <li><tt>425cf6f8397587b21d03e8bdec0fe078</li></tt>
          <li><tt>feb95a16e6ae7659d06209a6be8ea99a</li></tt>
          <li><tt>9801de7f809a4aa31e0c83ba43d98a02</li></tt>
          <li><tt>d9bd3fe78ac942e259766e88cdc8266b</li></tt>
          <li><tt>84d6d5667487ecbc05f6f224cc01992c</li></tt>
          <li><tt>648f0f9539b35a9e9e61fda7701a1693</li></tt>
          <li><tt>5c5e0d59b2e3f6010e3720a651999dd7</li></tt>
          <li><tt>4a4681fd7fbf0720393ded5101340dd8</li></tt>
          <li><tt>9cc08a1dd849926f0b0a1353fc4280e4</li></tt>
          <li><tt>7073c9e581128e004991842920467628</li></tt>
          <li><tt>4079d58eb2de88ef63e3fc5c40cdeee2</li></tt>
          <li><tt>92d30d25b40ed01825870b14965a9c32</li></tt>
          <li><tt>68278bcb406403b517cb283c7c8cc3a1</li></tt>
          <li><tt>61de05a0cde2d41d4af015754d40a24f</li></tt>
          <li><tt>a7b0d4e2a481159e4cb0a3f1476ad564</li></tt>
          <li><tt>0682219c58ac381a19c5c1ad41de01d0</li></tt>
          <li><tt>6609359b034a200469d5010a4b2d3ed3</li></tt>
          <li><tt>7702fb3632c6be0edf577f1a0548d605</li></tt>
          <li><tt>fc187d80fd1b3aa1cb026d96505d5842</li></tt>
          <li><tt>c930ad51583d691fde1d625f06efa867</li></tt>
          <li><tt>c53d2196f446a1f07492f5fb990e74b7</li></tt>
          <li><tt>d9fef59bc28563bc6cfd0672bba4c7db</li></tt>
          <li><tt>edbe140000000049454e44ae426082</li></tt>
        </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>