Skip to content

Commit 5726b16

Browse files
committed
Fix bug with OFS objects with length < 128 bytes
* Also remove unnecessary logging statements
1 parent 3e6e6d9 commit 5726b16

File tree

3 files changed

+21
-32
lines changed

3 files changed

+21
-32
lines changed

delta.go

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bytes"
55
"fmt"
66
"io"
7-
"log"
87
"os"
98
)
109

@@ -15,9 +14,9 @@ func patchDelta(start io.ReadSeeker, delta io.Reader) (io.Reader, error) {
1514

1615
// First, read the source and target lengths (varints)
1716
// we can ignore err as long as we check deltar.err at the end
17+
// we have no need for the targetLength right now, so we discard it
1818
sourceLength, _ := parseVarInt(deltar)
19-
targetLength, _ := parseVarInt(deltar)
20-
log.Printf("Expecting target length %d", targetLength)
19+
_, _ = parseVarInt(deltar)
2120
if deltar.err != nil {
2221
return nil, deltar.err
2322
}
@@ -37,7 +36,6 @@ func patchDelta(start io.ReadSeeker, delta io.Reader) (io.Reader, error) {
3736

3837
// b represents our command itself (opcode)
3938
b := bs[0]
40-
log.Printf("b is %08b", b)
4139
switch b & 128 {
4240
case 128:
4341
// b is a copy instruction
@@ -64,29 +62,24 @@ func patchDelta(start io.ReadSeeker, delta io.Reader) (io.Reader, error) {
6462
// if the fifth bit from the right is set, read the next byte
6563
// The number of copy bytes must fit into
6664

67-
var numBytes uint = 0
65+
var numBytes uint
6866

6967
if (b & 16) > 0 {
7068
numBytes = numBytes | uint(uint(deltar.readByte(true)))
71-
log.Printf("16 %d", numBytes)
7269
}
7370
if (b & 32) > 0 {
7471
numBytes = numBytes | uint((uint(deltar.readByte(true)) << 8))
75-
log.Printf("32 %d", numBytes)
7672
}
7773

7874
if (b & 64) > 0 {
7975
numBytes = numBytes | uint((uint(deltar.readByte(true)) << 16))
80-
log.Printf("64 %d", numBytes)
8176
}
8277

8378
// Default to 0x10000 due to overflow
8479
if numBytes == 0 {
8580
numBytes = 65536
8681
}
8782

88-
log.Printf("copy offset %d", baseOffset)
89-
log.Printf("copy length %d", numBytes)
9083
// read numBytes from source, starting at baseOffset
9184
// and write that to the target
9285
base.Seek(int64(baseOffset), os.SEEK_SET)
@@ -112,7 +105,6 @@ func patchDelta(start io.ReadSeeker, delta io.Reader) (io.Reader, error) {
112105

113106
numBytes := int(b)
114107
buf := make([]byte, numBytes)
115-
log.Printf("Inserting %d", numBytes)
116108
deltar.read(buf)
117109
_, err := result.Write(buf)
118110
if err != nil {
@@ -219,9 +211,6 @@ func (er *errReader) readByte(p ...bool) byte {
219211
}
220212
er.err = fmt.Errorf("expected to read single byte and read none")
221213
}
222-
if len(p) != 0 {
223-
log.Printf("Read %d", b[0])
224-
}
225214
return b[0]
226215
}
227216

delta_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ func Test_PatchDelta(t *testing.T) {
6767
t.Errorf("delta application failed")
6868
continue
6969
}
70-
log.Printf("SUCCESS")
7170
}
7271
}
7372

verify-pack.go

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,23 @@ func VerifyPack(pack io.ReadSeeker, idx io.Reader) ([]*packObject, error) {
7272
objects, err := parsePack(errReadSeeker{pack, nil}, idx)
7373
for _, object := range objects {
7474
if object.err != nil {
75-
log.Printf("Found %s (%d) %s %s", object.Name, object.size, object.Type, object.err)
75+
log.Printf("Found %s (%d) %s", object.Name, object.size, object.err)
7676
}
7777

78-
if object.Type == OBJ_OFS_DELTA {
79-
var base *packObject
78+
if object.Type == OBJ_OFS_DELTA && object.err != nil {
8079
// TODO improve this
8180
// linear search to find the right offset
81+
var base *packObject
8282
for _, o := range objects {
83-
log.Print(o.Offset)
8483
if o.Offset == object.Offset-object.negativeOffset {
8584
base = o
8685
break
8786
}
8887
}
8988
if base == nil {
90-
return nil, fmt.Errorf("Could not find object with negative offset %d - %d", object.Offset, object.negativeOffset)
89+
object.err = fmt.Errorf("could not find object with negative offset %d - %d for %s", object.Offset, object.negativeOffset, object.Name)
90+
} else {
91+
log.Printf("SUCCESS with %s", object.Name)
9192
}
9293
}
9394

@@ -104,13 +105,10 @@ func parsePack(pack errReadSeeker, idx io.Reader) (objects []*packObject, err er
104105
if err != nil {
105106
return nil, err
106107
}
107-
log.Printf("signature %+v", signature)
108-
109108
version := make([]byte, 4)
110109
pack.read(version)
111110

112111
// TODO use encoding/binary here
113-
log.Printf("version is %+v", version)
114112
v := version[3]
115113
switch v {
116114
case 2:
@@ -125,8 +123,6 @@ func parsePack(pack errReadSeeker, idx io.Reader) (objects []*packObject, err er
125123
default:
126124
return nil, fmt.Errorf("cannot parse packfile with version %d", v)
127125
}
128-
129-
return nil, nil
130126
}
131127

132128
func Clone(r io.Reader) (*bufio.Reader, *bufio.Reader) {
@@ -156,6 +152,7 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
156152
}
157153

158154
for _, object := range objects {
155+
159156
var btsread int
160157
r.Seek(int64(object.Offset), os.SEEK_SET)
161158
_bytes := make([]byte, 1)
@@ -210,6 +207,7 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
210207
if err != nil {
211208
return nil, err
212209
}
210+
213211
n, err := zr.Read(object.Data)
214212
if err != nil {
215213
if err == io.EOF {
@@ -233,12 +231,11 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
233231
// for n >= 2 adding 2^7 + 2^14 + ... + 2^(7*(n-1))
234232
// to the result."
235233

236-
log.Printf("encountered ofs delta")
237-
238234
var offset int
239235
MSB := (_byte & 128) // will be either 128 or 0
240236
var shift uint = 0
241-
for MSB > 0 {
237+
238+
for {
242239
// Keep reading the size until the MSB is 0
243240
_bytes := make([]byte, 1)
244241
r.read(_bytes)
@@ -248,14 +245,16 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
248245

249246
offset += int((uint(_byte) & 127) << shift)
250247
shift += 7
248+
249+
if MSB == 0 {
250+
break
251+
}
251252
}
252253
object.negativeOffset = offset
253254
object.Data = make([]byte, objectSize)
254255

255256
zr, err := zlib.NewReader(r.r)
256257
if err != nil {
257-
log.Printf("Shift is %d", shift)
258-
log.Printf("Object size is %d", objectSize)
259258
object.err = err
260259
continue
261260
}
@@ -266,7 +265,9 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
266265
}
267266
object.Data = object.Data[:n]
268267
zr.Close()
269-
log.Printf("Ofs data is %q", object.Data)
268+
if len(object.Data) != objectSize {
269+
object.err = fmt.Errorf("received wrong object size: %d (expected %d)", object.Data, objectSize)
270+
}
270271

271272
case object.Type == OBJ_REF_DELTA:
272273
r.Seek(int64(object.Offset), os.SEEK_SET)
@@ -296,7 +297,7 @@ func parsePackV2(r errReadSeeker, objects []*packObject) ([]*packObject, error)
296297

297298
func parseIdx(idx io.Reader, version int) (objects []*packObject, err error) {
298299
if version != 2 {
299-
return nil, fmt.Errorf("cannot parse IDX with version %d")
300+
return nil, fmt.Errorf("cannot parse IDX with version %d", version)
300301
}
301302
// parse version 2 idxfile
302303

0 commit comments

Comments
 (0)