Skip to content

Commit e946f9c

Browse files
committed
Calculate sizes of strftime buffers based on format strings
- Leverage std::size to determine buffer size at compile time. - Simplified 'TimeMon::evaluate' implementation as it was using strftime to get the month, convert the string to int, and then decrement it by one to make it zero based. This same value is already available in the 'struct tm' previously generated with the call to localtime_r (and where the month is already zero-based)
1 parent 5e6fcbc commit e946f9c

File tree

11 files changed

+47
-63
lines changed

11 files changed

+47
-63
lines changed

src/audit_log/writer/parallel.cc

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,26 @@ 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);
60+
char tstr[std::size("/yyyymmdd")];
61+
strftime(tstr, std::size(tstr), "/%Y%m%d", &timeinfo);
6362
name = tstr;
6463
}
6564

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

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

src/request_body_processor/multipart.cc

Lines changed: 3 additions & 3 deletions
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

Lines changed: 7 additions & 8 deletions
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 -0700]")];
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 -0700]")];
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/variables/time.cc

Lines changed: 3 additions & 5 deletions
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

Lines changed: 4 additions & 5 deletions
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

Lines changed: 4 additions & 5 deletions
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

Lines changed: 4 additions & 5 deletions
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

Lines changed: 2 additions & 8 deletions
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

Lines changed: 4 additions & 5 deletions
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

Lines changed: 4 additions & 5 deletions
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

Lines changed: 4 additions & 5 deletions
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)