Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions main/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
#include "php_ini.h"
#include "php_globals.h"
#include "php_main.h"
#include "php_syslog.h"
#include "fopen_wrappers.h"
#include "ext/standard/php_standard.h"
#include "ext/standard/php_string.h"
Expand Down Expand Up @@ -329,6 +330,28 @@ static PHP_INI_MH(OnChangeMemoryLimit)
}
/* }}} */

/* {{{ PHP_INI_MH
*/
static PHP_INI_MH(OnSetLogFilter)
{
const char *filter = ZSTR_VAL(new_value);

if (!strcmp(filter, "none")) {
PG(syslog_filter) = PHP_SYSLOG_FILTER_NONE;
return SUCCESS;
}
if (!strcmp(filter, "no-ctrl")) {
PG(syslog_filter) = PHP_SYSLOG_FILTER_NO_CTRL;
return SUCCESS;
}
if (!strcmp(filter, "ascii")) {
PG(syslog_filter) = PHP_SYSLOG_FILTER_ASCII;
return SUCCESS;
}

return FAILURE;
}
/* }}} */

/* {{{ php_disable_functions
*/
Expand Down Expand Up @@ -775,6 +798,7 @@ PHP_INI_BEGIN()
#endif
STD_PHP_INI_ENTRY("syslog.facility", "LOG_USER", PHP_INI_SYSTEM, OnSetFacility, syslog_facility, php_core_globals, core_globals)
STD_PHP_INI_ENTRY("syslog.ident", "php", PHP_INI_SYSTEM, OnUpdateString, syslog_ident, php_core_globals, core_globals)
STD_PHP_INI_ENTRY("syslog.filter", "no-ctrl", PHP_INI_ALL, OnSetLogFilter, syslog_filter, php_core_globals, core_globals)
PHP_INI_END()
/* }}} */

Expand Down
1 change: 1 addition & 0 deletions main/php_globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ struct _php_core_globals {
zend_long syslog_facility;
char *syslog_ident;
zend_bool have_called_openlog;
zend_long syslog_filter;
};


Expand Down
16 changes: 14 additions & 2 deletions main/php_syslog.c
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,23 @@ PHPAPI void php_syslog(int priority, const char *format, ...) /* {{{ */
break;
}

if (c != '\n')
/* check for NVT ASCII only unless test disabled */
if (((0x20 <= c) && (c <= 0x7e)))
smart_string_appendc(&sbuf, c);
else {
else if ((c >= 0x80) && (PG(syslog_filter) != PHP_SYSLOG_FILTER_ASCII))
smart_string_appendc(&sbuf, c);
else if (c == '\n') {
syslog(priority, "%.*s", (int)sbuf.len, sbuf.c);
smart_string_reset(&sbuf);
} else if ((c < 0x20) && (PG(syslog_filter) == PHP_SYSLOG_FILTER_NONE))
smart_string_appendc(&sbuf, c);
else {
const char xdigits[] = "0123456789abcdef";

smart_string_appendl(&sbuf, "\\x", 2);
smart_string_appendc(&sbuf, xdigits[(c / 0x10)]);
c &= 0x0f;
smart_string_appendc(&sbuf, xdigits[c]);
}
}

Expand Down
5 changes: 5 additions & 0 deletions main/php_syslog.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@
#endif
#endif

/* Syslog filters */
#define PHP_SYSLOG_FILTER_NONE 0
#define PHP_SYSLOG_FILTER_NO_CTRL 1
#define PHP_SYSLOG_FILTER_ASCII 2

BEGIN_EXTERN_C()
PHPAPI void php_syslog(int, const char *format, ...);
PHPAPI void php_openlog(const char *, int, int);
Expand Down
8 changes: 8 additions & 0 deletions php.ini-development
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,14 @@ report_memleaks = On
; This setting is on by default.
;report_zend_debug = 0

; Set this to disable filtering control characters (the default).
; Some loggers only accept NVT-ASCII, others accept anything that's not
; control characters. If your logger accepts everything, then no filtering
; is needed at all.
; Values are: ascii (space-tilde), no_ctrl (all characters space and above),
; and none (all characters)
;syslog.filter = ascii

; Store the last error/warning message in $php_errormsg (boolean).
; This directive is DEPRECATED.
; Default Value: Off
Expand Down
8 changes: 8 additions & 0 deletions php.ini-production
Original file line number Diff line number Diff line change
Expand Up @@ -522,6 +522,14 @@ report_memleaks = On
; This setting is on by default.
;report_zend_debug = 0

; Set this to disable filtering control characters (the default).
; Some loggers only accept NVT-ASCII, others accept anything that's not
; control characters. If your logger accepts everything, then no filtering
; is needed at all.
; Values are: ascii (space-tilde), no_ctrl (all characters space and above),
; and none (all characters)
;syslog.filter = ascii

; Store the last error/warning message in $php_errormsg (boolean). Setting this value
; to On can assist in debugging and is appropriate for development servers. It should
; however be disabled on production servers.
Expand Down