This is an automated email from the ASF dual-hosted git repository.
bcall pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new daa13fc97a Coverity 1497353: Use of 32-bit time_t (#10505)
daa13fc97a is described below
commit daa13fc97ad89d7eb5ea58b0ec97382486a749e7
Author: Bryan Call <[email protected]>
AuthorDate: Mon Sep 25 12:35:07 2023 -0700
Coverity 1497353: Use of 32-bit time_t (#10505)
*Found a couple bugs when fixing the 32bit time_t issue:
1. ink_atoui was returning a max value of INT_MAX instead of UINT_MAX.
2. mime_field_value_set_uint64 had too short of a buffer.
---
include/tscore/ParseRules.h | 6 +-
proxy/hdrs/MIME.cc | 2 +-
proxy/hdrs/MIME.h | 3 +
src/tscore/CMakeLists.txt | 1 +
src/tscore/unit_tests/test_ink_string.cc | 170 +++++++++++++++++++++++++++++++
5 files changed, 178 insertions(+), 4 deletions(-)
diff --git a/include/tscore/ParseRules.h b/include/tscore/ParseRules.h
index ea7c783050..10c26df3f1 100644
--- a/include/tscore/ParseRules.h
+++ b/include/tscore/ParseRules.h
@@ -872,8 +872,8 @@ ink_atoui(const char *str)
{
uint64_t val = ink_atoui64(str);
- if (val > INT_MAX)
- return INT_MAX;
+ if (val > UINT_MAX)
+ return UINT_MAX;
else
- return static_cast<int>(val);
+ return static_cast<unsigned int>(val);
}
diff --git a/proxy/hdrs/MIME.cc b/proxy/hdrs/MIME.cc
index 527bbda556..4062e1f96c 100644
--- a/proxy/hdrs/MIME.cc
+++ b/proxy/hdrs/MIME.cc
@@ -2187,7 +2187,7 @@ mime_field_value_set_uint(HdrHeap *heap, MIMEHdrImpl *mh,
MIMEField *field, uint
void
mime_field_value_set_int64(HdrHeap *heap, MIMEHdrImpl *mh, MIMEField *field,
int64_t value)
{
- char buf[20];
+ char buf[21];
int len = mime_format_int64(buf, value, sizeof(buf));
mime_field_value_set(heap, mh, field, buf, len, true);
}
diff --git a/proxy/hdrs/MIME.h b/proxy/hdrs/MIME.h
index e91b412069..d215772c27 100644
--- a/proxy/hdrs/MIME.h
+++ b/proxy/hdrs/MIME.h
@@ -917,6 +917,7 @@ int mime_field_length_get(MIMEField *field);
int mime_format_int(char *buf, int32_t val, size_t buf_len);
int mime_format_uint(char *buf, uint32_t val, size_t buf_len);
int mime_format_int64(char *buf, int64_t val, size_t buf_len);
+int mime_format_uint64(char *buf, uint64_t val, size_t buf_len);
void mime_days_since_epoch_to_mdy_slowcase(unsigned int days_since_jan_1_1970,
int *m_return, int *d_return, int *y_return);
void mime_days_since_epoch_to_mdy(unsigned int days_since_jan_1_1970, int
*m_return, int *d_return, int *y_return);
@@ -1856,6 +1857,8 @@ MIMEHdr::set_age(time_t value)
if (sizeof(time_t) > 4) {
value_set_int64(MIME_FIELD_AGE, MIME_LEN_AGE, value);
} else {
+ // Only on systems where time_t is 32 bits
+ // coverity[Y2K38_SAFETY]
value_set_uint(MIME_FIELD_AGE, MIME_LEN_AGE, value);
}
}
diff --git a/src/tscore/CMakeLists.txt b/src/tscore/CMakeLists.txt
index ebffeb7e6e..752b5171a5 100644
--- a/src/tscore/CMakeLists.txt
+++ b/src/tscore/CMakeLists.txt
@@ -161,6 +161,7 @@ add_executable(test_tscore
unit_tests/test_arena.cc
unit_tests/test_ink_inet.cc
unit_tests/test_ink_memory.cc
+ unit_tests/test_ink_string.cc
unit_tests/test_layout.cc
unit_tests/test_scoped_resource.cc
unit_tests/unit_test_main.cc
diff --git a/src/tscore/unit_tests/test_ink_string.cc
b/src/tscore/unit_tests/test_ink_string.cc
new file mode 100644
index 0000000000..d298389f8c
--- /dev/null
+++ b/src/tscore/unit_tests/test_ink_string.cc
@@ -0,0 +1,170 @@
+/** @file
+
+ test ink_string.h - string utility functions
+
+ @section license License
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#include <tscore/ink_string.h>
+#include <tscore/ParseRules.h>
+#include <catch.hpp>
+#include <string_view>
+
+//-------------------------------------------------------------------------
+// ink_fast_ltoa test
+//-------------------------------------------------------------------------
+struct int64_item {
+ int64_t n;
+ std::string_view s;
+};
+
+constexpr int64_item int64_tests[] = {
+ {{0}, {"0"} },
+ {{1}, {"1"} },
+ {{10}, {"10"} },
+ {{100}, {"100"} },
+ {{1000}, {"1000"} },
+ {{10000}, {"10000"} },
+ {{100000}, {"100000"} },
+ {{1000000}, {"1000000"} },
+ {{10000000}, {"10000000"} },
+ {{100000000}, {"100000000"} },
+ {{1000000000}, {"1000000000"} },
+ {{10000000000}, {"10000000000"} },
+ {{100000000000}, {"100000000000"} },
+ {{1000000000000}, {"1000000000000"} },
+ {{10000000000000}, {"10000000000000"} },
+ {{100000000000000}, {"100000000000000"} },
+ {{1000000000000000}, {"1000000000000000"} },
+ {{10000000000000000}, {"10000000000000000"} },
+ {{100000000000000000}, {"100000000000000000"} },
+ {{1000000000000000000}, {"1000000000000000000"} },
+ {{-1}, "-1" },
+ {{-10}, "-10" },
+ {{-100}, "-100" },
+ {{-1000}, "-1000" },
+ {{-10000}, "-10000" },
+ {{-100000}, "-100000" },
+ {{-1000000}, "-1000000" },
+ {{-10000000}, "-10000000" },
+ {{-100000000}, "-100000000" },
+ {{-1000000000}, "-1000000000" },
+ {{-10000000000}, "-10000000000" },
+ {{-100000000000}, "-100000000000" },
+ {{-1000000000000}, "-1000000000000" },
+ {{-10000000000000}, "-10000000000000" },
+ {{-100000000000000}, "-100000000000000" },
+ {{-1000000000000000}, "-1000000000000000" },
+ {{-10000000000000000}, "-10000000000000000" },
+ {{-100000000000000000}, "-100000000000000000" },
+ {{-1000000000000000000}, "-1000000000000000000" },
+ {{INT64_MAX}, {"9223372036854775807"} },
+ {{INT64_MIN}, {"-9223372036854775808"}},
+};
+
+TEST_CASE("ink_fast_ltoa", "[libts][ink_fast_ltoa]")
+{
+ printf("ink_string\n");
+ char buffer[21];
+ for (auto const &test : int64_tests) {
+ REQUIRE(ink_atoi64(test.s.data()) == test.n);
+ int length = 0;
+ REQUIRE((length = ink_fast_ltoa(test.n, buffer, sizeof(buffer))) ==
(int)test.s.length());
+ REQUIRE(std::string_view(buffer, length) == test.s);
+ }
+}
+
+//-------------------------------------------------------------------------
+// ink_fast_inta test
+//-------------------------------------------------------------------------
+struct int_item {
+ int n;
+ std::string_view s;
+};
+
+constexpr int_item int_tests[] = {
+ {{0}, {"0"} },
+ {{1}, {"1"} },
+ {{10}, {"10"} },
+ {{100}, {"100"} },
+ {{1000}, {"1000"} },
+ {{10000}, {"10000"} },
+ {{100000}, {"100000"} },
+ {{1000000}, {"1000000"} },
+ {{10000000}, {"10000000"} },
+ {{100000000}, {"100000000"} },
+ {{1000000000}, {"1000000000"} },
+ {{-1}, {"-1"} },
+ {{-10}, {"-10"} },
+ {{-100}, {"-100"} },
+ {{-1000}, {"-1000"} },
+ {{-10000}, {"-10000"} },
+ {{-100000}, {"-100000"} },
+ {{-1000000}, {"-1000000"} },
+ {{-10000000}, {"-10000000"} },
+ {{-100000000}, {"-100000000"} },
+ {{-1000000000}, {"-1000000000"}},
+ {{INT_MAX}, {"2147483647"} },
+ {{INT_MIN}, {"-2147483648"}},
+};
+
+TEST_CASE("ink_fast_inta", "[libts][ink_fast_inta]")
+{
+ char buffer[12];
+ for (auto const &test : int_tests) {
+ REQUIRE(ink_atoi(test.s.data()) == test.n);
+ int length = 0;
+ REQUIRE((length = ink_fast_itoa(test.n, buffer, sizeof(buffer))) ==
(int)test.s.length());
+ REQUIRE(std::string_view(buffer, length) == test.s);
+ }
+}
+
+//-------------------------------------------------------------------------
+// ink_fast_uinta test
+//-------------------------------------------------------------------------
+struct uint_item {
+ unsigned int n;
+ std::string_view s;
+};
+
+constexpr uint_item uint_tests[] = {
+ {{0}, {"0"} },
+ {{1}, {"1"} },
+ {{10}, {"10"} },
+ {{100}, {"100"} },
+ {{1000}, {"1000"} },
+ {{10000}, {"10000"} },
+ {{100000}, {"100000"} },
+ {{1000000}, {"1000000"} },
+ {{10000000}, {"10000000"} },
+ {{100000000}, {"100000000"} },
+ {{1000000000}, {"1000000000"}},
+ {{UINT_MAX}, {"4294967295"}},
+};
+
+TEST_CASE("ink_fast_uinta", "[libts][ink_fast_uinta]")
+{
+ char buffer[12];
+ for (auto const &test : uint_tests) {
+ REQUIRE(ink_atoui(test.s.data()) == test.n);
+ int length = 0;
+ REQUIRE((length = ink_fast_uitoa(test.n, buffer, sizeof(buffer))) ==
(int)test.s.length());
+ REQUIRE(std::string_view(buffer, length) == test.s);
+ }
+}