const unsigned char *buf,
const size_t len,
const bool allowContainers,
- const bool expectEOC,
const size_t recursionDepth)
{
if (recursionDepth >= parseMaxRecursionDepth) {
#pragma clang diagnostic ignored "-Wswitch-enum"
switch (items->list[item].atom.typ) {
#pragma clang diagnostic pop
- case YACItemEOC:
- if (!expectEOC) {
- return YACErrUnexpectedEOC;
- }
- break;
case YACItemList: {
if (!allowContainers) {
return YACErrUnknownType;
size_t cur = 0;
size_t idx = item;
for (;;) {
- err = yacItemsParse(items, off, buf, len, true, true, recursionDepth + 1);
+ err = yacItemsParse(items, off, buf, len, true, recursionDepth + 1);
if (err != YACErrNo) {
return err;
}
size_t prevKeyLen = 0;
const unsigned char *prevKey = NULL;
for (;;) {
- err = yacItemsParse(items, off, buf, len, false, true, recursionDepth + 1);
+ err = yacItemsParse(items, off, buf, len, false, recursionDepth + 1);
if (err != YACErrNo) {
return err;
}
}
prev = cur;
idx = (items->len) - 1;
- err = yacItemsParse(items, off, buf, len, true, false, recursionDepth + 1);
+ err = yacItemsParse(items, off, buf, len, true, recursionDepth + 1);
if (err != YACErrNo) {
return err;
}
cur = idx + 1;
+ if (items->list[cur].atom.typ == YACItemEOC) {
+ return YACErrUnexpectedEOC;
+ }
items->list[prev].next = cur;
prev = cur;
idx = (items->len) - 1;
size_t cur = 0;
bool eoc = false;
while (!eoc) {
- err = yacItemsParse(items, off, buf, len, false, true, recursionDepth + 1);
+ err = yacItemsParse(items, off, buf, len, false, recursionDepth + 1);
if (err != YACErrNo) {
return err;
}
const unsigned char *buf,
const size_t len)
{
- return yacItemsParse(items, off, buf, len, true, false, 0);
+ enum YACErr err = yacItemsParse(items, off, buf, len, true, 0);
+ if (items->list[0].atom.typ == YACItemEOC) {
+ err = YACErrUnexpectedEOC;
+ }
+ return err;
}
bool
func decode(
buf []byte,
- allowContainers, expectEOC bool,
+ allowContainers bool,
recursionDepth int,
) (item Item, tail []byte, err error) {
if recursionDepth > parseMaxRecursionDepth {
buf = buf[off:]
tail = buf
switch item.T {
- case types.EOC:
- if !expectEOC {
- err = ErrUnexpectedEOC
- return
- }
case types.List:
if !allowContainers {
err = atom.ErrUnknownType
var sub Item
var v []Item
for {
- sub, buf, err = decode(buf, true, true, recursionDepth+1)
+ sub, buf, err = decode(buf, true, recursionDepth+1)
tail = buf
if err != nil {
tail = buf
var sub Item
var keyPrev string
for {
- sub, buf, err = decode(buf, false, true, recursionDepth+1)
+ sub, buf, err = decode(buf, false, recursionDepth+1)
tail = buf
if err != nil {
return
}
keyPrev = s
}
- sub, buf, err = decode(buf, true, false, recursionDepth+1)
+ sub, buf, err = decode(buf, true, recursionDepth+1)
tail = buf
if err != nil {
return
}
+ if sub.T == types.EOC {
+ err = ErrUnexpectedEOC
+ return
+ }
v[keyPrev] = sub
}
item.V = v
var sub Item
BlobCycle:
for {
- sub, buf, err = decode(buf, false, true, recursionDepth+1)
+ sub, buf, err = decode(buf, false, recursionDepth+1)
tail = buf
if err != nil {
return
// Decode single YAC-encoded data item. Remaining data will be kept in tail.
func Decode(buf []byte) (item Item, tail []byte, err error) {
- return decode(buf, true, false, 0)
+ item, tail, err = decode(buf, true, 0)
+ if item.T == types.EOC {
+ err = ErrUnexpectedEOC
+ }
+ return item, tail, err
}
return secs - diff
-def _loads(v, sets=False, leapsecUTCAllow=False, _expectEOC=False, _allowContainers=True):
+def _loads(v, sets=False, leapsecUTCAllow=False, _allowContainers=True):
if len(v) == 0:
raise NotEnoughData(1)
b = v[0]
if b == TagEOC:
- if not _expectEOC:
- raise DecodeError("unexpected EOC")
return _EOC, v[1:]
if b == TagNIL:
return None, v[1:]
ret = []
v = v[1:]
while True:
- i, v = loads(v, sets=sets, leapsecUTCAllow=leapsecUTCAllow, _expectEOC=True)
+ i, v = _loads(v, sets=sets, leapsecUTCAllow=leapsecUTCAllow)
if i == _EOC:
break
ret.append(i)
kPrev = ""
allNILs = True
while True:
- k, v = _loads(v, _expectEOC=True, _allowContainers=False)
+ k, v = _loads(v, _allowContainers=False)
if k == _EOC:
break
if not isinstance(k, str):
if len(k) == 0:
raise DecodeError("empty key")
raise DecodeError("unsorted keys")
- i, v = loads(v, sets=sets, leapsecUTCAllow=leapsecUTCAllow, _expectEOC=False)
+ i, v = _loads(v, sets=sets, leapsecUTCAllow=leapsecUTCAllow)
+ if i == _EOC:
+ raise DecodeError("unexpected EOC")
ret[k] = i
kPrev = k
if i is not None:
v = v[1+8:]
raws = []
while True:
- i, v = _loads(v, _expectEOC=True, _allowContainers=False)
+ i, v = _loads(v, _allowContainers=False)
if i is None:
if len(v) < l:
raise NotEnoughData(l-len(v)+1)
:rtype: (any, bytes)
"""
try:
- return _loads(v, **kwargs)
+ ret, tail = _loads(v, **kwargs)
except RecursionError as err:
raise DecodeError("deep recursion") from err
+ if ret == _EOC:
+ raise DecodeError("unexpected EOC")
+ return ret, tail
if __name__ == "__main__":