lionsoul2014/ip2region · critical

failed to allocate memory for db_path

Error message

failed to allocate memory for db_path

What it means

In the nginx module's init, when the xdb path is relative it is joined onto the conf prefix; the malloc for that combined path failed, so nginx logs this EMERG message and aborts configuration parsing. It indicates host memory exhaustion (or an absurdly long path) at config-load time.

Source

Thrown at binding/nginx/src/ngx_http_ip2region_module.c:97


// 用于初始化带版本校验的搜索器的辅助函数
static char *
ngx_http_ip2region_init_searcher(ngx_conf_t *cf, char *db_name,
    char *cache_policy, xdb_version_t *expected_version, const char *directive_name)
{
    ip2region_searcher_t       *ip2region_searcher;
    int                         err;
    char                       *db_path;
    size_t                      len;

    if(ngx_http_ip2region_is_absolute_path(db_name) == NGX_OK) {
        db_path = db_name;
    } else { // relative path to conf directory
        len = ngx_cycle->conf_prefix.len + strlen(db_name) + 1;
        db_path = malloc(len);
        if (db_path == NULL) {
            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                               "failed to allocate memory for db_path");
            return NGX_CONF_ERROR;
        }
        memset(db_path, '\0', len);
        memcpy(db_path, ngx_cycle->conf_prefix.data, ngx_cycle->conf_prefix.len);
        strcat(db_path, db_name);
    }

    ip2region_searcher = ngx_palloc(cf->pool, sizeof(ip2region_searcher_t));

    if(ip2region_searcher == NULL) {
        if(ngx_http_ip2region_is_absolute_path(db_name) != NGX_OK) {
            free(db_path);
        }
        return NGX_CONF_ERROR;
    }

    ip2region_searcher->v_index = NULL;

View on GitHub (pinned to c1a1fc7d59)

Solutions

  1. Free host memory or raise the container/memory limit and reload nginx
  2. Shorten the configured db path or use an absolute path (avoids the concatenation entirely)
  3. Check conf_prefix length; move xdb files closer to the conf root
  4. Check system logs (dmesg/OOM killer) if the failure recurs at startup

Example fix

# before
ip2region_db ip2region/../very/long/path/to/region.v6.xdb;
# after
ip2region_db /var/lib/ip2region/region.v6.xdb;  # absolute path, no malloc join
Defensive patterns

Strategy: validation

Validate before calling

/* C: check path length before init */
if (strlen(ngx_cycle->conf_prefix.data) + strlen(db_name) + 1 > 4096) {
    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "ip2region db path too long");
    return NGX_CONF_ERROR;
}

Try / catch

/* caller of init already returns NGX_CONF_ERROR; verify at startup */
nginx -t 2>&1 | grep 'failed to allocate memory for db_path' && free -m

Prevention

When it happens

Trigger: ngx_http_ip2region_init_searcher with a relative db_name whose conf_prefix + name length makes malloc return NULL — typically under severe memory pressure or with a path exceeding practical limits.

Common situations: Host with exhausted memory during nginx start/reload, extremely long prefix/path combination, restricted container memory limits.

Related errors


AI-assisted analysis of lionsoul2014/ip2region@c1a1fc7d59 (2026-09-02). Data as JSON: /api/errors/a3563e9d15083bd3. Report an issue: GitHub.