Commit f7341ff4006dd90ffc6560bb9db761b9d2950aaf
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 | 1077 | } |
1078 | 1078 | |
1079 | 1079 | ts->target_v86 = target_v86; |
1080 | - | |
1081 | 1080 | /* save current CPU regs */ |
1082 | 1081 | ts->vm86_saved_regs.eax = 0; /* default vm86 syscall return code */ |
1083 | 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 | 1238 | case TARGET_NR_execve: |
1240 | 1239 | { |
1241 | 1240 | char **argp, **envp; |
1242 | - int argc = 0, envc = 0; | |
1241 | + int argc, envc; | |
1243 | 1242 | uint32_t *p; |
1244 | 1243 | char **q; |
1245 | 1244 | |
1245 | + argc = 0; | |
1246 | 1246 | for (p = (void *)arg2; *p; p++) |
1247 | 1247 | argc++; |
1248 | + envc = 0; | |
1248 | 1249 | for (p = (void *)arg3; *p; p++) |
1249 | 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 | 1255 | for (p = (void *)arg2, q = argp; *p; p++, q++) |
1255 | 1256 | *q = (void *)tswap32(*p); |
1257 | + *q = NULL; | |
1258 | + | |
1256 | 1259 | for (p = (void *)arg3, q = envp; *p; p++, q++) |
1257 | 1260 | *q = (void *)tswap32(*p); |
1261 | + *q = NULL; | |
1258 | 1262 | |
1259 | 1263 | ret = get_errno(execve((const char *)arg1, argp, envp)); |
1260 | 1264 | } | ... | ... |