Fixed unsafe use of localtime
Since localtime is not thread-safe it should not be used in multithreaded contexts. For this reason all calls to localtime were changed to localtime_r in code where concurrency issues were possible. Internal tests were left unchanged because they aren't multithreaded.
This commit is contained in:
parent
84d2c72db2
commit
6164b7f301
@ -161,7 +161,7 @@ int main(int argc, char* argv[])
|
||||
ss_dassert(succp);
|
||||
|
||||
t = time(NULL);
|
||||
tm = *(localtime(&t));
|
||||
localtime_r(&t, &tm);
|
||||
err = MXS_ERROR("%04d %02d/%02d %02d.%02d.%02d",
|
||||
tm.tm_year+1900,
|
||||
tm.tm_mon+1,
|
||||
|
@ -1986,9 +1986,9 @@ dprintOneDCB(DCB *pdcb, DCB *dcb)
|
||||
if (dcb->persistentstart)
|
||||
{
|
||||
char buff[20];
|
||||
struct tm * timeinfo;
|
||||
timeinfo = localtime (&dcb->persistentstart);
|
||||
strftime(buff, sizeof(buff), "%b %d %H:%M:%S", timeinfo);
|
||||
struct tm timeinfo;
|
||||
localtime_r(&dcb->persistentstart, &timeinfo);
|
||||
strftime(buff, sizeof(buff), "%b %d %H:%M:%S", &timeinfo);
|
||||
dcb_printf(pdcb, "\t\tAdded to persistent pool: %s\n", buff);
|
||||
}
|
||||
}
|
||||
@ -2160,9 +2160,9 @@ dprintDCB(DCB *pdcb, DCB *dcb)
|
||||
if (dcb->persistentstart)
|
||||
{
|
||||
char buff[20];
|
||||
struct tm * timeinfo;
|
||||
timeinfo = localtime (&dcb->persistentstart);
|
||||
strftime(buff, sizeof(buff), "%b %d %H:%M:%S", timeinfo);
|
||||
struct tm timeinfo;
|
||||
localtime_r(&dcb->persistentstart, &timeinfo);
|
||||
strftime(buff, sizeof(buff), "%b %d %H:%M:%S", &timeinfo);
|
||||
dcb_printf(pdcb, "\t\tAdded to persistent pool: %s\n", buff);
|
||||
}
|
||||
}
|
||||
|
@ -516,6 +516,8 @@ static bool file_write_footer(
|
||||
return succp;
|
||||
}
|
||||
|
||||
// Documentation says 26 bytes is enough, but 32 is a nice round number.
|
||||
#define ASCTIME_BUF_LEN 32
|
||||
static bool file_write_header(
|
||||
FILE* outfile)
|
||||
{
|
||||
@ -524,10 +526,10 @@ static bool file_write_header(
|
||||
size_t len2;
|
||||
size_t len3;
|
||||
const char* header_buf1;
|
||||
char* header_buf2 = NULL;
|
||||
char header_buf2[ASCTIME_BUF_LEN];
|
||||
const char* header_buf3;
|
||||
time_t* t = NULL;
|
||||
struct tm* tm = NULL;
|
||||
time_t t;
|
||||
struct tm tm;
|
||||
#if defined(LAPTOP_TEST)
|
||||
struct timespec ts1;
|
||||
ts1.tv_sec = 0;
|
||||
@ -538,23 +540,10 @@ static bool file_write_header(
|
||||
return true;
|
||||
#endif
|
||||
|
||||
if ((t = (time_t *)malloc(sizeof(time_t))) == NULL) {
|
||||
goto return_succp;
|
||||
}
|
||||
|
||||
if ((tm = (struct tm *)malloc(sizeof(struct tm))) == NULL) {
|
||||
goto return_succp;
|
||||
}
|
||||
|
||||
*t = time(NULL);
|
||||
*tm = *localtime(t);
|
||||
localtime_r(&t, &tm);
|
||||
|
||||
header_buf1 = "\n\nMariaDB Corporation MaxScale " MAXSCALE_VERSION "\t";
|
||||
header_buf2 = strdup(asctime(tm));
|
||||
|
||||
if (header_buf2 == NULL) {
|
||||
goto return_succp;
|
||||
}
|
||||
asctime_r(&tm, header_buf2);
|
||||
header_buf3 = "------------------------------------------------------\n";
|
||||
|
||||
len1 = strlen(header_buf1);
|
||||
@ -570,16 +559,6 @@ static bool file_write_header(
|
||||
|
||||
succp = true;
|
||||
|
||||
return_succp:
|
||||
if (tm != NULL) {
|
||||
free(tm);
|
||||
}
|
||||
if (t != NULL) {
|
||||
free(t);
|
||||
}
|
||||
if (header_buf2 != NULL) {
|
||||
free(header_buf2);
|
||||
}
|
||||
return succp;
|
||||
}
|
||||
|
||||
|
@ -530,7 +530,8 @@ module_feedback_send(void* data) {
|
||||
int http_send = 0;
|
||||
|
||||
now = time(NULL);
|
||||
now_tm = localtime(&now);
|
||||
struct tm now_result;
|
||||
now_tm = localtime_r(&now, &now_result);
|
||||
hour = now_tm->tm_hour;
|
||||
|
||||
FEEDBACK_CONF *feedback_config = (FEEDBACK_CONF *) data;
|
||||
|
@ -1653,15 +1653,15 @@ GWBUF* gen_dummy_error(FW_SESSION* session, char* msg)
|
||||
bool inside_timerange(TIMERANGE* comp)
|
||||
{
|
||||
|
||||
struct tm* tm_now;
|
||||
struct tm tm_now;
|
||||
struct tm tm_before, tm_after;
|
||||
time_t before, after, now, time_now;
|
||||
double to_before, to_after;
|
||||
|
||||
time(&time_now);
|
||||
tm_now = localtime(&time_now);
|
||||
memcpy(&tm_before, tm_now, sizeof(struct tm));
|
||||
memcpy(&tm_after, tm_now, sizeof(struct tm));
|
||||
localtime_r(&time_now, &tm_now);
|
||||
memcpy(&tm_before, &tm_now, sizeof(struct tm));
|
||||
memcpy(&tm_after, &tm_now, sizeof(struct tm));
|
||||
|
||||
|
||||
tm_before.tm_sec = comp->start.tm_sec;
|
||||
@ -1674,7 +1674,7 @@ bool inside_timerange(TIMERANGE* comp)
|
||||
|
||||
before = mktime(&tm_before);
|
||||
after = mktime(&tm_after);
|
||||
now = mktime(tm_now);
|
||||
now = mktime(&tm_now);
|
||||
to_before = difftime(now, before);
|
||||
to_after = difftime(now, after);
|
||||
|
||||
@ -1730,10 +1730,10 @@ bool rule_matches(FW_INSTANCE* my_instance, FW_SESSION* my_session, GWBUF *queue
|
||||
QUERYSPEED* queryspeed = NULL;
|
||||
QUERYSPEED* rule_qs = NULL;
|
||||
time_t time_now;
|
||||
struct tm* tm_now;
|
||||
struct tm tm_now;
|
||||
|
||||
time(&time_now);
|
||||
tm_now = localtime(&time_now);
|
||||
localtime_r(&time_now, &tm_now);
|
||||
|
||||
matches = false;
|
||||
is_sql = modutil_is_SQL(queue) || modutil_is_SQL_prepare(queue);
|
||||
@ -1781,7 +1781,9 @@ bool rule_matches(FW_INSTANCE* my_instance, FW_SESSION* my_session, GWBUF *queue
|
||||
{
|
||||
matches = true;
|
||||
msg = strdup("Permission denied at this time.");
|
||||
MXS_INFO("dbfwfilter: rule '%s': query denied at: %s", rulelist->rule->name, asctime(tm_now));
|
||||
char buffer[32]; // asctime documentation requires 26
|
||||
asctime_r(&tm_now, buffer);
|
||||
MXS_INFO("dbfwfilter: rule '%s': query denied at: %s", rulelist->rule->name, buffer);
|
||||
goto queryresolved;
|
||||
}
|
||||
else
|
||||
|
@ -387,8 +387,11 @@ closeSession(FILTER *instance, void *session)
|
||||
}
|
||||
}
|
||||
fprintf(fp, "-----------+-----------------------------------------------------------------\n");
|
||||
fprintf(fp, "\n\nSession started %s",
|
||||
asctime(localtime(&my_session->connect.tv_sec)));
|
||||
struct tm tm;
|
||||
localtime_r(&my_session->connect.tv_sec, &tm);
|
||||
char buffer[32]; // asctime_r documentation requires 26
|
||||
asctime_r(&tm, buffer);
|
||||
fprintf(fp, "\n\nSession started %s", buffer);
|
||||
if (my_session->clientHost)
|
||||
{
|
||||
fprintf(fp, "Connection from %s\n",
|
||||
|
@ -491,7 +491,9 @@ static void httpd_send_headers(DCB *dcb, int final)
|
||||
const char *fmt = "%a, %d %b %Y %H:%M:%S GMT";
|
||||
time_t httpd_current_time = time(NULL);
|
||||
|
||||
strftime(date, sizeof(date), fmt, localtime(&httpd_current_time));
|
||||
struct tm tm;
|
||||
localtime_r(&httpd_current_time, &tm);
|
||||
strftime(date, sizeof(date), fmt, &tm);
|
||||
|
||||
dcb_printf(dcb, "HTTP/1.1 200 OK\r\nDate: %s\r\nServer: %s\r\nConnection: close\r\nContent-Type: application/json\r\n", date, HTTP_SERVER_STRING);
|
||||
|
||||
|
@ -334,8 +334,13 @@ char date[64] = "";
|
||||
const char *fmt = "%a, %d %b %Y %H:%M:%S GMT";
|
||||
|
||||
time_t httpd_current_time = time(NULL);
|
||||
struct tm tm;
|
||||
char buffer[32]; // asctime_r documentation requires 26
|
||||
|
||||
strftime(date, sizeof(date), fmt, localtime(&httpd_current_time));
|
||||
localtime_r(&http_current_time, &tm);
|
||||
asctime_r(&tm, buffer);
|
||||
|
||||
strftime(date, sizeof(date), fmt, buffer);
|
||||
|
||||
dcb_printf(dcb, "HTTP/1.1 200 OK\r\nDate: %s\r\nServer: %s\r\nConnection: close\r\nContent-Type: text/html\r\n", date, "MaxScale");
|
||||
|
||||
|
@ -639,7 +639,7 @@ size_t snprint_timestamp(
|
||||
/** Generate timestamp */
|
||||
|
||||
t = time(NULL);
|
||||
tm = *(localtime(&t));
|
||||
localtime_r(&t, &tm);
|
||||
snprintf(p_ts,
|
||||
MIN(tslen,timestamp_len),
|
||||
timestamp_formatstr,
|
||||
@ -687,7 +687,7 @@ size_t snprint_timestamp_hp(
|
||||
/** Generate timestamp */
|
||||
|
||||
gettimeofday(&tv,NULL);
|
||||
tm = *(localtime(&tv.tv_sec));
|
||||
localtime_r(&tv.tv_sec, &tm);
|
||||
usec = tv.tv_usec/1000;
|
||||
snprintf(p_ts,
|
||||
MIN(tslen,timestamp_len_hp),
|
||||
@ -1709,7 +1709,7 @@ static bool file_write_header(
|
||||
t = (time_t *)malloc(sizeof(time_t));
|
||||
tm = (struct tm *)malloc(sizeof(struct tm));
|
||||
*t = time(NULL);
|
||||
*tm = *localtime(t);
|
||||
localtime_r(t, tm);
|
||||
|
||||
CHK_FILE(file);
|
||||
header_buf1 = "\n\nMariaDB Corporation MaxScale\t";
|
||||
|
Loading…
x
Reference in New Issue
Block a user