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)
This commit is contained in:
Eduardo Arias 2024-08-12 08:47:04 -07:00
parent 5e6fcbc60b
commit 23a341eb6a
11 changed files with 50 additions and 66 deletions

View File

@ -51,28 +51,27 @@ Parallel::~Parallel() {
inline std::string Parallel::logFilePath(time_t *t,
int part) {
struct tm timeinfo;
char tstr[300];
std::string name("");
std::string name;
struct tm timeinfo;
localtime_r(t, &timeinfo);
if (part & YearMonthDayDirectory) {
memset(tstr, '\0', 300);
strftime(tstr, 299, "/%Y%m%d", &timeinfo);
name = tstr;
char tstr[std::size("/yyyymmdd")];
strftime(tstr, std::size(tstr), "/%Y%m%d", &timeinfo);
name.append(tstr);
}
if (part & YearMonthDayAndTimeDirectory) {
memset(tstr, '\0', 300);
strftime(tstr, 299, "/%Y%m%d-%H%M", &timeinfo);
name = name + tstr;
char tstr[std::size("/yyyymmdd-hhmm")];
strftime(tstr, std::size(tstr), "/%Y%m%d-%H%M", &timeinfo);
name.append(tstr);
}
if (part & YearMonthDayAndTimeFileName) {
memset(tstr, '\0', 300);
strftime(tstr, 299, "/%Y%m%d-%H%M%S", &timeinfo);
name = name + tstr;
char tstr[std::size("/yyyymmdd-hhmmss")];
strftime(tstr, std::size(tstr), "/%Y%m%d-%H%M%S", &timeinfo);
name.append(tstr);
}
return name;

View File

@ -65,12 +65,12 @@ MultipartPartTmpFile::~MultipartPartTmpFile() {
}
void MultipartPartTmpFile::Open() {
struct tm timeinfo;
time_t tt = time(NULL);
time_t tt = time(nullptr);
struct tm timeinfo;
localtime_r(&tt, &timeinfo);
char tstr[17];
char tstr[std::size("/yyyymmdd-hhmmss")];
strftime(tstr, std::size(tstr), "/%Y%m%d-%H%M%S", &timeinfo);
std::string path = m_transaction->m_rules->m_uploadDirectory.m_value;

View File

@ -1509,13 +1509,12 @@ bool Transaction::intervention(ModSecurityIntervention *it) {
std::string Transaction::toOldAuditLogFormatIndex(const std::string &filename,
double size, const std::string &md5) {
std::stringstream ss;
struct tm timeinfo;
char tstr[300];
memset(tstr, '\0', 300);
struct tm timeinfo;
localtime_r(&this->m_timeStamp, &timeinfo);
strftime(tstr, 299, "[%d/%b/%Y:%H:%M:%S %z]", &timeinfo);
char tstr[std::size("[dd/Mmm/yyyy:hh:mm:ss shhmm]")];
strftime(tstr, std::size(tstr), "[%d/%b/%Y:%H:%M:%S %z]", &timeinfo);
ss << utils::string::dash_if_empty(
m_variableRequestHeaders.resolveFirst("Host").get())
@ -1572,14 +1571,14 @@ std::string Transaction::toOldAuditLogFormatIndex(const std::string &filename,
std::string Transaction::toOldAuditLogFormat(int parts,
const std::string &trailer) {
std::stringstream audit_log;
struct tm timeinfo;
char tstr[300];
memset(tstr, '\0', 300);
struct tm timeinfo;
localtime_r(&this->m_timeStamp, &timeinfo);
char tstr[std::size("[dd/Mmm/yyyy:hh:mm:ss shhmm]")];
strftime(tstr, std::size(tstr), "[%d/%b/%Y:%H:%M:%S %z]", &timeinfo);
audit_log << "--" << trailer << "-" << "A--" << std::endl;
strftime(tstr, 299, "[%d/%b/%Y:%H:%M:%S %z]", &timeinfo);
audit_log << tstr;
audit_log << " " << m_id->c_str();
audit_log << " " << this->m_clientIpAddress->c_str();

View File

@ -40,15 +40,13 @@ namespace variables {
void Time::evaluate(Transaction *transaction,
RuleWithActions *rule,
std::vector<const VariableValue *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
time(&timer);
memset(tstr, '\0', 200);
struct tm timeinfo;
localtime_r(&timer, &timeinfo);
char tstr[std::size("hh:mm:ss")];
strftime(tstr, 200, "%H:%M:%S", &timeinfo);
transaction->m_variableTime.assign(tstr);

View File

@ -40,15 +40,14 @@ namespace variables {
void TimeDay::evaluate(Transaction *transaction,
RuleWithActions *rule,
std::vector<const VariableValue *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
time(&timer);
memset(tstr, '\0', 200);
struct tm timeinfo;
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%d", &timeinfo);
char tstr[std::size("dd")];
strftime(tstr, std::size(tstr), "%d", &timeinfo);
transaction->m_variableTimeDay.assign(tstr);

View File

@ -40,15 +40,14 @@ namespace variables {
void TimeHour::evaluate(Transaction *transaction,
RuleWithActions *rule,
std::vector<const VariableValue *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
time(&timer);
memset(tstr, '\0', 200);
struct tm timeinfo;
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%H", &timeinfo);
char tstr[std::size("hh")];
strftime(tstr, std::size(tstr), "%H", &timeinfo);
transaction->m_variableTimeHour.assign(tstr);

View File

@ -40,15 +40,14 @@ namespace variables {
void TimeMin::evaluate(Transaction *transaction,
RuleWithActions *rule,
std::vector<const VariableValue *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
time(&timer);
memset(tstr, '\0', 200);
struct tm timeinfo;
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%M", &timeinfo);
char tstr[std::size("mm")];
strftime(tstr, std::size(tstr), "%M", &timeinfo);
transaction->m_variableTimeMin.assign(tstr);

View File

@ -40,19 +40,13 @@ namespace variables {
void TimeMon::evaluate(Transaction *transaction,
RuleWithActions *rule,
std::vector<const VariableValue *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
time(&timer);
memset(tstr, '\0', 200);
struct tm timeinfo;
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%m", &timeinfo);
int a = atoi(tstr);
a--;
transaction->m_variableTimeMin.assign(std::to_string(a));
transaction->m_variableTimeMin.assign(std::to_string(timeinfo.tm_mon));
l->push_back(new VariableValue(&m_retName,
&transaction->m_variableTimeMin));

View File

@ -40,15 +40,14 @@ namespace variables {
void TimeSec::evaluate(Transaction *transaction,
RuleWithActions *rule,
std::vector<const VariableValue *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
time(&timer);
memset(tstr, '\0', 200);
struct tm timeinfo;
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%S", &timeinfo);
char tstr[std::size("ss")];
strftime(tstr, std::size(tstr), "%S", &timeinfo);
transaction->m_variableTimeSec.assign(tstr);

View File

@ -40,15 +40,14 @@ namespace variables {
void TimeWDay::evaluate(Transaction *transaction,
RuleWithActions *rule,
std::vector<const VariableValue *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
time(&timer);
memset(tstr, '\0', 200);
struct tm timeinfo;
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%u", &timeinfo);
char tstr[std::size("d")];
strftime(tstr, std::size(tstr), "%u", &timeinfo);
transaction->m_variableTimeWDay.assign(tstr);

View File

@ -40,15 +40,14 @@ namespace variables {
void TimeYear::evaluate(Transaction *transaction,
RuleWithActions *rule,
std::vector<const VariableValue *> *l) {
char tstr[200];
struct tm timeinfo;
time_t timer;
time(&timer);
memset(tstr, '\0', 200);
struct tm timeinfo;
localtime_r(&timer, &timeinfo);
strftime(tstr, 200, "%Y", &timeinfo);
char tstr[std::size("yyyy")];
strftime(tstr, std::size(tstr), "%Y", &timeinfo);
transaction->m_variableTimeYear.assign(tstr);