On Wed, Apr 18, 2018 at 7:17 AM, Jim Riggs <jim...@riggs.me> wrote:
> I didn't think of this before, but there is one edge case this would miss: if 
> someone (for whatever reason) wants a relative ErrorLog *file* named 
> `syslog*', for example `ErrorLog "syslog-httpd.log"' or `ErrorLog 
> "syslog.log"'. It appears that this is already broken in server/log.c, 
> though. Also, log.c is using str(n)casecmp. The following would make things 
> consistent and handle this weird edge case. Thoughts?
>
> Index: server/core.c
> ===================================================================
> --- server/core.c       (revision 1829431)
> +++ server/core.c       (working copy)
> @@ -4867,7 +4867,8 @@
>  static int check_errorlog_dir(apr_pool_t *p, server_rec *s)
>  {
>      if (!s->error_fname || s->error_fname[0] == '|'
> -        || strcmp(s->error_fname, "syslog") == 0) {
> +        || strcasecmp(s->error_fname, "syslog") == 0
> +        || strncasecmp(s->error_fname, "syslog:", 7) == 0) {
>          return APR_SUCCESS;
>      }
>      else {
> @@ -5281,7 +5282,9 @@
>      apr_file_printf(out, "ServerRoot: \"%s\"\n", ap_server_root);
>      tmp = ap_server_root_relative(p, sconf->ap_document_root);
>      apr_file_printf(out, "Main DocumentRoot: \"%s\"\n", tmp);
> -    if (s->error_fname[0] != '|' && strcmp(s->error_fname, "syslog") != 0)
> +    if (s->error_fname[0] != '|'
> +        && strcasecmp(s->error_fname, "syslog") != 0
> +        && strncasecmp(s->error_fname, "syslog:", 7) != 0)
>          tmp = ap_server_root_relative(p, s->error_fname);
>      else
>          tmp = s->error_fname;
> @@ -5456,4 +5459,3 @@
>      core_cmds,                    /* command apr_table_t */
>      register_hooks                /* register hooks */
>  };
> -
> Index: server/log.c
> ===================================================================
> --- server/log.c        (revision 1829431)
> +++ server/log.c        (working copy)
> @@ -396,7 +396,8 @@
>      }
>
>  #ifdef HAVE_SYSLOG
> -    else if (!strncasecmp(s->error_fname, "syslog", 6)) {
> +    else if (strcasecmp(s->error_fname, "syslog") == 0
> +             || strncasecmp(s->error_fname, "syslog:", 7) == 0) {
>          if ((fname = strchr(s->error_fname, ':'))) {
>              /* s->error_fname could be [level]:[tag] (see #60525) */
>              const char *tag;

Shouldn't we normalize the use of strcmp instead of strcasecmp?
In any case it must be entirely normalized to one or the other.

Linux is a case-sensitive OS in the first place, and if configured
with SYSLOG: today it is broken when you hit core, which ignores
that code path. Since the behavior has always been syslog: I'm
not seeing a benefit to case insensitivity.

Reply via email to