diff options
author | Max Romanov <max.romanov@nginx.com> | 2018-01-11 22:14:20 +0300 |
---|---|---|
committer | Max Romanov <max.romanov@nginx.com> | 2018-01-11 22:14:20 +0300 |
commit | 349717fb90edaf50ae2846db7b72a2da4285541b (patch) | |
tree | e12eda597a06a28310dcdc28a759b8e17a0f541c /src/nxt_php_sapi.c | |
parent | c105988e5102eefd91fa8336848e926ebbb42a5b (diff) | |
download | unit-349717fb90edaf50ae2846db7b72a2da4285541b.tar.gz unit-349717fb90edaf50ae2846db7b72a2da4285541b.tar.bz2 |
Changing relative php scripts paths to real ones.
This is required to run phpMyAdmin.
Diffstat (limited to 'src/nxt_php_sapi.c')
-rw-r--r-- | src/nxt_php_sapi.c | 117 |
1 files changed, 71 insertions, 46 deletions
diff --git a/src/nxt_php_sapi.c b/src/nxt_php_sapi.c index 425305a5..473b5447 100644 --- a/src/nxt_php_sapi.c +++ b/src/nxt_php_sapi.c @@ -122,7 +122,6 @@ typedef struct { nxt_app_request_t r; nxt_str_t script; nxt_app_wmsg_t *wmsg; - nxt_mp_t *mem_pool; size_t body_preread_size; } nxt_php_run_ctx_t; @@ -137,15 +136,6 @@ static nxt_str_t nxt_php_root; static nxt_str_t nxt_php_script; static nxt_str_t nxt_php_index = nxt_string("index.php"); -static void -nxt_php_strdup(nxt_str_t *dst, nxt_str_t *src) -{ - dst->start = malloc(src->length + 1); - nxt_memcpy(dst->start, src->start, src->length); - dst->start[src->length] = '\0'; - - dst->length = src->length; -} static void nxt_php_str_trim_trail(nxt_str_t *str, u_char t) @@ -183,15 +173,24 @@ NXT_EXPORT nxt_application_module_t nxt_app_module = { }; +nxt_inline u_char * +nxt_realpath(const void *c) +{ + return (u_char *) realpath(c, NULL); +} + + static nxt_int_t nxt_php_init(nxt_task_t *task, nxt_common_app_conf_t *conf) { + u_char *p; + nxt_str_t rpath; nxt_str_t *root, *path, *script, *index; nxt_php_app_conf_t *c; c = &conf->u.php; - if (c->root.length == 0) { + if (c->root == NULL) { nxt_log_emerg(task->log, "php root is empty"); return NXT_ERROR; } @@ -201,30 +200,57 @@ nxt_php_init(nxt_task_t *task, nxt_common_app_conf_t *conf) script = &nxt_php_script; index = &nxt_php_index; - nxt_php_strdup(root, &c->root); + root->start = nxt_realpath(c->root); + if (nxt_slow_path(root->start == NULL)) { + nxt_log_emerg(task->log, "root realpath(%s) failed %E", + c->root, nxt_errno); + return NXT_ERROR; + } + + root->length = nxt_strlen(root->start); nxt_php_str_trim_trail(root, '/'); if (c->script.length > 0) { nxt_php_str_trim_lead(&c->script, '/'); - path->length = root->length + c->script.length + 1; - path->start = malloc(path->length + 1); + path->length = root->length + 1 + c->script.length; + path->start = nxt_malloc(path->length); + if (nxt_slow_path(path->start == NULL)) { + return NXT_ERROR; + } - nxt_memcpy(path->start, root->start, root->length); - path->start[root->length] = '/'; + p = nxt_cpymem(path->start, root->start, root->length); + *p++ = '/'; - nxt_memcpy(path->start + root->length + 1, - c->script.start, c->script.length); + nxt_memcpy(p, c->script.start, c->script.length); - path->start[path->length] = '\0'; + rpath.start = nxt_realpath(path->start); + if (nxt_slow_path(rpath.start == NULL)) { + nxt_log_emerg(task->log, "script realpath(%V) failed %E", + path, nxt_errno); + return NXT_ERROR; + } + rpath.length = nxt_strlen(rpath.start); + + if (!nxt_str_start(&rpath, root->start, root->length)) { + nxt_log_emerg(task->log, "script is not under php root"); + return NXT_ERROR; + } + + nxt_free(path->start); + + *path = rpath; script->length = c->script.length + 1; - script->start = malloc(script->length + 1); + script->start = nxt_malloc(script->length); + if (nxt_slow_path(script->start == NULL)) { + return NXT_ERROR; + } + script->start[0] = '/'; nxt_memcpy(script->start + 1, c->script.start, c->script.length); - script->start[script->length] = '\0'; nxt_log_error(NXT_LOG_INFO, task->log, "(ABS_MODE) php script \"%V\" root: \"%V\"", @@ -236,7 +262,13 @@ nxt_php_init(nxt_task_t *task, nxt_common_app_conf_t *conf) } if (c->index.length > 0) { - nxt_php_strdup(index, &c->index); + index->length = c->index.length; + index->start = nxt_malloc(index->length); + if (nxt_slow_path(index->start == NULL)) { + return NXT_ERROR; + } + + nxt_memcpy(index->start, c->index.start, c->index.length); } sapi_startup(&nxt_php_sapi_module); @@ -299,24 +331,18 @@ nxt_php_read_request(nxt_task_t *task, nxt_app_rmsg_t *rmsg, ctx->script.length = nxt_php_root.length + h->path.length + script_name.length; - ctx->script.start = nxt_mp_nget(ctx->mem_pool, - ctx->script.length + 1); - - p = ctx->script.start; - - nxt_memcpy(p, nxt_php_root.start, nxt_php_root.length); - p += nxt_php_root.length; + p = ctx->script.start = nxt_malloc(ctx->script.length); + if (nxt_slow_path(p == NULL)) { + return NXT_ERROR; + } - nxt_memcpy(p, h->path.start, h->path.length); - p += h->path.length; + p = nxt_cpymem(p, nxt_php_root.start, nxt_php_root.length); + p = nxt_cpymem(p, h->path.start, h->path.length); if (script_name.length > 0) { nxt_memcpy(p, script_name.start, script_name.length); - p += script_name.length; } - p[0] = '\0'; - } else { ctx->script = nxt_php_path; } @@ -357,18 +383,12 @@ nxt_php_run(nxt_task_t *task, nxt_php_run_ctx_t run_ctx; nxt_app_request_header_t *h; - if (nxt_php_root.length == 0) { - return NXT_ERROR; - } - nxt_memzero(&run_ctx, sizeof(run_ctx)); run_ctx.task = task; run_ctx.rmsg = rmsg; run_ctx.wmsg = wmsg; - run_ctx.mem_pool = nxt_mp_create(1024, 128, 256, 32); - h = &run_ctx.r.header; rc = nxt_php_read_request(task, rmsg, &run_ctx); @@ -410,6 +430,7 @@ nxt_php_run(nxt_task_t *task, if (nxt_slow_path(php_request_startup() == FAILURE)) { nxt_debug(task, "php_request_startup() failed"); + rc = NXT_ERROR; goto fail; } @@ -418,15 +439,15 @@ nxt_php_run(nxt_task_t *task, nxt_app_msg_flush(task, wmsg, 1); - nxt_mp_destroy(run_ctx.mem_pool); - - return NXT_OK; + rc = NXT_OK; fail: - nxt_mp_destroy(run_ctx.mem_pool); + if (run_ctx.script.start != nxt_php_path.start) { + nxt_free(run_ctx.script.start); + } - return NXT_ERROR; + return rc; } @@ -750,5 +771,9 @@ nxt_php_log_message(char *message #endif ) { - return; + nxt_php_run_ctx_t *ctx; + + ctx = SG(server_context); + + nxt_log(ctx->task, NXT_LOG_NOTICE, "php message: %s", message); } |