@cryptotaxi247 / kubo / commits / d6589e5e1

don't make assumptions about readers in the dagmodifier

The dagmodifier *only* works because we're using a bytes.Buffer. License: MIT Signed-off-by: Steven Allen <steven@stebalien.com>

Steven Allen committed Mar 7, 2018 at 18:25 UTC d6589e5e1cda52dcda8788273e80ac58df8dc68a
1 file changed +24 -39
unixfs/mod/dagmodifier.go
+24 -39
@@ -202,7 +202,7 @@ func (dm *DagModifier) Sync() error {
202 buflen := dm.wrBuf.Len()
203
204 // overwrite existing dag nodes
205 - thisc, done, err := dm.modifyDag(dm.curNode, dm.writeStart, dm.wrBuf)
205 + thisc, err := dm.modifyDag(dm.curNode, dm.writeStart)
206 if err != nil {
207 return err
208 }
@@ -213,7 +213,7 @@ func (dm *DagModifier) Sync() error {
213 }
214
215 // need to write past end of current dag
216 - if !done {
216 + if dm.wrBuf.Len() > 0 {
217 dm.curNode, err = dm.appendData(dm.curNode, dm.splitter(dm.wrBuf))
218 if err != nil {
219 return err
@@ -231,28 +231,27 @@ func (dm *DagModifier) Sync() error {
231 return nil
232 }
233
234 -// modifyDag writes the data in 'data' over the data in 'node' starting at 'offset'
235 -// returns the new key of the passed in node and whether or not all the data in the reader
236 -// has been consumed.
237 -func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*cid.Cid, bool, error) {
234 +// modifyDag writes the data in 'dm.wrBuf' over the data in 'node' starting at 'offset'
235 +// returns the new key of the passed in node.
236 +func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64) (*cid.Cid, error) {
237 // If we've reached a leaf node.
238 if len(n.Links()) == 0 {
239 switch nd0 := n.(type) {
240 case *mdag.ProtoNode:
241 f, err := ft.FromBytes(nd0.Data())
242 if err != nil {
244 - return nil, false, err
243 + return nil, err
244 }
245
247 - n, err := data.Read(f.Data[offset:])
246 + _, err = dm.wrBuf.Read(f.Data[offset:])
247 if err != nil && err != io.EOF {
249 - return nil, false, err
248 + return nil, err
249 }
250
251 // Update newly written node..
252 b, err := proto.Marshal(f)
253 if err != nil {
255 - return nil, false, err
254 + return nil, err
255 }
256
257 nd := new(mdag.ProtoNode)
@@ -260,16 +259,10 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
259 nd.SetPrefix(&nd0.Prefix)
260 err = dm.dagserv.Add(dm.ctx, nd)
261 if err != nil {
263 - return nil, false, err
264 - }
265 -
266 - // Hey look! we're done!
267 - var done bool
268 - if n < len(f.Data[offset:]) {
269 - done = true
262 + return nil, err
263 }
264
272 - return nd.Cid(), done, nil
265 + return nd.Cid(), nil
266 case *mdag.RawNode:
267 origData := nd0.RawData()
268 bytes := make([]byte, len(origData))
@@ -278,9 +271,9 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
271 copy(bytes, origData[:offset])
272
273 // copy in new data
281 - n, err := data.Read(bytes[offset:])
274 + n, err := dm.wrBuf.Read(bytes[offset:])
275 if err != nil && err != io.EOF {
283 - return nil, false, err
276 + return nil, err
277 }
278
279 // copy remaining data
@@ -291,46 +284,39 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
284
285 nd, err := mdag.NewRawNodeWPrefix(bytes, nd0.Cid().Prefix())
286 if err != nil {
294 - return nil, false, err
287 + return nil, err
288 }
289 err = dm.dagserv.Add(dm.ctx, nd)
290 if err != nil {
298 - return nil, false, err
299 - }
300 -
301 - // Hey look! we're done!
302 - var done bool
303 - if n < len(bytes[offset:]) {
304 - done = true
291 + return nil, err
292 }
293
307 - return nd.Cid(), done, nil
294 + return nd.Cid(), nil
295 }
296 }
297
298 node, ok := n.(*mdag.ProtoNode)
299 if !ok {
313 - return nil, false, ErrNotUnixfs
300 + return nil, ErrNotUnixfs
301 }
302
303 f, err := ft.FromBytes(node.Data())
304 if err != nil {
318 - return nil, false, err
305 + return nil, err
306 }
307
308 var cur uint64
322 - var done bool
309 for i, bs := range f.GetBlocksizes() {
310 // We found the correct child to write into
311 if cur+bs > offset {
312 child, err := node.Links()[i].GetNode(dm.ctx, dm.dagserv)
313 if err != nil {
328 - return nil, false, err
314 + return nil, err
315 }
316
331 - k, sdone, err := dm.modifyDag(child, offset-cur, data)
317 + k, err := dm.modifyDag(child, offset-cur)
318 if err != nil {
333 - return nil, false, err
319 + return nil, err
320 }
321
322 node.Links()[i].Cid = k
@@ -338,12 +324,11 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
324 // Recache serialized node
325 _, err = node.EncodeProtobuf(true)
326 if err != nil {
341 - return nil, false, err
327 + return nil, err
328 }
329
344 - if sdone {
330 + if dm.wrBuf.Len() == 0 {
331 // No more bytes to write!
346 - done = true
332 break
333 }
334 offset = cur + bs
@@ -352,7 +337,7 @@ func (dm *DagModifier) modifyDag(n ipld.Node, offset uint64, data io.Reader) (*c
337 }
338
339 err = dm.dagserv.Add(dm.ctx, node)
355 - return node.Cid(), done, err
340 + return node.Cid(), err
341 }
342
343 // appendData appends the blocks from the given chan to the end of this dag