Skip to content

Commit dfacf88

Browse files
author
Marc Stern
committed
We don't have to generate a temp name ourselves, it'll be done in apr_global_mutex_create().
We don't have to provide a filename, apr_global_mutex_create() generates one automatically. Moreover, under Unix & Windows, the preferred mechanism won't use a file at all => don't waste time. apr_file_mktemp() cannot be used as it creates the file (at least on FreeBSD).
2 parents d6f1ebb + c99d931 commit dfacf88

File tree

6 files changed

+74
-125
lines changed

6 files changed

+74
-125
lines changed

CHANGES

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
(to be released) - 2.9.x
2+
------------------------
3+
4+
* handle errors from apr_global_mutex_lock
5+
[PR #3257 - @marcstern]
6+
17
03 Sep 2024 - 2.9.8
28
-------------------
39

apache2/modsecurity.c

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -123,30 +123,7 @@ msc_engine *modsecurity_create(apr_pool_t *mp, int processing_mode) {
123123
}
124124

125125
int acquire_global_lock(apr_global_mutex_t **lock, apr_pool_t *mp) {
126-
apr_status_t rc;
127-
apr_file_t *lock_name;
128-
const char *temp_dir;
129-
const char *filename;
130-
131-
// get platform temp dir
132-
rc = apr_temp_dir_get(&temp_dir, mp);
133-
if (rc != APR_SUCCESS) {
134-
ap_log_perror(APLOG_MARK, APLOG_ERR, 0, mp, "ModSecurity: Could not get temp dir");
135-
return -1;
136-
}
137-
138-
// use temp path template for lock files
139-
char *path = apr_pstrcat(mp, temp_dir, GLOBAL_LOCK_TEMPLATE, NULL);
140-
141-
rc = apr_file_mktemp(&lock_name, path, 0, mp);
142-
if (rc != APR_SUCCESS) {
143-
ap_log_perror(APLOG_MARK, APLOG_ERR, 0, mp, " ModSecurity: Could not create temporary file for global lock");
144-
return -1;
145-
}
146-
// below func always return APR_SUCCESS
147-
apr_file_name_get(&filename, lock_name);
148-
149-
rc = apr_global_mutex_create(lock, filename, APR_LOCK_DEFAULT, mp);
126+
apr_status_t rc = apr_global_mutex_create(lock, NULL, APR_LOCK_DEFAULT, mp);
150127
if (rc != APR_SUCCESS) {
151128
ap_log_perror(APLOG_MARK, APLOG_ERR, 0, mp, " ModSecurity: Could not create global mutex");
152129
return -1;
@@ -166,6 +143,41 @@ int acquire_global_lock(apr_global_mutex_t **lock, apr_pool_t *mp) {
166143
#endif /* MSC_TEST */
167144
return APR_SUCCESS;
168145
}
146+
147+
/**
148+
* handle errors from apr_global_mutex_lock
149+
*/
150+
int msr_global_mutex_lock(modsec_rec* msr, apr_global_mutex_t* lock, const char* fct) {
151+
assert(msr);
152+
assert(msr->modsecurity); // lock is msr->modsecurity->..._lock
153+
assert(msr->mp);
154+
if (!lock) {
155+
msr_log(msr, 1, "%s: Global mutex was not created", fct);
156+
return -1;
157+
}
158+
159+
int rc = apr_global_mutex_lock(lock);
160+
if (rc != APR_SUCCESS) msr_log(msr, 1, "Audit log: Failed to lock global mutex: %s", get_apr_error(msr->mp, rc));
161+
return rc;
162+
}
163+
/**
164+
* handle errors from apr_global_mutex_unlock
165+
*/
166+
int msr_global_mutex_unlock(modsec_rec* msr, apr_global_mutex_t* lock, const char* fct) {
167+
assert(msr);
168+
assert(msr->modsecurity); // lock is msr->modsecurity->..._lock
169+
assert(msr->mp);
170+
if (!lock) {
171+
msr_log(msr, 1, "%s: Global mutex was not created", fct);
172+
return -1;
173+
}
174+
175+
int rc = apr_global_mutex_unlock(lock);
176+
// We should have get the warning at lock time, so ignore it here
177+
// if (rc != APR_SUCCESS) msr_log(msr, 1, "Audit log: Failed to unlock global mutex: %s", get_apr_error(msr->mp, rc));
178+
return rc;
179+
}
180+
169181
/**
170182
* Initialise the modsecurity engine. This function must be invoked
171183
* after configuration processing is complete as Apache needs to know the

apache2/modsecurity.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,6 @@ typedef struct msc_parm msc_parm;
135135

136136
#define FATAL_ERROR "ModSecurity: Fatal error (memory allocation or unexpected internal error)!"
137137

138-
#define GLOBAL_LOCK_TEMPLATE "/modsec-lock-tmp.XXXXXX"
139-
140138
extern DSOLOCAL char *new_server_signature;
141139
extern DSOLOCAL char *real_server_signature;
142140
extern DSOLOCAL char *chroot_dir;
@@ -707,6 +705,8 @@ struct msc_parm {
707705

708706
/* Reusable functions */
709707
int acquire_global_lock(apr_global_mutex_t **lock, apr_pool_t *mp);
708+
int msr_global_mutex_lock(modsec_rec* msr, apr_global_mutex_t* lock, const char* fct);
709+
int msr_global_mutex_unlock(modsec_rec* msr, apr_global_mutex_t* lock, const char* fct);
710710

711711
/* Engine functions */
712712

apache2/msc_geo.c

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -325,11 +325,7 @@ int geo_lookup(modsec_rec *msr, geo_rec *georec, const char *target, char **erro
325325
msr_log(msr, 9, "GEO: Using address \"%s\" (0x%08lx). %lu", targetip, ipnum, ipnum);
326326
}
327327

328-
ret = apr_global_mutex_lock(msr->modsecurity->geo_lock);
329-
if (ret != APR_SUCCESS) {
330-
msr_log(msr, 1, "Geo Lookup: Failed to lock proc mutex: %s",
331-
get_apr_error(msr->mp, ret));
332-
}
328+
msr_global_mutex_lock(msr, msr->modsecurity->geo_lock, "Geo lookup");
333329

334330
for (level = 31; level >= 0; level--) {
335331
/* Read the record */
@@ -361,13 +357,7 @@ int geo_lookup(modsec_rec *msr, geo_rec *georec, const char *target, char **erro
361357
if (rec_val == geo->ctry_offset) {
362358
*error_msg = apr_psprintf(msr->mp, "No geo data for \"%s\").", log_escape(msr->mp, target));
363359
msr_log(msr, 4, "%s", *error_msg);
364-
365-
ret = apr_global_mutex_unlock(msr->modsecurity->geo_lock);
366-
if (ret != APR_SUCCESS) {
367-
msr_log(msr, 1, "Geo Lookup: Failed to lock proc mutex: %s",
368-
get_apr_error(msr->mp, ret));
369-
}
370-
360+
msr_global_mutex_unlock(msr, msr->modsecurity->geo_lock, "Geo Lookup");
371361
return 0;
372362
}
373363

@@ -377,13 +367,7 @@ int geo_lookup(modsec_rec *msr, geo_rec *georec, const char *target, char **erro
377367
if ((country <= 0) || (country > GEO_COUNTRY_LAST)) {
378368
*error_msg = apr_psprintf(msr->mp, "No geo data for \"%s\" (country %d).", log_escape(msr->mp, target), country);
379369
msr_log(msr, 4, "%s", *error_msg);
380-
381-
ret = apr_global_mutex_unlock(msr->modsecurity->geo_lock);
382-
if (ret != APR_SUCCESS) {
383-
msr_log(msr, 1, "Geo Lookup: Failed to lock proc mutex: %s",
384-
get_apr_error(msr->mp, ret));
385-
}
386-
370+
msr_global_mutex_unlock(msr, msr->modsecurity->geo_lock, "Geo Lookup");
387371
return 0;
388372
}
389373

@@ -408,13 +392,7 @@ int geo_lookup(modsec_rec *msr, geo_rec *georec, const char *target, char **erro
408392
if ((country <= 0) || (country > GEO_COUNTRY_LAST)) {
409393
*error_msg = apr_psprintf(msr->mp, "No geo data for \"%s\" (country %d).", log_escape(msr->mp, target), country);
410394
msr_log(msr, 4, "%s", *error_msg);
411-
412-
ret = apr_global_mutex_unlock(msr->modsecurity->geo_lock);
413-
if (ret != APR_SUCCESS) {
414-
msr_log(msr, 1, "Geo Lookup: Failed to lock proc mutex: %s",
415-
get_apr_error(msr->mp, ret));
416-
}
417-
395+
msr_global_mutex_unlock(msr, msr->modsecurity->geo_lock, "Geo Lookup");
418396
return 0;
419397
}
420398
if (msr->txcfg->debuglog_level >= 9) {
@@ -503,13 +481,7 @@ int geo_lookup(modsec_rec *msr, geo_rec *georec, const char *target, char **erro
503481
}
504482

505483
*error_msg = apr_psprintf(msr->mp, "Geo lookup for \"%s\" succeeded.", log_escape(msr->mp, target));
506-
507-
ret = apr_global_mutex_unlock(msr->modsecurity->geo_lock);
508-
if (ret != APR_SUCCESS) {
509-
msr_log(msr, 1, "Geo Lookup: Failed to lock proc mutex: %s",
510-
get_apr_error(msr->mp, ret));
511-
}
512-
484+
msr_global_mutex_unlock(msr, msr->modsecurity->geo_lock, "Geo Lookup");
513485
return 1;
514486
}
515487

apache2/msc_logging.c

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -757,14 +757,7 @@ void sec_audit_logger_json(modsec_rec *msr) {
757757

758758
/* Lock the mutex, but only if we are using serial format. */
759759
if (msr->txcfg->auditlog_type != AUDITLOG_CONCURRENT) {
760-
if (!msr->modsecurity->auditlog_lock) msr_log(msr, 1, "Audit log: Global mutex was not created");
761-
else {
762-
rc = apr_global_mutex_lock(msr->modsecurity->auditlog_lock);
763-
if (rc != APR_SUCCESS) {
764-
msr_log(msr, 1, "Audit log: Failed to lock global mutex: %s",
765-
get_apr_error(msr->mp, rc));
766-
}
767-
}
760+
msr_global_mutex_lock(msr, msr->modsecurity->auditlog_lock, "Audit log");
768761
}
769762

770763
/**
@@ -1471,15 +1464,8 @@ void sec_audit_logger_json(modsec_rec *msr) {
14711464
* as it does not need an index file.
14721465
*/
14731466
if (msr->txcfg->auditlog_type != AUDITLOG_CONCURRENT) {
1474-
14751467
/* Unlock the mutex we used to serialise access to the audit log file. */
1476-
rc = apr_global_mutex_unlock(msr->modsecurity->auditlog_lock);
1477-
if (rc != APR_SUCCESS) {
1478-
msr_log(msr, 1, "Audit log: Failed to unlock global mutex '%s': %s",
1479-
apr_global_mutex_lockfile(msr->modsecurity->auditlog_lock),
1480-
get_apr_error(msr->mp, rc));
1481-
}
1482-
1468+
msr_global_mutex_unlock(msr, msr->modsecurity->auditlog_lock, "Audit log");
14831469
return;
14841470
}
14851471

@@ -1650,11 +1636,7 @@ void sec_audit_logger_native(modsec_rec *msr) {
16501636

16511637
/* Lock the mutex, but only if we are using serial format. */
16521638
if (msr->txcfg->auditlog_type != AUDITLOG_CONCURRENT) {
1653-
rc = apr_global_mutex_lock(msr->modsecurity->auditlog_lock);
1654-
if (rc != APR_SUCCESS) {
1655-
msr_log(msr, 1, "Audit log: Failed to lock global mutex: %s",
1656-
get_apr_error(msr->mp, rc));
1657-
}
1639+
msr_global_mutex_lock(msr, msr->modsecurity->auditlog_lock, "Audit log");
16581640
}
16591641

16601642

@@ -2253,15 +2235,8 @@ void sec_audit_logger_native(modsec_rec *msr) {
22532235
*/
22542236
if (msr->txcfg->auditlog_type != AUDITLOG_CONCURRENT) {
22552237
sec_auditlog_write(msr, "\n", 1);
2256-
22572238
/* Unlock the mutex we used to serialise access to the audit log file. */
2258-
rc = apr_global_mutex_unlock(msr->modsecurity->auditlog_lock);
2259-
if (rc != APR_SUCCESS) {
2260-
msr_log(msr, 1, "Audit log: Failed to unlock global mutex '%s': %s",
2261-
apr_global_mutex_lockfile(msr->modsecurity->auditlog_lock),
2262-
get_apr_error(msr->mp, rc));
2263-
}
2264-
2239+
msr_global_mutex_unlock(msr, msr->modsecurity->auditlog_lock, "Audit log");
22652240
return;
22662241
}
22672242

0 commit comments

Comments
 (0)