diff options
Diffstat (limited to 'vendor/github.com/abema/go-mp4/marshaller.go')
-rw-r--r-- | vendor/github.com/abema/go-mp4/marshaller.go | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/vendor/github.com/abema/go-mp4/marshaller.go b/vendor/github.com/abema/go-mp4/marshaller.go index 18ff79a0c..ff6c64c32 100644 --- a/vendor/github.com/abema/go-mp4/marshaller.go +++ b/vendor/github.com/abema/go-mp4/marshaller.go @@ -17,6 +17,29 @@ const ( var ErrUnsupportedBoxVersion = errors.New("unsupported box version") +func readerHasSize(reader bitio.ReadSeeker, size uint64) bool { + pre, err := reader.Seek(0, io.SeekCurrent) + if err != nil { + return false + } + + end, err := reader.Seek(0, io.SeekEnd) + if err != nil { + return false + } + + if uint64(end-pre) < size { + return false + } + + _, err = reader.Seek(pre, io.SeekStart) + if err != nil { + return false + } + + return true +} + type marshaller struct { writer bitio.Writer wbits uint64 @@ -417,12 +440,13 @@ func (u *unmarshaller) unmarshalSlice(v reflect.Value, fi *fieldInstance) error } } - if length > math.MaxInt32 { - return fmt.Errorf("out of memory: requestedSize=%d", length) - } - - if fi.size != 0 && fi.size%8 == 0 && u.rbits%8 == 0 && elemType.Kind() == reflect.Uint8 && fi.size == 8 { + if u.rbits%8 == 0 && elemType.Kind() == reflect.Uint8 && fi.size == 8 { totalSize := length * uint64(fi.size) / 8 + + if !readerHasSize(u.reader, totalSize) { + return fmt.Errorf("not enough bits") + } + buf := bytes.NewBuffer(make([]byte, 0, totalSize)) if _, err := io.CopyN(buf, u.reader, int64(totalSize)); err != nil { return err @@ -431,7 +455,7 @@ func (u *unmarshaller) unmarshalSlice(v reflect.Value, fi *fieldInstance) error u.rbits += uint64(totalSize) * 8 } else { - slice = reflect.MakeSlice(v.Type(), 0, int(length)) + slice = reflect.MakeSlice(v.Type(), 0, 0) for i := 0; ; i++ { if fi.length != LengthUnlimited && uint(i) >= fi.length { break |