Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2019-12-17 00:08:31 +0300
committerJunio C Hamano <gitster@pobox.com>2019-12-17 00:08:31 +0300
commit4755a34c47c6d624d77ce90c7ea5247b43829cc0 (patch)
tree3ad415411bd7dfed02ce8ab0b645e0c043c08a19
parent37c2619d91aa63d4c7c07b6f8de5ff2e1c2472b2 (diff)
parent0109d676f9d4d6f9d149d5194bdb200c6de3fcca (diff)
Merge branch 'dd/time-reentrancy'
Avoid gmtime() and localtime() and prefer their reentrant counterparts. * dd/time-reentrancy: mingw: use {gm,local}time_s as backend for {gm,local}time_r archive-zip.c: switch to reentrant localtime_r date.c: switch to reentrant {gm,local}time_r
-rw-r--r--archive-zip.c10
-rw-r--r--compat/mingw.c12
-rw-r--r--date.c18
3 files changed, 21 insertions, 19 deletions
diff --git a/archive-zip.c b/archive-zip.c
index 4d66b5be6e..313c6b9c46 100644
--- a/archive-zip.c
+++ b/archive-zip.c
@@ -603,18 +603,18 @@ static void write_zip_trailer(const struct object_id *oid)
static void dos_time(timestamp_t *timestamp, int *dos_date, int *dos_time)
{
time_t time;
- struct tm *t;
+ struct tm tm;
if (date_overflows(*timestamp))
die(_("timestamp too large for this system: %"PRItime),
*timestamp);
time = (time_t)*timestamp;
- t = localtime(&time);
+ localtime_r(&time, &tm);
*timestamp = time;
- *dos_date = t->tm_mday + (t->tm_mon + 1) * 32 +
- (t->tm_year + 1900 - 1980) * 512;
- *dos_time = t->tm_sec / 2 + t->tm_min * 32 + t->tm_hour * 2048;
+ *dos_date = tm.tm_mday + (tm.tm_mon + 1) * 32 +
+ (tm.tm_year + 1900 - 1980) * 512;
+ *dos_time = tm.tm_sec / 2 + tm.tm_min * 32 + tm.tm_hour * 2048;
}
static int archive_zip_config(const char *var, const char *value, void *data)
diff --git a/compat/mingw.c b/compat/mingw.c
index c2a4835104..76ac8713d2 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1018,16 +1018,16 @@ int pipe(int filedes[2])
struct tm *gmtime_r(const time_t *timep, struct tm *result)
{
- /* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */
- memcpy(result, gmtime(timep), sizeof(struct tm));
- return result;
+ if (gmtime_s(result, timep) == 0)
+ return result;
+ return NULL;
}
struct tm *localtime_r(const time_t *timep, struct tm *result)
{
- /* localtime() in MSVCRT.DLL is thread-safe, but not reentrant */
- memcpy(result, localtime(timep), sizeof(struct tm));
- return result;
+ if (localtime_s(result, timep) == 0)
+ return result;
+ return NULL;
}
char *mingw_getcwd(char *pointer, int len)
diff --git a/date.c b/date.c
index 041db7db4e..b0d9a8421d 100644
--- a/date.c
+++ b/date.c
@@ -64,16 +64,16 @@ static time_t gm_time_t(timestamp_t time, int tz)
* thing, which means that tz -0100 is passed in as the integer -100,
* even though it means "sixty minutes off"
*/
-static struct tm *time_to_tm(timestamp_t time, int tz)
+static struct tm *time_to_tm(timestamp_t time, int tz, struct tm *tm)
{
time_t t = gm_time_t(time, tz);
- return gmtime(&t);
+ return gmtime_r(&t, tm);
}
-static struct tm *time_to_tm_local(timestamp_t time)
+static struct tm *time_to_tm_local(timestamp_t time, struct tm *tm)
{
time_t t = time;
- return localtime(&t);
+ return localtime_r(&t, tm);
}
/*
@@ -283,6 +283,7 @@ static void show_date_normal(struct strbuf *buf, timestamp_t time, struct tm *tm
const char *show_date(timestamp_t time, int tz, const struct date_mode *mode)
{
struct tm *tm;
+ struct tm tmbuf = { 0 };
struct tm human_tm = { 0 };
int human_tz = -1;
static struct strbuf timebuf = STRBUF_INIT;
@@ -318,11 +319,11 @@ const char *show_date(timestamp_t time, int tz, const struct date_mode *mode)
}
if (mode->local)
- tm = time_to_tm_local(time);
+ tm = time_to_tm_local(time, &tmbuf);
else
- tm = time_to_tm(time, tz);
+ tm = time_to_tm(time, tz, &tmbuf);
if (!tm) {
- tm = time_to_tm(0, 0);
+ tm = time_to_tm(0, 0, &tmbuf);
tz = 0;
}
@@ -959,10 +960,11 @@ void datestamp(struct strbuf *out)
{
time_t now;
int offset;
+ struct tm tm = { 0 };
time(&now);
- offset = tm_to_time_t(localtime(&now)) - now;
+ offset = tm_to_time_t(localtime_r(&now, &tm)) - now;
offset /= 60;
date_string(now, offset, out);