packages/net/uwsgi/patches/030-plugins-cgi_adds_dontresolve_option.patch
Ilya Lipnitskiy b1cbd93bcd
treewide: Run refresh on all packages
The crude loop I wrote to come up with this changeset:

  find -L package/feeds/packages/ -name patches | \
  sed 's/patches$/refresh/' | sort | xargs make

Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
(cherry picked from commit 5d8d4fbbcb)
Signed-off-by: Jeffery To <jeffery.to@gmail.com>
2021-02-25 01:26:05 +08:00

63 lines
2.2 KiB
Diff

From f259999d824b921a8a443e73d8c2b9e2d2170413 Mon Sep 17 00:00:00 2001
From: Ansuel Smith <ansuelsmth@gmail.com>
Date: Tue, 8 Oct 2019 02:10:43 +0200
Subject: [PATCH] plugins/cgi: adds dontresolve option
This option permit to call the simbolic link instead of the file the simbolic link points.
All the security check are still done as the simbolic path is passed at the end after all the checks are passed. This is useful if some cgi app are used for multiple function based on the name they are called by.
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
plugins/cgi/cgi_plugin.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
--- a/plugins/cgi/cgi_plugin.c
+++ b/plugins/cgi/cgi_plugin.c
@@ -15,6 +15,7 @@ struct uwsgi_cgi {
struct uwsgi_string_list *loadlib;
struct uwsgi_string_list *cgi_safe;
int optimize;
+ int dontresolve;
int from_docroot;
int has_mountpoints;
struct uwsgi_dyn_dict *default_cgi;
@@ -75,6 +76,8 @@ struct uwsgi_option uwsgi_cgi_options[]
{"cgi-safe", required_argument, 0, "skip security checks if the cgi file is under the specified path", uwsgi_opt_add_string_list, &uc.cgi_safe, 0},
+ {"cgi-dontresolve", no_argument, 0 , "call symbolic link directly instead of the real path", uwsgi_opt_true,&uc.dontresolve, 0},
+
{0, 0, 0, 0, 0, 0, 0},
};
@@ -475,6 +478,7 @@ static int uwsgi_cgi_request(struct wsgi
char full_path[PATH_MAX];
char tmp_path[PATH_MAX];
+ char symbolic_path[PATH_MAX];
struct stat cgi_stat;
int need_free = 0;
int is_a_file = 0;
@@ -533,6 +537,10 @@ static int uwsgi_cgi_request(struct wsgi
uwsgi_404(wsgi_req);
return UWSGI_OK;
}
+ if (uc.dontresolve) {
+ full_path_len = strlen(full_path);
+ memcpy(symbolic_path, full_path, full_path_len+1);
+ }
full_path_len = strlen(tmp_path);
// add +1 to copy the null byte
@@ -639,6 +647,11 @@ static int uwsgi_cgi_request(struct wsgi
}
}
+ if (uc.dontresolve) {
+ full_path_len = strlen(symbolic_path);
+ memcpy(full_path, symbolic_path, full_path_len+1);
+ }
+
int ret = uwsgi_cgi_run(wsgi_req, docroot, docroot_len, full_path, helper, path_info, script_name, is_a_file, discard_base);
if (need_free) free(docroot);
return ret;