I tried to use slowcgi to execute a binary in cgi-bin/ when accessing a
resource.
So the config looked a bit like this:
location "/foo/bar" {
fastcgi param SCRIPT_FILENAME "/cgi-bin/foobar"
root ""
}
With this slowcgi fails with:
slowcgi[98607]: execve cgi-bin/foobar: No such file or directory
Now looking at the code I'm wondering how this is supposed to work.
So because of the present '/' there will be a chdir to the directory where
the binary is but then slowcgi uses the full path to exec that binary
which is not going to work.
I attached my fix below which for me at least seems to be the intention of
the code. I bet I missed a lot of nitty gritty details though.
--
:wq Claudio
Index: slowcgi.c
===================================================================
RCS file: /cvs/src/usr.sbin/slowcgi/slowcgi.c,v
retrieving revision 1.58
diff -u -p -r1.58 slowcgi.c
--- slowcgi.c 8 Jan 2021 22:05:34 -0000 1.58
+++ slowcgi.c 14 Apr 2021 17:38:10 -0000
@@ -888,6 +888,7 @@ exec_cgi(struct request *c)
char *argv[2];
char **env;
char *path;
+ char *script_name;
i = 0;
@@ -940,6 +941,7 @@ exec_cgi(struct request *c)
close(s_out[1]);
close(s_err[1]);
+ script_name = c->script_name;
path = strrchr(c->script_name, '/');
if (path != NULL) {
if (path != c->script_name) {
@@ -948,6 +950,7 @@ exec_cgi(struct request *c)
lwarn("cannot chdir to %s",
c->script_name);
*path = '/';
+ script_name = path + 1;
} else
if (chdir("/") == -1)
lwarn("cannot chdir to /");
@@ -960,7 +963,7 @@ exec_cgi(struct request *c)
SLIST_FOREACH(env_entry, &c->env, entry)
env[i++] = env_entry->val;
env[i++] = NULL;
- execve(c->script_name, argv, env);
+ execve(script_name, argv, env);
lwarn("execve %s", c->script_name);
_exit(1);