merge rev17211 (Need to print the exception string as part of the self.log, or else...
[util-vserver-pl.git] / src / vsh.c
index 71698c1..0bbdadf 100644 (file)
--- a/src/vsh.c
+++ b/src/vsh.c
@@ -32,7 +32,7 @@ char **extend_argv(int argc, char **argv, int num_extra_args) {
     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;
@@ -40,11 +40,12 @@ char **extend_argv(int argc, char **argv, int num_extra_args) {
     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)
 {
@@ -53,7 +54,9 @@ 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) {
@@ -71,11 +74,15 @@ int main(int argc, char **argv)
     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));