[ntcore] Fix undefined comparison behavior when array is empty (#5448)

If both arrays are empty, it returns true, avoiding UB with memcmp potentially getting a nullptr.
This commit is contained in:
Gold856
2023-07-17 20:16:54 -04:00
committed by GitHub
parent 17eb9161cd
commit 1f6428ab63
2 changed files with 79 additions and 0 deletions

View File

@@ -317,6 +317,9 @@ bool nt::operator==(const Value& lhs, const Value& rhs) {
if (lhs.m_val.data.arr_boolean.size != rhs.m_val.data.arr_boolean.size) {
return false;
}
if (lhs.m_val.data.arr_boolean.size == 0) {
return true;
}
return std::memcmp(lhs.m_val.data.arr_boolean.arr,
rhs.m_val.data.arr_boolean.arr,
lhs.m_val.data.arr_boolean.size *
@@ -325,6 +328,9 @@ bool nt::operator==(const Value& lhs, const Value& rhs) {
if (lhs.m_val.data.arr_int.size != rhs.m_val.data.arr_int.size) {
return false;
}
if (lhs.m_val.data.arr_int.size == 0) {
return true;
}
return std::memcmp(lhs.m_val.data.arr_int.arr, rhs.m_val.data.arr_int.arr,
lhs.m_val.data.arr_int.size *
sizeof(lhs.m_val.data.arr_int.arr[0])) == 0;
@@ -332,6 +338,9 @@ bool nt::operator==(const Value& lhs, const Value& rhs) {
if (lhs.m_val.data.arr_float.size != rhs.m_val.data.arr_float.size) {
return false;
}
if (lhs.m_val.data.arr_float.size == 0) {
return true;
}
return std::memcmp(lhs.m_val.data.arr_float.arr,
rhs.m_val.data.arr_float.arr,
lhs.m_val.data.arr_float.size *
@@ -340,11 +349,17 @@ bool nt::operator==(const Value& lhs, const Value& rhs) {
if (lhs.m_val.data.arr_double.size != rhs.m_val.data.arr_double.size) {
return false;
}
if (lhs.m_val.data.arr_double.size == 0) {
return true;
}
return std::memcmp(lhs.m_val.data.arr_double.arr,
rhs.m_val.data.arr_double.arr,
lhs.m_val.data.arr_double.size *
sizeof(lhs.m_val.data.arr_double.arr[0])) == 0;
case NT_STRING_ARRAY:
if (lhs.m_val.data.arr_string.size == 0) {
return true;
}
return static_cast<StringArrayStorage*>(lhs.m_storage.get())->strings ==
static_cast<StringArrayStorage*>(rhs.m_storage.get())->strings;
default: