C语言 带有数组命令的NGINX模块导致分段故障

vjhs03f7  于 2023-03-22  发布在  Nginx
关注(0)|答案(1)|浏览(138)

考虑一个简单的NGINX模块:

typedef struct {
    ngx_array_t *claims;
} my_conf_t

static ngx_command_t my_commands[] = {
    { ngx_string("my_claims"),
        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,
        ngx_conf_set_str_array_slot,
        NGX_HTTP_LOC_CONF_OFFSET,
        offsetof(my_conf_t, claims),
        NULL },

    ngx_null_command
};

static ngx_http_module_t my_module_ctx = {
    NULL,
    my_module_init,
    NULL,
    NULL,
    NULL,
    NULL,
    my_module_create_loc_conf,
    my_module_merge_loc_conf
};

ngx_module_t my_module = {
    NGX_MODULE_V1,
    &my_module_ctx,
    my_commands,
    NGX_HTTP_MODULE,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NGX_MODULE_V1_PADDING
};

甚至在模块中的其他地方都没有使用claims,当使用我的新配置选项时,在nginx -t期间会抛出一个分段错误:

location / {
    my_claims test;
    return 200 OK;
}

该配置在注解/删除位置时抛出分段错误,从而允许nginx -t成功。
我看了NGINX Mail SSL模块的例子(这里和here),我不知道我错过了什么。

2w2cym1i

2w2cym1i1#

简单的答案是它会segfaults,因为你的模块不完整。你需要注册配置指令,等等。

ngx_module_t  ngx_http_my_module = {
    NGX_MODULE_V1,
    &my_module_ctx,  /* module context */
    my_commands,                        /* module directives */
    NGX_HTTP_MODULE,                    /* module type */
    NULL,                               /* init master */
    NULL,                               /* init module */
    NULL,                               /* init process */
    NULL,                               /* init thread */
    NULL,                               /* exit thread */
    NULL,                               /* exit process */
    NULL,                               /* exit master */
    NGX_MODULE_V1_PADDING
};

这还不够,最好检查一些开源的NGINX模块,并将它们用作样板。

相关问题