Skip to content

Commit b4f5232

Browse files
authored
Merge pull request #3228 from eduar-hte/asctime-multithread
Replace usage of std::ctime, which is not safe in multithread contexts
2 parents 554bd30 + 23a341e commit b4f5232

File tree

12 files changed

+60
-69
lines changed

12 files changed

+60
-69
lines changed

src/audit_log/writer/parallel.cc

+11-12
Original file line numberDiff line numberDiff line change
@@ -51,28 +51,27 @@ Parallel::~Parallel() {
5151

5252
inline std::string Parallel::logFilePath(time_t *t,
5353
int part) {
54-
struct tm timeinfo;
55-
char tstr[300];
56-
std::string name("");
54+
std::string name;
5755

56+
struct tm timeinfo;
5857
localtime_r(t, &timeinfo);
5958

6059
if (part & YearMonthDayDirectory) {
61-
memset(tstr, '\0', 300);
62-
strftime(tstr, 299, "/%Y%m%d", &timeinfo);
63-
name = tstr;
60+
char tstr[std::size("/yyyymmdd")];
61+
strftime(tstr, std::size(tstr), "/%Y%m%d", &timeinfo);
62+
name.append(tstr);
6463
}
6564

6665
if (part & YearMonthDayAndTimeDirectory) {
67-
memset(tstr, '\0', 300);
68-
strftime(tstr, 299, "/%Y%m%d-%H%M", &timeinfo);
69-
name = name + tstr;
66+
char tstr[std::size("/yyyymmdd-hhmm")];
67+
strftime(tstr, std::size(tstr), "/%Y%m%d-%H%M", &timeinfo);
68+
name.append(tstr);
7069
}
7170

7271
if (part & YearMonthDayAndTimeFileName) {
73-
memset(tstr, '\0', 300);
74-
strftime(tstr, 299, "/%Y%m%d-%H%M%S", &timeinfo);
75-
name = name + tstr;
72+
char tstr[std::size("/yyyymmdd-hhmmss")];
73+
strftime(tstr, std::size(tstr), "/%Y%m%d-%H%M%S", &timeinfo);
74+
name.append(tstr);
7675
}
7776

7877
return name;

src/request_body_processor/multipart.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ MultipartPartTmpFile::~MultipartPartTmpFile() {
6565
}
6666

6767
void MultipartPartTmpFile::Open() {
68-
struct tm timeinfo;
69-
time_t tt = time(NULL);
68+
time_t tt = time(nullptr);
7069

70+
struct tm timeinfo;
7171
localtime_r(&tt, &timeinfo);
7272

73-
char tstr[17];
73+
char tstr[std::size("/yyyymmdd-hhmmss")];
7474
strftime(tstr, std::size(tstr), "/%Y%m%d-%H%M%S", &timeinfo);
7575

7676
std::string path = m_transaction->m_rules->m_uploadDirectory.m_value;

src/transaction.cc

+7-8
Original file line numberDiff line numberDiff line change
@@ -1509,13 +1509,12 @@ bool Transaction::intervention(ModSecurityIntervention *it) {
15091509
std::string Transaction::toOldAuditLogFormatIndex(const std::string &filename,
15101510
double size, const std::string &md5) {
15111511
std::stringstream ss;
1512-
struct tm timeinfo;
1513-
char tstr[300];
15141512

1515-
memset(tstr, '\0', 300);
1513+
struct tm timeinfo;
15161514
localtime_r(&this->m_timeStamp, &timeinfo);
15171515

1518-
strftime(tstr, 299, "[%d/%b/%Y:%H:%M:%S %z]", &timeinfo);
1516+
char tstr[std::size("[dd/Mmm/yyyy:hh:mm:ss shhmm]")];
1517+
strftime(tstr, std::size(tstr), "[%d/%b/%Y:%H:%M:%S %z]", &timeinfo);
15191518

15201519
ss << utils::string::dash_if_empty(
15211520
m_variableRequestHeaders.resolveFirst("Host").get())
@@ -1572,14 +1571,14 @@ std::string Transaction::toOldAuditLogFormatIndex(const std::string &filename,
15721571
std::string Transaction::toOldAuditLogFormat(int parts,
15731572
const std::string &trailer) {
15741573
std::stringstream audit_log;
1575-
struct tm timeinfo;
1576-
char tstr[300];
15771574

1578-
memset(tstr, '\0', 300);
1575+
struct tm timeinfo;
15791576
localtime_r(&this->m_timeStamp, &timeinfo);
15801577

1578+
char tstr[std::size("[dd/Mmm/yyyy:hh:mm:ss shhmm]")];
1579+
strftime(tstr, std::size(tstr), "[%d/%b/%Y:%H:%M:%S %z]", &timeinfo);
1580+
15811581
audit_log << "--" << trailer << "-" << "A--" << std::endl;
1582-
strftime(tstr, 299, "[%d/%b/%Y:%H:%M:%S %z]", &timeinfo);
15831582
audit_log << tstr;
15841583
audit_log << " " << m_id->c_str();
15851584
audit_log << " " << this->m_clientIpAddress->c_str();

src/utils/string.h

+10-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
#include <utility>
2222
#include <sstream>
2323
#include <iomanip>
24+
#include <time.h>
25+
26+
#ifdef WIN32
27+
#include "src/compat/msvc.h"
28+
#endif
2429

2530
#ifndef SRC_UTILS_STRING_H_
2631
#define SRC_UTILS_STRING_H_
@@ -60,9 +65,11 @@ const char HEX2DEC[256] = {
6065

6166

6267
inline std::string ascTime(const time_t *t) {
63-
std::string ts = std::ctime(t);
64-
ts.pop_back();
65-
return ts;
68+
struct tm timeinfo;
69+
localtime_r(t, &timeinfo);
70+
char tstr[std::size("Www Mmm dd hh:mm:ss yyyy")];
71+
strftime(tstr, std::size(tstr), "%c", &timeinfo);
72+
return tstr;
6673
}
6774

6875

src/variables/time.cc

+3-5
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,13 @@ namespace variables {
4040
void Time::evaluate(Transaction *transaction,
4141
RuleWithActions *rule,
4242
std::vector<const VariableValue *> *l) {
43-
44-
char tstr[200];
45-
struct tm timeinfo;
4643
time_t timer;
47-
4844
time(&timer);
49-
memset(tstr, '\0', 200);
5045

46+
struct tm timeinfo;
5147
localtime_r(&timer, &timeinfo);
48+
49+
char tstr[std::size("hh:mm:ss")];
5250
strftime(tstr, 200, "%H:%M:%S", &timeinfo);
5351

5452
transaction->m_variableTime.assign(tstr);

src/variables/time_day.cc

+4-5
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,14 @@ namespace variables {
4040
void TimeDay::evaluate(Transaction *transaction,
4141
RuleWithActions *rule,
4242
std::vector<const VariableValue *> *l) {
43-
char tstr[200];
44-
struct tm timeinfo;
4543
time_t timer;
46-
4744
time(&timer);
48-
memset(tstr, '\0', 200);
4945

46+
struct tm timeinfo;
5047
localtime_r(&timer, &timeinfo);
51-
strftime(tstr, 200, "%d", &timeinfo);
48+
49+
char tstr[std::size("dd")];
50+
strftime(tstr, std::size(tstr), "%d", &timeinfo);
5251

5352
transaction->m_variableTimeDay.assign(tstr);
5453

src/variables/time_hour.cc

+4-5
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,14 @@ namespace variables {
4040
void TimeHour::evaluate(Transaction *transaction,
4141
RuleWithActions *rule,
4242
std::vector<const VariableValue *> *l) {
43-
char tstr[200];
44-
struct tm timeinfo;
4543
time_t timer;
46-
4744
time(&timer);
48-
memset(tstr, '\0', 200);
4945

46+
struct tm timeinfo;
5047
localtime_r(&timer, &timeinfo);
51-
strftime(tstr, 200, "%H", &timeinfo);
48+
49+
char tstr[std::size("hh")];
50+
strftime(tstr, std::size(tstr), "%H", &timeinfo);
5251

5352
transaction->m_variableTimeHour.assign(tstr);
5453

src/variables/time_min.cc

+4-5
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,14 @@ namespace variables {
4040
void TimeMin::evaluate(Transaction *transaction,
4141
RuleWithActions *rule,
4242
std::vector<const VariableValue *> *l) {
43-
char tstr[200];
44-
struct tm timeinfo;
4543
time_t timer;
46-
4744
time(&timer);
48-
memset(tstr, '\0', 200);
4945

46+
struct tm timeinfo;
5047
localtime_r(&timer, &timeinfo);
51-
strftime(tstr, 200, "%M", &timeinfo);
48+
49+
char tstr[std::size("mm")];
50+
strftime(tstr, std::size(tstr), "%M", &timeinfo);
5251

5352
transaction->m_variableTimeMin.assign(tstr);
5453

src/variables/time_mon.cc

+2-8
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,13 @@ namespace variables {
4040
void TimeMon::evaluate(Transaction *transaction,
4141
RuleWithActions *rule,
4242
std::vector<const VariableValue *> *l) {
43-
char tstr[200];
44-
struct tm timeinfo;
4543
time_t timer;
46-
4744
time(&timer);
48-
memset(tstr, '\0', 200);
4945

46+
struct tm timeinfo;
5047
localtime_r(&timer, &timeinfo);
51-
strftime(tstr, 200, "%m", &timeinfo);
52-
int a = atoi(tstr);
53-
a--;
5448

55-
transaction->m_variableTimeMin.assign(std::to_string(a));
49+
transaction->m_variableTimeMin.assign(std::to_string(timeinfo.tm_mon));
5650

5751
l->push_back(new VariableValue(&m_retName,
5852
&transaction->m_variableTimeMin));

src/variables/time_sec.cc

+4-5
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,14 @@ namespace variables {
4040
void TimeSec::evaluate(Transaction *transaction,
4141
RuleWithActions *rule,
4242
std::vector<const VariableValue *> *l) {
43-
char tstr[200];
44-
struct tm timeinfo;
4543
time_t timer;
46-
4744
time(&timer);
48-
memset(tstr, '\0', 200);
4945

46+
struct tm timeinfo;
5047
localtime_r(&timer, &timeinfo);
51-
strftime(tstr, 200, "%S", &timeinfo);
48+
49+
char tstr[std::size("ss")];
50+
strftime(tstr, std::size(tstr), "%S", &timeinfo);
5251

5352
transaction->m_variableTimeSec.assign(tstr);
5453

src/variables/time_wday.cc

+4-5
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,14 @@ namespace variables {
4040
void TimeWDay::evaluate(Transaction *transaction,
4141
RuleWithActions *rule,
4242
std::vector<const VariableValue *> *l) {
43-
char tstr[200];
44-
struct tm timeinfo;
4543
time_t timer;
46-
4744
time(&timer);
48-
memset(tstr, '\0', 200);
4945

46+
struct tm timeinfo;
5047
localtime_r(&timer, &timeinfo);
51-
strftime(tstr, 200, "%u", &timeinfo);
48+
49+
char tstr[std::size("d")];
50+
strftime(tstr, std::size(tstr), "%u", &timeinfo);
5251

5352
transaction->m_variableTimeWDay.assign(tstr);
5453

src/variables/time_year.cc

+4-5
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,14 @@ namespace variables {
4040
void TimeYear::evaluate(Transaction *transaction,
4141
RuleWithActions *rule,
4242
std::vector<const VariableValue *> *l) {
43-
char tstr[200];
44-
struct tm timeinfo;
4543
time_t timer;
46-
4744
time(&timer);
48-
memset(tstr, '\0', 200);
4945

46+
struct tm timeinfo;
5047
localtime_r(&timer, &timeinfo);
51-
strftime(tstr, 200, "%Y", &timeinfo);
48+
49+
char tstr[std::size("yyyy")];
50+
strftime(tstr, std::size(tstr), "%Y", &timeinfo);
5251

5352
transaction->m_variableTimeYear.assign(tstr);
5453

0 commit comments

Comments
 (0)