From f9c1e4f4be821bcf5512aa3cdb95da284f75459a Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sat, 10 Jul 2021 12:51:55 +0300 Subject: [PATCH] Sizes should be forcefully 64-bit numbers --- doc/news.ru.texi | 3 +++ doc/news.texi | 3 +++ src/mth.go | 45 +++++++++++++++++++++++---------------------- src/pkt.go | 18 +++++++++--------- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/doc/news.ru.texi b/doc/news.ru.texi index a3f6c40..97f46e0 100644 --- a/doc/news.ru.texi +++ b/doc/news.ru.texi @@ -57,6 +57,9 @@ @subsection Релиз 7.3.0 @itemize +@item +Поправлены проблемы работоспособности на 32-бит системах с большими файлами. + @item Возможность использовать конфигурацию в виде директории с набором файлов. Появилась команда @command{nncp-cfgdir}. diff --git a/doc/news.texi b/doc/news.texi index 3375cd4..20ff3d6 100644 --- a/doc/news.texi +++ b/doc/news.texi @@ -59,6 +59,9 @@ See also this page @ref{Новости, on russian}. @section Release 7.3.0 @itemize +@item +Fixed some workability problems on 32-bit systems with big files. + @item Ability to use directory with a bunch of files as a configuration. @command{nncp-cfgdir} command appeared. diff --git a/src/mth.go b/src/mth.go index a766925..d6e3082 100644 --- a/src/mth.go +++ b/src/mth.go @@ -46,14 +46,14 @@ const ( type MTHEvent struct { Type MTHEventType - Level int - Ctr int + Level int64 + Ctr int64 Hsh []byte } type MTH interface { hash.Hash - PrependFrom(r io.Reader) (int, error) + PrependFrom(r io.Reader) (int64, error) SetPktName(n string) PrependSize() int64 Events() chan MTHEvent @@ -80,14 +80,14 @@ func MTHFatNew(size, offset int64) MTH { if size == 0 { return &mth } - prepends := int(offset / MTHBlockSize) - skip := MTHBlockSize - (offset - int64(prepends)*MTHBlockSize) + prepends := offset / MTHBlockSize + skip := MTHBlockSize - (offset - prepends*MTHBlockSize) if skip == MTHBlockSize { skip = 0 } else if skip > 0 { prepends++ } - prependSize := int64(prepends * MTHBlockSize) + prependSize := prepends * MTHBlockSize if prependSize > size { prependSize = size } @@ -139,7 +139,7 @@ func (mth *MTHFat) Write(data []byte) (int, error) { if mth.events != nil { mth.events <- MTHEvent{ MTHEventAppend, - 0, len(mth.hashes) - 1, + 0, int64(len(mth.hashes) - 1), mth.hashes[len(mth.hashes)-1][:], } } @@ -147,18 +147,19 @@ func (mth *MTHFat) Write(data []byte) (int, error) { return n, err } -func (mth *MTHFat) PrependFrom(r io.Reader) (int, error) { +func (mth *MTHFat) PrependFrom(r io.Reader) (int64, error) { if mth.finished { return 0, errors.New("already Sum()ed") } var err error buf := make([]byte, MTHBlockSize) - var i, n, read int + var n int + var i, read int64 fullsize := mth.prependSize les := LEs{{"Pkt", mth.pktName}, {"FullSize", fullsize}, {"Size", 0}} for mth.prependSize >= MTHBlockSize { n, err = io.ReadFull(r, buf) - read += n + read += int64(n) mth.prependSize -= MTHBlockSize if err != nil { return read, err @@ -172,14 +173,14 @@ func (mth *MTHFat) PrependFrom(r io.Reader) (int, error) { mth.events <- MTHEvent{MTHEventPrepend, 0, i, mth.hashes[i][:]} } if mth.pktName != "" { - les[len(les)-1].V = int64(read) + les[len(les)-1].V = read Progress("check", les) } i++ } if mth.prependSize > 0 { n, err = io.ReadFull(r, buf[:mth.prependSize]) - read += n + read += int64(n) if err != nil { return read, err } @@ -215,7 +216,7 @@ func (mth *MTHFat) Sum(b []byte) []byte { if mth.events != nil { mth.events <- MTHEvent{ MTHEventAppend, - 0, len(mth.hashes) - 1, + 0, int64(len(mth.hashes) - 1), mth.hashes[len(mth.hashes)-1][:], } } @@ -240,7 +241,7 @@ func (mth *MTHFat) Sum(b []byte) []byte { } } mth.hasher = blake3.New(MTHSize, MTHNodeKey[:]) - level := 1 + level := int64(1) for len(mth.hashes) != 1 { hashesUp := make([][MTHSize]byte, 0, 1+len(mth.hashes)/2) pairs := (len(mth.hashes) / 2) * 2 @@ -258,7 +259,7 @@ func (mth *MTHFat) Sum(b []byte) []byte { if mth.events != nil { mth.events <- MTHEvent{ MTHEventFold, - level, len(hashesUp) - 1, + level, int64(len(hashesUp) - 1), hashesUp[len(hashesUp)-1][:], } } @@ -268,7 +269,7 @@ func (mth *MTHFat) Sum(b []byte) []byte { if mth.events != nil { mth.events <- MTHEvent{ MTHEventAppend, - level, len(hashesUp) - 1, + level, int64(len(hashesUp) - 1), hashesUp[len(hashesUp)-1][:], } } @@ -284,7 +285,7 @@ func (mth *MTHFat) Sum(b []byte) []byte { } type MTHSeqEnt struct { - l int + l int64 h [MTHSize]byte } @@ -294,7 +295,7 @@ type MTHSeq struct { hashes []MTHSeqEnt buf *bytes.Buffer events chan MTHEvent - ctrs []int + ctrs []int64 finished bool } @@ -303,7 +304,7 @@ func MTHSeqNew() *MTHSeq { hasherLeaf: blake3.New(MTHSize, MTHLeafKey[:]), hasherNode: blake3.New(MTHSize, MTHNodeKey[:]), buf: bytes.NewBuffer(make([]byte, 0, 2*MTHBlockSize)), - ctrs: make([]int, 1, 2), + ctrs: make([]int64, 1, 2), } return &mth } @@ -314,7 +315,7 @@ func (mth *MTHSeq) Size() int { return MTHSize } func (mth *MTHSeq) BlockSize() int { return MTHBlockSize } -func (mth *MTHSeq) PrependFrom(r io.Reader) (int, error) { +func (mth *MTHSeq) PrependFrom(r io.Reader) (int64, error) { panic("must not reach that code") } @@ -341,8 +342,8 @@ func (mth *MTHSeq) leafAdd() { mth.ctrs[0]++ } -func (mth *MTHSeq) incr(l int) { - if len(mth.ctrs) <= l { +func (mth *MTHSeq) incr(l int64) { + if int64(len(mth.ctrs)) <= l { mth.ctrs = append(mth.ctrs, 0) } else { mth.ctrs[l]++ diff --git a/src/pkt.go b/src/pkt.go index bd3fb23..aa3025d 100644 --- a/src/pkt.go +++ b/src/pkt.go @@ -141,13 +141,13 @@ func aeadProcess( doEncrypt bool, r io.Reader, w io.Writer, -) (int, error) { +) (int64, error) { ciphCtr := nonce[len(nonce)-8:] buf := make([]byte, EncBlkSize+aead.Overhead()) var toRead []byte var toWrite []byte var n int - var readBytes int + var readBytes int64 var err error if doEncrypt { toRead = buf[:EncBlkSize] @@ -161,10 +161,10 @@ func aeadProcess( break } if err != io.ErrUnexpectedEOF { - return readBytes + n, err + return readBytes + int64(n), err } } - readBytes += n + readBytes += int64(n) ctrIncr(ciphCtr) if doEncrypt { toWrite = aead.Seal(buf[:0], nonce, buf[:n], ad) @@ -247,9 +247,9 @@ func PktEncWrite( } nonce := make([]byte, aead.NonceSize()) - fullSize := pktBuf.Len() + int(size) + fullSize := int64(pktBuf.Len()) + size sizeBuf := make([]byte, 8+aead.Overhead()) - binary.BigEndian.PutUint64(sizeBuf, uint64(sizeWithTags(int64(fullSize)))) + binary.BigEndian.PutUint64(sizeBuf, uint64(sizeWithTags(fullSize))) if _, err = out.Write(aead.Seal(sizeBuf[:0], nonce, sizeBuf[:8], ad[:])); err != nil { return nil, err } @@ -372,10 +372,10 @@ func PktEncRead( lr := io.LimitedReader{R: data, N: size} written, err := aeadProcess(aead, nonce, ad[:], false, &lr, out) if err != nil { - return sharedKey[:], their, int64(written), err + return sharedKey[:], their, written, err } - if written != int(size) { - return sharedKey[:], their, int64(written), io.ErrUnexpectedEOF + if written != size { + return sharedKey[:], their, written, io.ErrUnexpectedEOF } return sharedKey[:], their, size, nil } -- 2.44.0