summaryrefslogtreecommitdiff
path: root/vendor/github.com
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com')
-rw-r--r--vendor/github.com/tdewolff/parse/v2/binary.go64
-rw-r--r--vendor/github.com/tdewolff/parse/v2/binary_unix.go20
-rw-r--r--vendor/github.com/tdewolff/parse/v2/html/lex.go10
3 files changed, 52 insertions, 42 deletions
diff --git a/vendor/github.com/tdewolff/parse/v2/binary.go b/vendor/github.com/tdewolff/parse/v2/binary.go
index cf4f91d4a..721864d12 100644
--- a/vendor/github.com/tdewolff/parse/v2/binary.go
+++ b/vendor/github.com/tdewolff/parse/v2/binary.go
@@ -6,6 +6,7 @@ import (
"fmt"
"io"
"os"
+ "sync"
)
const PageSize = 4096
@@ -45,17 +46,15 @@ func (r *binaryReaderFile) Len() int64 {
}
func (r *binaryReaderFile) Bytes(b []byte, n, off int64) ([]byte, error) {
- if _, err := r.f.Seek(off, 0); err != nil {
- return nil, err
- } else if b == nil {
+ if b == nil {
b = make([]byte, n)
}
-
- m, err := r.f.Read(b)
- if err != nil {
- return nil, err
+ if m, err := r.f.ReadAt(b, off); err != nil {
+ return b[:m], err
+ } else if off+int64(m) == r.size {
+ return b[:m], io.EOF
} else if int64(m) != n {
- return nil, errors.New("file: could not read all bytes")
+ return b[:m], errors.New("file: could not read all bytes")
}
return b, nil
}
@@ -79,16 +78,22 @@ func (r *binaryReaderBytes) Len() int64 {
}
func (r *binaryReaderBytes) Bytes(b []byte, n, off int64) ([]byte, error) {
- if off < 0 || n < 0 || int64(len(r.data)) < off || int64(len(r.data))-off < n {
+ var err error
+ if off < 0 || n < 0 {
return nil, fmt.Errorf("bytes: invalid range %d--%d", off, off+n)
+ } else if int64(len(r.data)) <= off {
+ return nil, io.EOF
+ } else if int64(len(r.data))-off <= n {
+ n = int64(len(r.data)) - off
+ err = io.EOF
}
data := r.data[off : off+n : off+n]
if b == nil {
- return data, nil
+ return data, err
}
copy(b, data)
- return b, nil
+ return b[:len(data)], err
}
type binaryReaderReader struct {
@@ -96,12 +101,13 @@ type binaryReaderReader struct {
size int64
readerAt bool
seeker bool
+ mu sync.Mutex
}
func newBinaryReaderReader(r io.Reader, n int64) *binaryReaderReader {
_, readerAt := r.(io.ReaderAt)
_, seeker := r.(io.Seeker)
- return &binaryReaderReader{r, n, readerAt, seeker}
+ return &binaryReaderReader{r, n, readerAt, seeker, sync.Mutex{}}
}
// Close closes the reader.
@@ -124,23 +130,30 @@ func (r *binaryReaderReader) Bytes(b []byte, n, off int64) ([]byte, error) {
// seeker seems faster than readerAt by 10%
if r.seeker {
+ r.mu.Lock()
if _, err := r.r.(io.Seeker).Seek(off, 0); err != nil {
+ r.mu.Unlock()
return nil, err
}
m, err := r.r.Read(b)
+ r.mu.Unlock()
if err != nil {
- return nil, err
+ return b[:m], err
+ } else if off+int64(m) == r.size {
+ return b[:m], io.EOF
} else if int64(m) != n {
- return nil, errors.New("file: could not read all bytes")
+ return b[:m], errors.New("reader: could not read all bytes")
}
return b, nil
} else if r.readerAt {
m, err := r.r.(io.ReaderAt).ReadAt(b, off)
if err != nil {
- return nil, err
+ return b[:m], err
+ } else if off+int64(m) == r.size {
+ return b[:m], io.EOF
} else if int64(m) != n {
- return nil, errors.New("file: could not read all bytes")
+ return b[:m], errors.New("reader: could not read all bytes")
}
return b, nil
}
@@ -197,12 +210,8 @@ func (r *BinaryReader) IBinaryReader() IBinaryReader {
}
func (r *BinaryReader) Clone() *BinaryReader {
- f := r.f
- if cloner, ok := f.(interface{ Clone() IBinaryReader }); ok {
- f = cloner.Clone()
- }
return &BinaryReader{
- f: f,
+ f: r.f,
pos: r.pos,
err: r.err,
ByteOrder: r.ByteOrder,
@@ -262,9 +271,6 @@ func (r *BinaryReader) Seek(off int64, whence int) (int64, error) {
// Read complies with io.Reader.
func (r *BinaryReader) Read(b []byte) (int, error) {
data, err := r.f.Bytes(b, int64(len(b)), r.pos)
- if err != nil && err != io.EOF {
- return 0, err
- }
r.pos += int64(len(data))
return len(data), err
}
@@ -272,20 +278,14 @@ func (r *BinaryReader) Read(b []byte) (int, error) {
// ReadAt complies with io.ReaderAt.
func (r *BinaryReader) ReadAt(b []byte, off int64) (int, error) {
data, err := r.f.Bytes(b, int64(len(b)), off)
- if err != nil && err != io.EOF {
- return 0, err
- }
return len(data), err
}
// ReadBytes reads n bytes.
func (r *BinaryReader) ReadBytes(n int64) []byte {
data, err := r.f.Bytes(nil, n, r.pos)
- if err != nil {
- r.err = err
- return nil
- }
- r.pos += n
+ r.pos += int64(len(data))
+ r.err = err
return data
}
diff --git a/vendor/github.com/tdewolff/parse/v2/binary_unix.go b/vendor/github.com/tdewolff/parse/v2/binary_unix.go
index 4a8979fda..25ec83dbc 100644
--- a/vendor/github.com/tdewolff/parse/v2/binary_unix.go
+++ b/vendor/github.com/tdewolff/parse/v2/binary_unix.go
@@ -5,8 +5,8 @@ package parse
import (
"errors"
"fmt"
+ "io"
"os"
- "runtime"
"syscall"
)
@@ -25,6 +25,8 @@ func newBinaryReaderMmap(filename string) (*binaryReaderMmap, error) {
info, err := f.Stat()
if err != nil {
return nil, err
+ } else if !info.Mode().IsRegular() {
+ return nil, fmt.Errorf("mmap: not a regular file: %v", filename)
}
size := info.Size()
@@ -48,7 +50,7 @@ func newBinaryReaderMmap(filename string) (*binaryReaderMmap, error) {
return nil, err
}
r := &binaryReaderMmap{data, size}
- runtime.SetFinalizer(r, (*binaryReaderMmap).Close)
+ //runtime.SetFinalizer(r, (*binaryReaderMmap).Close)
return r, nil
}
@@ -62,7 +64,7 @@ func (r *binaryReaderMmap) Close() error {
}
data := r.data
r.data = nil
- runtime.SetFinalizer(r, nil)
+ //runtime.SetFinalizer(r, nil)
return syscall.Munmap(data)
}
@@ -72,18 +74,24 @@ func (r *binaryReaderMmap) Len() int64 {
}
func (r *binaryReaderMmap) Bytes(b []byte, n, off int64) ([]byte, error) {
+ var err error
if r.data == nil {
return nil, errors.New("mmap: closed")
- } else if off < 0 || n < 0 || int64(len(r.data)) < off || int64(len(r.data))-off < n {
+ } else if off < 0 || n < 0 {
return nil, fmt.Errorf("mmap: invalid range %d--%d", off, off+n)
+ } else if int64(len(r.data)) <= off {
+ return nil, io.EOF
+ } else if int64(len(r.data))-off <= n {
+ n = int64(len(r.data)) - off
+ err = io.EOF
}
data := r.data[off : off+n : off+n]
if b == nil {
- return data, nil
+ return data, err
}
copy(b, data)
- return b, nil
+ return b[:len(data)], err
}
func NewBinaryReaderMmap(filename string) (*BinaryReader, error) {
diff --git a/vendor/github.com/tdewolff/parse/v2/html/lex.go b/vendor/github.com/tdewolff/parse/v2/html/lex.go
index e44a77ce8..a1954ff59 100644
--- a/vendor/github.com/tdewolff/parse/v2/html/lex.go
+++ b/vendor/github.com/tdewolff/parse/v2/html/lex.go
@@ -399,10 +399,12 @@ func (l *Lexer) shiftStartTag() (TokenType, []byte) {
func (l *Lexer) shiftAttribute() []byte {
nameStart := l.r.Pos()
var c byte
- if 0 < len(l.tmplBegin) && l.at(l.tmplBegin...) {
- l.r.Move(len(l.tmplBegin))
- l.moveTemplate()
- l.hasTmpl = true
+ if 0 < len(l.tmplBegin) {
+ for l.at(l.tmplBegin...) {
+ l.r.Move(len(l.tmplBegin))
+ l.moveTemplate()
+ l.hasTmpl = true
+ }
}
for { // attribute name state
if c = l.r.Peek(0); c == ' ' || c == '=' || c == '>' || c == '/' && l.r.Peek(1) == '>' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == 0 && l.r.Err() != nil {