: put_time crashes, allocating a huge memory block · Issue #924 · microsoft/STL (original) (raw)

Environment:
Microsoft Visual Studio Community 2019
Version 16.6.2
Open x64 Native command prompt for VS 2019.
Microsoft (R) C/C++ Optimizing Compiler Version 19.26.28806 for x64

Problem:
std::put_time crashed if all "tm" structure fields are equal -1.
If calling localtime_s with time_t > _MAX__TIME64_T then all "tm" fields filled by -1.
In real application put_time allocate tons of memory and application hang for some time.

#include <iomanip>
#include <sstream>
#include <iostream>
int main(int, char**)
{
    std::time_t t = 335303598060; // t > _MAX__TIME64_T
    tm t_tm;
    auto err = localtime_s(&t_tm, &t); // error, all fileds in t_tm = -1
    std::cout << "errno = " << err << "\n"; // errno = 22
    std::stringstream ss;
    ss << std::put_time(&t_tm, "%Y-%m-%d %H:%M:%S"); // crash, allocate tons on memory
    std::cout << ss.str() << "\n";
    return 0;
}

c:\~repro\cl /EHsc repro.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.26.28806 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

repro.cpp
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:repro.exe
repro.obj

c:\~repro>repro.exe
errno = 22
crash

Expected behavior:
put_time not crashed.

GCC/Clang (checked in Wandbox):
replace

    auto err = localtime_s(&t_tm, &t); // error, all fields in t_tm = -1
    std::cout << "errno = " << err << "\n"; // errno = 22

by

    localtime_r(&t, &t_tm);
    std::cout << "errno = " << errno << "\n";

Result:

errno = 0
12595-05-08 01:21:00

Why MS localtime_s has limitations for time_t maximum value?
As result we have an unsafe code, it is enough to pass a date >3000 year and the application crashes.