Skip to content

Commit

Permalink
fix: fixes a bug parsing the git index when ctime is blank (isomorphi…
Browse files Browse the repository at this point in the history
  • Loading branch information
billiegoose authored Aug 14, 2018
1 parent 221daa4 commit 043f25e
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 50 deletions.
79 changes: 37 additions & 42 deletions .extra/git index.grammar
Original file line number Diff line number Diff line change
@@ -1,59 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<ufwb version="1.17">
<grammar name="git index" start="id:3" author="William Hilton" email="wmhilton@gmail.com">
<grammar name="git index" start="id:1" author="William Hilton" email="wmhilton@gmail.com">
<description>Grammar for https://github.com/git/git/blob/master/Documentation/technical/index-format.txt</description>
<structure name="git index" id="3" encoding="ISO_8859-1:1987" endian="big" signed="no">
<binary name="MAGIC" id="5" strokecolor="FEFFFF" fillcolor="AA7941" length="4"/>
<number name="version" id="6" fillcolor="AA7941" type="integer" length="4"/>
<number name="entries_len" id="7" fillcolor="00F900" type="integer" length="4"/>
<structure name="entry" id="8" length="0" alignment="0" repeat="id:7" repeatmin="0" repeatmax="-1">
<number name="ctime" id="10" fillcolor="00FCFF" type="integer" length="4"/>
<number name="ctime_ns" id="11" fillcolor="00FCFF" type="integer" length="4"/>
<number name="mtime" id="12" fillcolor="FEFB00" type="integer" length="4"/>
<number name="mtime_ns" id="13" fillcolor="FEFB00" type="integer" length="4"/>
<number name="dev" id="20" type="integer" length="4"/>
<number name="ino" id="14" fillcolor="FEFFFF" type="integer" length="4"/>
<structure name="mode" id="15" length="4" fillcolor="FEFFFF">
<binary name="unused1" id="21" length="16" lengthunit="bit"/>
<binary name="type" id="17" fillcolor="FF9200" length="4" lengthunit="bit">
<structure name="git index" id="1" encoding="ISO_8859-1:1987" endian="big" signed="no">
<binary name="MAGIC" id="2" strokecolor="FEFFFF" fillcolor="AA7941" length="4"/>
<number name="version" id="3" fillcolor="AA7941" type="integer" length="4"/>
<number name="entries_len" id="4" fillcolor="00F900" type="integer" length="4"/>
<structure name="entry" id="5" length="0" alignment="4" repeat="id:4" repeatmin="0" repeatmax="-1" valueexpression="path">
<number name="ctime" id="6" fillcolor="00FCFF" type="integer" length="4"/>
<number name="ctime_ns" id="7" fillcolor="00FCFF" type="integer" length="4"/>
<number name="mtime" id="8" fillcolor="FEFB00" type="integer" length="4"/>
<number name="mtime_ns" id="9" fillcolor="FEFB00" type="integer" length="4"/>
<number name="dev" id="10" type="integer" length="4"/>
<number name="ino" id="11" fillcolor="FEFFFF" type="integer" length="4"/>
<structure name="mode" id="12" length="4" fillcolor="FEFFFF">
<binary name="unused1" id="13" length="16" lengthunit="bit"/>
<binary name="type" id="14" fillcolor="FF9200" length="4" lengthunit="bit">
<fixedvalues>
<fixedvalue name="file" value="08"/>
<fixedvalue name="symlink" value="10"/>
<fixedvalue name="gitlink" value="14"/>
</fixedvalues>
</binary>
<binary name="unused2" id="18" length="3" lengthunit="bit"/>
<binary name="permissions" id="19" length="9" lengthunit="bit">
<binary name="unused2" id="15" length="3" lengthunit="bit"/>
<number name="permissions" id="16" type="integer" length="9" lengthunit="bit" display="octal">
<fixedvalues>
<fixedvalue name="null" value="0000"/>
<fixedvalue name="755" value="01ED"/>
<fixedvalue name="644" value="01A4"/>
<fixedvalue name="755" value="1363o"/>
<fixedvalue name="644" value="1204o"/>
<fixedvalue name="null" value="0o"/>
</fixedvalues>
</binary>
</number>
</structure>
<number name="uid" id="22" fillcolor="00D3D5" type="integer" length="4"/>
<number name="gid" id="23" fillcolor="00A7A9" type="integer" length="4"/>
<number name="size" id="24" fillcolor="00F941" type="integer" length="4"/>
<binary name="sha" id="25" fillcolor="D71E00" length="20"/>
<structure name="flags" id="28">
<binary name="assume_valid" id="30" length="1" lengthunit="bit"/>
<number name="extended" id="40" type="integer" length="1" lengthunit="bit"/>
<binary name="stage" id="32" length="2" lengthunit="bit"/>
<number name="name_length" id="33" type="integer" length="12" lengthunit="bit"/>
<structure name="extended_flags" id="34" length="0" repeat="id:40" repeatmin="0">
<binary name="reserved" id="36" length="1" lengthunit="bit"/>
<binary name="skip_worktree" id="37" length="1" lengthunit="bit"/>
<binary name="intent_to_add" id="38" length="1" lengthunit="bit"/>
<binary name="unused3" id="39" length="13" lengthunit="bit"/>
</structure>
<number name="uid" id="18" fillcolor="00D3D5" type="integer" length="4"/>
<number name="gid" id="19" fillcolor="00A7A9" type="integer" length="4"/>
<number name="size" id="20" fillcolor="00F941" type="integer" length="4"/>
<binary name="sha" id="21" fillcolor="D71E00" length="20"/>
<number name="assume_valid" id="23" type="integer" length="1" lengthunit="bit"/>
<number name="extended" id="24" type="integer" length="1" lengthunit="bit"/>
<number name="stage" id="25" type="integer" length="2" lengthunit="bit"/>
<number name="name_length" id="26" type="integer" length="12" lengthunit="bit"/>
<structure name="extended_flags" id="27" length="0" repeat="id:24" repeatmin="0">
<binary name="reserved" id="28" length="1" lengthunit="bit"/>
<binary name="skip_worktree" id="29" length="1" lengthunit="bit"/>
<binary name="intent_to_add" id="30" length="1" lengthunit="bit"/>
<binary name="unused3" id="31" length="13" lengthunit="bit"/>
</structure>
<string name="path" id="27" fillcolor="AA81FF" type="zero-terminated" encoding="UTF-8"/>
<binary name="&lt;Binary Fill Bytes&gt;" mustmatch="yes" id="26" unused="yes" repeatmin="0" repeatmax="7" length="1">
<fixedvalues>
<fixedvalue name="null" value="00"/>
</fixedvalues>
</binary>
<string name="path" id="34" fillcolor="AA81FF" type="fixed-length" length="name_length" encoding="UTF-8"/>
<binary name="padding" id="35" length="if(8-mod(name_length + 6, 8), 8-mod(name_length + 6, 8), 8)"/>
</structure>
<binary name="shasum" id="37" fillcolor="D74941" length="20"/>
</structure>
</grammar>
</ufwb>
24 changes: 16 additions & 8 deletions src/models/GitIndex.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,17 +77,25 @@ function parseBuffer (buffer) {
message: `Got a path length of: ${pathlength}`
})
}
// TODO: handle pathnames larger than 12 bits
entry.path = reader.toString('utf8', pathlength)
// The next bit is awkward. We expect 1 to 8 null characters
let tmp = reader.readUInt8()
if (tmp !== 0) {
throw new GitError(E.InternalFail, {
message: `Expected 1-8 null characters but got '${tmp}'`
})
// such that the total size of the entry is a multiple of 8 bits.
// (Hence subtract 12 bytes for the header.)
let padding = 8 - ((reader.tell() - 12) % 8)
if (padding === 0) padding = 8
while (padding--) {
let tmp = reader.readUInt8()
if (tmp !== 0) {
throw new GitError(E.InternalFail, {
message: `Expected 1-8 null characters but got '${tmp}' after ${entry.path}`
})
} else if (reader.eof()) {
throw new GitError(E.InternalFail, {
message: 'Unexpected end of file'
})
}
}
let numnull = 1
while (!reader.eof() && reader.readUInt8() === 0 && numnull < 9) numnull++
reader.seek(reader.tell() - 1)
// end of awkward part
_entries.set(entry.path, entry)
i++
Expand Down

0 comments on commit 043f25e

Please sign in to comment.