From 4a9eda2a8f7eaabce4010c2b53cd86e4cde72b09 Mon Sep 17 00:00:00 2001 From: "R. Steve McKown" Date: Mon, 24 Sep 2012 08:21:05 -0600 Subject: [PATCH] Simpler and better handling of non-repo access --- repo_shell.c | 84 ++++------------------------------------------------ 1 file changed, 6 insertions(+), 78 deletions(-) diff --git a/repo_shell.c b/repo_shell.c index f92ce6e..7fb31d4 100644 --- a/repo_shell.c +++ b/repo_shell.c @@ -12,6 +12,7 @@ #define CFG_FILE "/etc/repo_shell.cfg" #define GIT_ACL_FILE "git_acl.cfg" +#define SHELL "/bin/bash" typedef struct { char *svn_root; @@ -19,8 +20,6 @@ typedef struct { char *owner; } cfg_t; -static const char* shell_argv[] = { "/bin/bash", NULL }; - #undef USE_DEFAULTS #ifdef USE_DEFAULTS /* perhaps we want defaults? Not sure */ static cfg_t cfg { @@ -191,70 +190,6 @@ static int do_svnserve_cmd(const char *cmd, char *arg, char *user) return execvp(svnserve_argv[0], (char *const *) svnserve_argv); } -#define SPLIT_CMDLINE_BAD_ENDING 1 -#define SPLIT_CMDLINE_UNCLOSED_QUOTE 2 -static const char *split_cmdline_errors[] = { - "cmdline ends with \\", - "unclosed quote" -}; - -int split_cmdline(char *cmdline, const char ***argv) -{ - int src, dst, count = 0, size = 16; - char quoted = 0; - - *argv = xmalloc(sizeof(char *) * size); - - /* split alias_string */ - (*argv)[count++] = cmdline; - for (src = dst = 0; cmdline[src];) { - char c = cmdline[src]; - if (!quoted && isspace(c)) { - cmdline[dst++] = 0; - while (cmdline[++src] - && isspace(cmdline[src])) - ; /* skip */ - ALLOC_GROW(*argv, count+1, size); - (*argv)[count++] = cmdline + dst; - } else if (!quoted && (c == '\'' || c == '"')) { - quoted = c; - src++; - } else if (c == quoted) { - quoted = 0; - src++; - } else { - if (c == '\\' && quoted != '\'') { - src++; - c = cmdline[src]; - if (!c) { - free(*argv); - *argv = NULL; - return -SPLIT_CMDLINE_BAD_ENDING; - } - } - cmdline[dst++] = c; - src++; - } - } - - cmdline[dst] = 0; - - if (quoted) { - free(*argv); - *argv = NULL; - return -SPLIT_CMDLINE_UNCLOSED_QUOTE; - } - - ALLOC_GROW(*argv, count+1, size); - (*argv)[count] = NULL; - - return count; -} - -const char *split_cmdline_strerror(int split_cmdline_errno) { - return split_cmdline_errors[-split_cmdline_errno-1]; -} - static void cd_to_homedir(void) { const char *home = getenv("HOME"); @@ -320,8 +255,9 @@ int main(int argc, char **argv) if (argc == 1 && check_ssh_interactive(getuid())) { setuid(getuid()); - execvp(shell_argv[0], (char *const *) shell_argv); - } + argv[0] = SHELL; + execvp(argv[0], (char *const *) argv); + } #ifdef USE_DEFAULTS ini_parse("repo_shell.cfg", handler, &cfg); @@ -362,14 +298,6 @@ int main(int argc, char **argv) setuid(getuid()); cd_to_homedir(); - count = split_cmdline(prog, &user_argv); - if (count >= 0) { - execvp(user_argv[0], (char *const *) user_argv); - free(user_argv); - die("unrecognized command '%s'", argv[2]); - } else { - free(prog); - die("invalid command format '%s': %s", argv[2], - split_cmdline_strerror(count)); - } + argv[0] = SHELL; + execvp(argv[0], (char *const *) argv); } -- 2.39.2