Commit f7341ff4006dd90ffc6560bb9db761b9d2950aaf

Authored by bellard
1 parent fd429f2f

fixed execve bug


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@67 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 8 additions and 4 deletions
linux-user/syscall.c
@@ -1077,7 +1077,6 @@ int do_vm86(CPUX86State *env, long subfunction, @@ -1077,7 +1077,6 @@ int do_vm86(CPUX86State *env, long subfunction,
1077 } 1077 }
1078 1078
1079 ts->target_v86 = target_v86; 1079 ts->target_v86 = target_v86;
1080 -  
1081 /* save current CPU regs */ 1080 /* save current CPU regs */
1082 ts->vm86_saved_regs.eax = 0; /* default vm86 syscall return code */ 1081 ts->vm86_saved_regs.eax = 0; /* default vm86 syscall return code */
1083 ts->vm86_saved_regs.ebx = env->regs[R_EBX]; 1082 ts->vm86_saved_regs.ebx = env->regs[R_EBX];
@@ -1239,22 +1238,27 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, @@ -1239,22 +1238,27 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3,
1239 case TARGET_NR_execve: 1238 case TARGET_NR_execve:
1240 { 1239 {
1241 char **argp, **envp; 1240 char **argp, **envp;
1242 - int argc = 0, envc = 0; 1241 + int argc, envc;
1243 uint32_t *p; 1242 uint32_t *p;
1244 char **q; 1243 char **q;
1245 1244
  1245 + argc = 0;
1246 for (p = (void *)arg2; *p; p++) 1246 for (p = (void *)arg2; *p; p++)
1247 argc++; 1247 argc++;
  1248 + envc = 0;
1248 for (p = (void *)arg3; *p; p++) 1249 for (p = (void *)arg3; *p; p++)
1249 envc++; 1250 envc++;
1250 1251
1251 - argp = alloca(argc * sizeof(void *));  
1252 - envp = alloca(envc * sizeof(void *)); 1252 + argp = alloca((argc + 1) * sizeof(void *));
  1253 + envp = alloca((envc + 1) * sizeof(void *));
1253 1254
1254 for (p = (void *)arg2, q = argp; *p; p++, q++) 1255 for (p = (void *)arg2, q = argp; *p; p++, q++)
1255 *q = (void *)tswap32(*p); 1256 *q = (void *)tswap32(*p);
  1257 + *q = NULL;
  1258 +
1256 for (p = (void *)arg3, q = envp; *p; p++, q++) 1259 for (p = (void *)arg3, q = envp; *p; p++, q++)
1257 *q = (void *)tswap32(*p); 1260 *q = (void *)tswap32(*p);
  1261 + *q = NULL;
1258 1262
1259 ret = get_errno(execve((const char *)arg1, argp, envp)); 1263 ret = get_errno(execve((const char *)arg1, argp, envp));
1260 } 1264 }