diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/main.c | 24 | ||||
-rw-r--r-- | main/php_globals.h | 1 | ||||
-rw-r--r-- | main/php_syslog.c | 16 | ||||
-rw-r--r-- | main/php_syslog.h | 5 |
4 files changed, 44 insertions, 2 deletions
diff --git a/main/main.c b/main/main.c index 874c00e70f..3c7eaf6ceb 100644 --- a/main/main.c +++ b/main/main.c @@ -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" @@ -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 */ @@ -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() /* }}} */ diff --git a/main/php_globals.h b/main/php_globals.h index e01160a12c..5d6b17d139 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -170,6 +170,7 @@ struct _php_core_globals { zend_long syslog_facility; char *syslog_ident; zend_bool have_called_openlog; + zend_long syslog_filter; }; diff --git a/main/php_syslog.c b/main/php_syslog.c index 7fcecef231..3bb9ee86dd 100644 --- a/main/php_syslog.c +++ b/main/php_syslog.c @@ -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]); } } diff --git a/main/php_syslog.h b/main/php_syslog.h index 28cfe171cd..d8e45acfc9 100644 --- a/main/php_syslog.h +++ b/main/php_syslog.h @@ -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); |