1
0
mirror of http://git.haproxy.org/git/haproxy.git/ synced 2025-04-11 03:31:36 +00:00

BUILD/MINOR: tools: fix build warning in the date conversion functions

Some gcc versions emit potential null deref warnings at -O3 in
date2str_log(), gmt2str_log() and localdate2str_log() after utoa_pad()
because this function may return NULL if its size argument is too small
for the integer value. And it's true that we can't guarantee that the
input number is always valid.

This must be backported to all stable versions.
This commit is contained in:
Willy Tarreau 2019-02-12 11:26:29 +01:00
parent 1ef724e216
commit 4eee38aa57

View File

@ -2825,19 +2825,37 @@ char *date2str_log(char *dst, const struct tm *tm, const struct timeval *date, s
return NULL;
dst = utoa_pad((unsigned int)tm->tm_mday, dst, 3); // day
if (!dst)
return NULL;
*dst++ = '/';
memcpy(dst, monthname[tm->tm_mon], 3); // month
dst += 3;
*dst++ = '/';
dst = utoa_pad((unsigned int)tm->tm_year+1900, dst, 5); // year
if (!dst)
return NULL;
*dst++ = ':';
dst = utoa_pad((unsigned int)tm->tm_hour, dst, 3); // hour
if (!dst)
return NULL;
*dst++ = ':';
dst = utoa_pad((unsigned int)tm->tm_min, dst, 3); // minutes
if (!dst)
return NULL;
*dst++ = ':';
dst = utoa_pad((unsigned int)tm->tm_sec, dst, 3); // secondes
if (!dst)
return NULL;
*dst++ = '.';
utoa_pad((unsigned int)(date->tv_usec/1000), dst, 4); // millisecondes
if (!dst)
return NULL;
dst += 3; // only the 3 first digits
*dst = '\0';
@ -2919,17 +2937,32 @@ char *gmt2str_log(char *dst, struct tm *tm, size_t size)
return NULL;
dst = utoa_pad((unsigned int)tm->tm_mday, dst, 3); // day
if (!dst)
return NULL;
*dst++ = '/';
memcpy(dst, monthname[tm->tm_mon], 3); // month
dst += 3;
*dst++ = '/';
dst = utoa_pad((unsigned int)tm->tm_year+1900, dst, 5); // year
if (!dst)
return NULL;
*dst++ = ':';
dst = utoa_pad((unsigned int)tm->tm_hour, dst, 3); // hour
if (!dst)
return NULL;
*dst++ = ':';
dst = utoa_pad((unsigned int)tm->tm_min, dst, 3); // minutes
if (!dst)
return NULL;
*dst++ = ':';
dst = utoa_pad((unsigned int)tm->tm_sec, dst, 3); // secondes
if (!dst)
return NULL;
*dst++ = ' ';
*dst++ = '+';
*dst++ = '0';
@ -2956,18 +2989,34 @@ char *localdate2str_log(char *dst, time_t t, struct tm *tm, size_t size)
gmt_offset = get_gmt_offset(t, tm);
dst = utoa_pad((unsigned int)tm->tm_mday, dst, 3); // day
if (!dst)
return NULL;
*dst++ = '/';
memcpy(dst, monthname[tm->tm_mon], 3); // month
dst += 3;
*dst++ = '/';
dst = utoa_pad((unsigned int)tm->tm_year+1900, dst, 5); // year
if (!dst)
return NULL;
*dst++ = ':';
dst = utoa_pad((unsigned int)tm->tm_hour, dst, 3); // hour
if (!dst)
return NULL;
*dst++ = ':';
dst = utoa_pad((unsigned int)tm->tm_min, dst, 3); // minutes
if (!dst)
return NULL;
*dst++ = ':';
dst = utoa_pad((unsigned int)tm->tm_sec, dst, 3); // secondes
if (!dst)
return NULL;
*dst++ = ' ';
memcpy(dst, gmt_offset, 5); // Offset from local time to GMT
dst += 5;
*dst = '\0';