Import of CCTZ from GitHub.

Fixes #2014

PiperOrigin-RevId: 869283027
Change-Id: Ibd7ef8507a8968d1b35fc45a2f023a7d1bde7691
diff --git a/absl/time/internal/cctz/src/time_zone_format.cc b/absl/time/internal/cctz/src/time_zone_format.cc
index 5b80c80..c31a3a0 100644
--- a/absl/time/internal/cctz/src/time_zone_format.cc
+++ b/absl/time/internal/cctz/src/time_zone_format.cc
@@ -978,7 +978,7 @@
   while (std::isspace(*data)) ++data;
 
   // parse() must consume the entire input string.
-  if (*data != '\0') {
+  if (data != input.data() + input.size()) {
     if (err != nullptr) *err = "Illegal trailing data in input string";
     return false;
   }
diff --git a/absl/time/internal/cctz/src/time_zone_format_test.cc b/absl/time/internal/cctz/src/time_zone_format_test.cc
index a270f4d..19dc973 100644
--- a/absl/time/internal/cctz/src/time_zone_format_test.cc
+++ b/absl/time/internal/cctz/src/time_zone_format_test.cc
@@ -967,6 +967,9 @@
   EXPECT_FALSE(parse("%Ez", "+-0:00", tz, &tp));
   EXPECT_FALSE(parse("%z", "-00-0", tz, &tp));
   EXPECT_FALSE(parse("%Ez", "-00:-0", tz, &tp));
+
+  // Check that we do not accept strings with embedded NULs.
+  EXPECT_FALSE(parse("%Y", std::string("2026\0payload", 12), tz, &tp));
 }
 
 TEST(Parse, PosixConversions) {