Discard optimized containers with negative counts in UBJSON/BJData (#3491,#3492,#3490)

This commit is contained in:
Qianqian Fang 2022-05-17 17:41:13 -04:00
parent 6a7392058e
commit d0ed61eeb4
2 changed files with 10 additions and 10 deletions

View File

@ -2016,7 +2016,7 @@ class binary_reader
case 'i':
{
std::int8_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number) || number < 0))
{
return false;
}
@ -2027,7 +2027,7 @@ class binary_reader
case 'I':
{
std::int16_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number) || number < 0))
{
return false;
}
@ -2038,7 +2038,7 @@ class binary_reader
case 'l':
{
std::int32_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number) || number < 0))
{
return false;
}
@ -2049,7 +2049,7 @@ class binary_reader
case 'L':
{
std::int64_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number) || number < 0))
{
return false;
}
@ -2113,7 +2113,7 @@ class binary_reader
{
return false;
}
if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1)) // return normal array size if 1D row vector
if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1) || std::count(dim.begin(), dim.end(), 0)) // return normal array size if 1D row vector or total length is 0
{
result = dim.at(dim.size() - 1);
return true;

View File

@ -10490,7 +10490,7 @@ class binary_reader
case 'i':
{
std::int8_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number) || number < 0))
{
return false;
}
@ -10501,7 +10501,7 @@ class binary_reader
case 'I':
{
std::int16_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number) || number < 0))
{
return false;
}
@ -10512,7 +10512,7 @@ class binary_reader
case 'l':
{
std::int32_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number) || number < 0))
{
return false;
}
@ -10523,7 +10523,7 @@ class binary_reader
case 'L':
{
std::int64_t number{};
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number)))
if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number) || number < 0))
{
return false;
}
@ -10587,7 +10587,7 @@ class binary_reader
{
return false;
}
if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1)) // return normal array size if 1D row vector
if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1) || std::count(dim.begin(), dim.end(), 0)) // return normal array size if 1D row vector or total length is 0
{
result = dim.at(dim.size() - 1);
return true;