Skip site navigation (1)Skip section navigation (2)
Date:      Fri,  2 Dec 2011 18:38:23 +0100 (CET)
From:      Xavier Beaudouin <kiwi@oav.net>
To:        FreeBSD-gnats-submit@FreeBSD.org
Cc:        osa@FreeBSD.org
Subject:   ports/163023: [PATCH] www/nginx: fix ngx_udplog
Message-ID:  <20111202173823.8A5481A984D@kiwi.oav.net>
Resent-Message-ID: <201112021740.pB2He7ii039442@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         163023
>Category:       ports
>Synopsis:       [PATCH] www/nginx: fix ngx_udplog
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Dec 02 17:40:07 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Xavier Beaudouin
>Release:        FreeBSD 8.2-RELEASE-p3 i386
>Organization:
Association KAZAR / The Caudium Group
>Environment:
System: FreeBSD proxy.home.oav.net 8.2-RELEASE-p3 FreeBSD 8.2-RELEASE-p3 #0: Tue Sep 27 18:07:27 UTC 2011
>Description:

3rd party ngx_udplog make segfault nginx when enabling it into configuration.

This patch update the udplog module to be up to the GIT version that fix this 
bug.

Port maintainer (osa@FreeBSD.org) is cc'd.

Generated with FreeBSD Port Tools 0.99
>How-To-Repeat:
>Fix:

--- nginx-1.0.10,1.patch begins here ---
diff -ruN --exclude=CVS /usr/ports/www/nginx.old/Makefile /usr/ports/www/nginx/Makefile
--- /usr/ports/www/nginx.old/Makefile	2011-11-23 12:10:17.000000000 +0100
+++ /usr/ports/www/nginx/Makefile	2011-12-02 18:33:37.000000000 +0100
@@ -542,7 +542,7 @@
 .endif
 
 .if defined(WITH_XRID_HEADER_MODULE)
-GIT_XRID_MODULE_VERSION=        0daa3cc
+GIT_XRID_MODULE_VERSION=	0daa3cc
 FETCH_ARGS=	-pRr
 MASTER_SITES+=	https://github.com/gabor/nginx-x-rid-header/tarball/master/:xrid
 DISTFILES+=	gabor-nginx-x-rid-header-${GIT_XRID_MODULE_VERSION}.tar.gz:xrid
diff -ruN --exclude=CVS /usr/ports/www/nginx.old/files/extra-patch-ngx_http_udplog_module.c /usr/ports/www/nginx/files/extra-patch-ngx_http_udplog_module.c
--- /usr/ports/www/nginx.old/files/extra-patch-ngx_http_udplog_module.c	2011-11-23 12:10:17.000000000 +0100
+++ /usr/ports/www/nginx/files/extra-patch-ngx_http_udplog_module.c	2011-12-02 18:32:49.000000000 +0100
@@ -1,6 +1,161 @@
---- ../nginx_udplog_module-1.0.0/ngx_http_udplog_module.c.orig	2010-01-11 19:16:46.000000000 +0300
-+++ ../nginx_udplog_module-1.0.0/ngx_http_udplog_module.c	2010-01-11 19:20:17.000000000 +0300
-@@ -280,7 +280,7 @@
+--- ../nginx_udplog_module-1.0.0/ngx_http_udplog_module.c.orig	2010-01-05 20:20:35.000000000 +0100
++++ ../nginx_udplog_module-1.0.0/ngx_http_udplog_module.c	2011-12-02 18:31:18.000000000 +0100
+@@ -1,4 +1,3 @@
+-
+ /*
+  * Copyright (C) 2010 Valery Kholodkov
+  *
+@@ -45,6 +44,12 @@
+ } ngx_http_log_fmt_t;
+ 
+ typedef struct {
++    ngx_str_t                value;
++    ngx_array_t             *lengths;
++    ngx_array_t             *values;
++} ngx_http_log_tag_template_t;
++
++typedef struct {
+     ngx_array_t                 formats;    /* array of ngx_http_log_fmt_t */
+     ngx_uint_t                  combined_used; /* unsigned  combined_used:1 */
+ } ngx_http_log_main_conf_t;
+@@ -64,8 +69,7 @@
+ typedef struct {
+     ngx_udp_endpoint_t       *endpoint;
+     ngx_http_log_fmt_t       *format;
+-    ngx_uint_t                facility;
+-    ngx_uint_t                severity;
++    ngx_uint_t                bare:1;
+ } ngx_http_udplog_t;
+ 
+ typedef struct {
+@@ -73,8 +77,11 @@
+ } ngx_http_udplog_main_conf_t;
+ 
+ typedef struct {
+-    ngx_array_t                *logs;       /* array of ngx_http_udplog_t */
+-    unsigned                    off;
++    ngx_array_t                 *logs;       /* array of ngx_http_udplog_t */
++    unsigned                     off;
++    ngx_http_log_tag_template_t *tag;
++    ngx_uint_t                   facility;
++    ngx_uint_t                   severity;
+ } ngx_http_udplog_conf_t;
+ 
+ ngx_int_t ngx_udp_connect(ngx_udp_connection_t *uc);
+@@ -88,6 +95,8 @@
+     void *child);
+ 
+ static char *ngx_http_udplog_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
++static char *ngx_http_udplog_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
++static char *ngx_http_udplog_set_tag(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
+ 
+ static ngx_int_t ngx_http_udplog_init(ngx_conf_t *cf);
+ 
+@@ -96,12 +105,26 @@
+ 
+     { ngx_string("access_udplog"),
+       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
+-                        |NGX_HTTP_LMT_CONF|NGX_CONF_TAKE123,
++                        |NGX_HTTP_LMT_CONF|NGX_CONF_TAKE1234,
+       ngx_http_udplog_set_log,
+       NGX_HTTP_LOC_CONF_OFFSET,
+       0,
+       NULL },
+ 
++    { ngx_string("udplog_priority"),
++      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,
++      ngx_http_udplog_set_priority,
++      NGX_HTTP_LOC_CONF_OFFSET,
++      0,
++      NULL },
++
++    { ngx_string("udplog_tag"),
++      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
++      ngx_http_udplog_set_tag,
++      NGX_HTTP_LOC_CONF_OFFSET,
++      offsetof(ngx_http_udplog_conf_t, tag),
++      NULL },
++
+       ngx_null_command
+ };
+ 
+@@ -166,7 +189,7 @@
+     { ngx_null_string, 0 }
+ };
+ 
+-static ngx_udplog_severity_t ngx_udplog_severity[] = {
++static ngx_udplog_severity_t ngx_udplog_severities[] = {
+     { ngx_string("emerg"),      0 },
+     { ngx_string("alert"),      1 },
+     { ngx_string("crit"),       2 },
+@@ -190,6 +213,7 @@
+     u_char                   *line, *p;
+     size_t                    len;
+     ngx_uint_t                i, l, pri;
++    ngx_str_t                 tag;
+     ngx_http_udplog_t        *log;
+     ngx_http_log_op_t        *op;
+     ngx_http_udplog_conf_t   *ulcf;
+@@ -205,12 +229,31 @@
+         return NGX_OK;
+     }
+ 
++    if(ulcf->tag != NULL)
++    {
++        if(ulcf->tag->lengths == NULL) {
++            tag = ulcf->tag->value;
++        }
++        else{
++            if (ngx_http_script_run(r, &tag, ulcf->tag->lengths->elts, 0, ulcf->tag->values->elts)
++                == NULL)
++            {
++                return NGX_ERROR;
++            }
++        }
++    }
++    else {
++        tag.data = (u_char*)"nginx";
++        tag.len = sizeof("nginx") - 1;
++    }
++
+     time = ngx_time();
+     ngx_gmtime(time, &tm);
+ 
+     log = ulcf->logs->elts;
++    pri = ulcf->facility * 8 + ulcf->severity;
++
+     for (l = 0; l < ulcf->logs->nelts; l++) {
+-        pri = log[l].facility * 8 + log[l].severity;
+ 
+         if(pri > 255) {
+             pri = NGX_UDPLOG_FACILITY_LOCAL7 * 8 + NGX_UDPLOG_SEVERITY_INFO;
+@@ -231,7 +274,8 @@
+             }
+         }
+ 
+-        len += sizeof("<255>") - 1 + sizeof("Jan 31 00:00:00") - 1 + 1 + ngx_cycle->hostname.len + 1;
++        len += sizeof("<255>") - 1 + sizeof("Jan 31 00:00:00") - 1 + 1 + ngx_cycle->hostname.len + 1
++            + tag.len + 2;
+ 
+ #if defined nginx_version && nginx_version >= 7003
+         line = ngx_pnalloc(r->pool, len);
+@@ -245,9 +289,12 @@
+         /*
+          * BSD syslog message header (see RFC 3164)
+          */
+-        p = ngx_sprintf(line, "<%ui>%s %2d %02d:%02d:%02d %V ", pri, months[tm.ngx_tm_mon - 1], tm.ngx_tm_mday,
+-            tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec, &ngx_cycle->hostname);
+-
++	if(!log[l].bare){
++	  p = ngx_sprintf(line, "<%ui>%s %2d %02d:%02d:%02d %V %V: ", pri, months[tm.ngx_tm_mon - 1], tm.ngx_tm_mday,
++			  tm.ngx_tm_hour, tm.ngx_tm_min, tm.ngx_tm_sec, &ngx_cycle->hostname, &tag);
++	}else{
++	  p = line;
++	}
+         for (i = 0; i < log[l].format->ops->nelts; i++) {
+             p = op[i].run(r, p, &op[i]);
+         }
+@@ -280,10 +327,15 @@
      uc->sockaddr = endpoint->peer_addr.sockaddr;
      uc->socklen = endpoint->peer_addr.socklen;
      uc->server = endpoint->peer_addr.name;
@@ -9,7 +164,27 @@
      uc->log = &cf->cycle->new_log;
  #else
      uc->log = cf->cycle->new_log;
-@@ -335,7 +335,11 @@
++#if defined nginx_version && nginx_version >= 8032
++    uc->log.handler = NULL;
++    uc->log.data = NULL;
++    uc->log.action = "logging";
++#endif
+ #endif
+ 
+     return NGX_OK;
+@@ -320,6 +372,11 @@
+ 
+     if (uc->connection == NULL) {
+         if(ngx_udp_connect(uc) != NGX_OK) {
++            if(uc->connection != NULL) {
++                ngx_free_connection(uc->connection);
++                uc->connection = NULL;
++            }
++
+             return NGX_ERROR;
+         }
+ 
+@@ -335,7 +392,11 @@
      }
  
      if ((size_t) n != (size_t) len) {
@@ -21,3 +196,236 @@
          return NGX_ERROR;
      }
  
+@@ -364,6 +425,9 @@
+     if (conf == NULL) {
+         return NGX_CONF_ERROR;
+     }
++    conf->off = 1;
++    conf->facility = NGX_CONF_UNSET_UINT;
++    conf->severity = NGX_CONF_UNSET_UINT;
+ 
+     return conf;
+ }
+@@ -374,37 +438,21 @@
+     ngx_http_udplog_conf_t *prev = parent;
+     ngx_http_udplog_conf_t *conf = child;
+ 
+-    ngx_http_udplog_t         *log;
+-    ngx_http_log_fmt_t        *fmt;
+-    ngx_http_log_main_conf_t  *lmcf;
+-
+-    if(conf->logs || conf->off) {
+-        return NGX_CONF_OK;
++    if(conf->tag == NULL) {
++        conf->tag = prev->tag;
+     }
+ 
+-    conf->logs = prev->logs;
+-    conf->off = prev->off;
++    ngx_conf_merge_uint_value(conf->facility,
++                              prev->facility, NGX_UDPLOG_FACILITY_LOCAL7);
++    ngx_conf_merge_uint_value(conf->severity,
++                              prev->severity, NGX_UDPLOG_SEVERITY_INFO);
+ 
+     if(conf->logs || conf->off) {
+         return NGX_CONF_OK;
+     }
+ 
+-    conf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_udplog_t));
+-    if(conf->logs == NULL) {
+-        return NGX_CONF_ERROR;
+-    }
+-
+-    log = ngx_array_push(conf->logs);
+-    if(log == NULL) {
+-        return NGX_CONF_ERROR;
+-    }
+-
+-    lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_log_module);
+-    fmt = lmcf->formats.elts;
+-
+-    /* the default "combined" format */
+-    log->format = &fmt[0];
+-    lmcf->combined_used = 1;
++    conf->logs = prev->logs;
++    conf->off = prev->off;
+ 
+     return NGX_CONF_OK;
+ }
+@@ -434,12 +482,6 @@
+     return endpoint;
+ }
+ 
+-static ngx_int_t
+-ngx_http_udplog_set_facility_and_severity(ngx_http_udplog_t *log, ngx_str_t *value)
+-{
+-    return NGX_OK;
+-}
+-
+ static char *
+ ngx_http_udplog_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+ {
+@@ -458,6 +500,7 @@
+         ulcf->off = 1;
+         return NGX_CONF_OK;
+     }
++    ulcf->off = 0;
+ 
+     if (ulcf->logs == NULL) {
+         ulcf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_http_udplog_t));
+@@ -483,10 +526,11 @@
+ 
+     ngx_memzero(&u, sizeof(ngx_url_t));
+ 
+-    u.host = value[1];
+-    u.port = 514;
++    u.url = value[1];
++    u.default_port = 514;
++    u.no_resolve = 0;
+ 
+-    if(ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {
++    if(ngx_parse_url(cf->pool, &u) != NGX_OK) {
+         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V: %s", &u.host, u.err);
+         return NGX_CONF_ERROR;
+     }
+@@ -496,7 +540,7 @@
+     if(log->endpoint == NULL) {
+         return NGX_CONF_ERROR;
+     }
+-
++    log->bare = 0;
+     if (cf->args->nelts >= 3) {
+         name = value[2];
+ 
+@@ -508,14 +552,18 @@
+         name.data = (u_char *) "combined";
+         lmcf->combined_used = 1;
+     }
+-
++    if (cf->args->nelts >= 4) {
++      if (ngx_strcmp(value[3].data, "bare") == 0) {
++	log->bare = 1;
++      }
++    }
+     fmt = lmcf->formats.elts;
+     for (i = 0; i < lmcf->formats.nelts; i++) {
+         if (fmt[i].name.len == name.len
+             && ngx_strcasecmp(fmt[i].name.data, name.data) == 0)
+         {
+             log->format = &fmt[i];
+-            goto facility;
++            goto done;
+         }
+     }
+ 
+@@ -523,12 +571,105 @@
+                        "unknown log format \"%V\"", &name);
+     return NGX_CONF_ERROR;
+ 
+-facility:
+-    log->facility = NGX_UDPLOG_FACILITY_LOCAL7;
+-    log->severity = NGX_UDPLOG_SEVERITY_INFO;
++done:
++
++    return NGX_CONF_OK;
++}
++
++
++static char *
++ngx_http_udplog_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
++{
++    ngx_http_udplog_conf_t     *ulcf = conf;
++    ngx_str_t                  *value;
++    ngx_udplog_facility_t      *f;
++    ngx_udplog_severity_t      *s;
++
++    value = cf->args->elts;
++
++    f = ngx_udplog_facilities;
++
++    while(f->name.data != NULL) {
++        if(ngx_strncmp(f->name.data, value[1].data, f->name.len) == 0)
++            break;
++
++        f++;
++    }
++
++    if(f->name.data != NULL) {
++        ulcf->facility = f->number;
++    }
++    else {
++        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
++                           "unknown facility \"%V\"", &value[1]);
++        return NGX_CONF_ERROR;
++    }
++
++    if (cf->args->nelts == 3) {
++        s = ngx_udplog_severities;
++
++        while(s->name.data != NULL) {
++            if(ngx_strncmp(s->name.data, value[2].data, s->name.len) == 0)
++                break;
++
++            s++;
++        }
++
++        if(s->name.data != NULL) {
++            ulcf->severity = s->number;
++        }
++        else {
++            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
++                               "unknown severity \"%V\"", &value[2]);
++            return NGX_CONF_ERROR;
++        }
++    }
++
++    return NGX_CONF_OK;
++}
++
++static char *
++ngx_http_udplog_set_tag(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
++{
++    ngx_int_t                   n;
++    ngx_str_t                  *value;
++    ngx_http_script_compile_t   sc;
++    ngx_http_log_tag_template_t **field, *h;
++
++    field = (ngx_http_log_tag_template_t**) (((u_char*)conf) + cmd->offset);
++
++    value = cf->args->elts;
++
++    if (*field == NULL) {
++        *field = ngx_palloc(cf->pool, sizeof(ngx_http_log_tag_template_t));
++        if (*field == NULL) {
++            return NGX_CONF_ERROR;
++        }
++    }
++
++    h = *field;
++
++    h->value = value[1];
++    h->lengths = NULL;
++    h->values = NULL;
++
++    /*
++     * Compile field name
++     */
++    n = ngx_http_script_variables_count(&value[1]);
++
++    if (n > 0) {
++        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
++
++        sc.cf = cf;
++        sc.source = &value[1];
++        sc.lengths = &h->lengths;
++        sc.values = &h->values;
++        sc.variables = n;
++        sc.complete_lengths = 1;
++        sc.complete_values = 1;
+ 
+-    if(cf->args->nelts == 4) {
+-        if(ngx_http_udplog_set_facility_and_severity(log, &value[3]) != NGX_OK) {
++        if (ngx_http_script_compile(&sc) != NGX_OK) {
+             return NGX_CONF_ERROR;
+         }
+     }
--- nginx-1.0.10,1.patch ends here ---

>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20111202173823.8A5481A984D>