From e791ec4e2792eb8daff723e87dd12e4a4a07148d Mon Sep 17 00:00:00 2001 From: Karthik Nishanth <55433069+knzivid@users.noreply.github.com> Date: Mon, 8 Feb 2021 21:38:22 +0100 Subject: [PATCH] fix: add null pointer check with std::localtime (#2846) --- include/pybind11/chrono.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/include/pybind11/chrono.h b/include/pybind11/chrono.h index c3681102d..551a802ad 100644 --- a/include/pybind11/chrono.h +++ b/include/pybind11/chrono.h @@ -161,9 +161,16 @@ public: // > If std::time_t has lower precision, it is implementation-defined whether the value is rounded or truncated. // (https://en.cppreference.com/w/cpp/chrono/system_clock/to_time_t) std::time_t tt = system_clock::to_time_t(time_point_cast(src - us)); + + // std::localtime returns a pointer to a static internal std::tm object on success, + // or null pointer otherwise + std::tm *localtime_ptr = std::localtime(&tt); + if (!localtime_ptr) + throw cast_error("Unable to represent system_clock in local time"); + // this function uses static memory so it's best to copy it out asap just in case // otherwise other code that is using localtime may break this (not just python code) - std::tm localtime = *std::localtime(&tt); + std::tm localtime = *localtime_ptr; return PyDateTime_FromDateAndTime(localtime.tm_year + 1900, localtime.tm_mon + 1,