char **argv2;
argc2 = argc + num_extra_args;
- argv2 = (char **) malloc(argc2 * sizeof(char *));
+ argv2 = (char **) malloc((argc2 + 1) * sizeof(char *));
if (!argv2)
return (char **) NULL;
for (i=0; i<argc; i++) {
argv2[i+num_extra_args]=strdup(argv[i]);
}
+ argv2[argc2]=NULL;
return argv2;
}
-#define NUM_VSERVER_SUEXEC_ARGS 4
+#define NUM_VSERVER_SUEXEC_ARGS 5
int main(int argc, char **argv)
{
int argc2;
char slice_id_str[256];
unsigned int slice_xid;
-
+ char *envp[] = { NULL, NULL };
+ char home_env_str[256];
+
slice_xid = getuid();
slice_name = get_current_username(slice_xid);
if (!slice_name) {
argv2[1] = strdup(slice_name);
argv2[2] = strdup("suexec");
argv2[3] = strdup(slice_id_str);
- argv2[4] = strdup("/bin/sh");
+ argv2[4] = strdup("/bin/bash");
+ argv2[5] = strdup("-login");
+
+ snprintf(home_env_str, 255, "HOME=/home/%s", slice_name);
+ envp[0] = home_env_str;
if (setuid(geteuid())) goto out_exception;
- execve(VSERVER_PATH, argv2, NULL);
+ execve(VSERVER_PATH, argv2, envp);
out_exception:
printf("%s\n", strerror(errno));