Prevented the somewhat broken env copying code from clobbering memory it shouldn't really touch.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20127 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2007-02-13 06:42:58 +00:00
parent a004ea09b0
commit 4d634ea794
+10 -2
View File
@@ -717,7 +717,8 @@ team_create_thread_start(void *args)
argCount = teamArgs->arg_count; argCount = teamArgs->arg_count;
envCount = teamArgs->env_count; envCount = teamArgs->env_count;
uspa = (struct uspace_program_args *)(t->user_stack_base + t->user_stack_size + TLS_SIZE + ENV_SIZE); uspa = (struct uspace_program_args *)(t->user_stack_base + t->user_stack_size
+ TLS_SIZE + ENV_SIZE);
uargs = (char **)(uspa + 1); uargs = (char **)(uspa + 1);
udest = (char *)(uargs + argCount + 1); udest = (char *)(uargs + argCount + 1);
@@ -740,14 +741,21 @@ team_create_thread_start(void *args)
uargs[argCount] = NULL; uargs[argCount] = NULL;
uenv = (char **)(t->user_stack_base + t->user_stack_size + TLS_SIZE); uenv = (char **)(t->user_stack_base + t->user_stack_size + TLS_SIZE);
sizeLeft = ENV_SIZE;
udest = (char *)uenv + ENV_SIZE - 1; udest = (char *)uenv + ENV_SIZE - 1;
// the environment variables are copied from back to front // the environment variables are copied from back to front
TRACE(("team_create_thread_start: envc: %ld, env: %p\n", teamArgs->env_count, (void *)teamArgs->env)); TRACE(("team_create_thread_start: envc: %ld, env: %p\n",
teamArgs->env_count, (void *)teamArgs->env));
for (i = 0; i < envCount; i++) { for (i = 0; i < envCount; i++) {
ssize_t length = strlen(teamArgs->env[i]) + 1; ssize_t length = strlen(teamArgs->env[i]) + 1;
udest -= length; udest -= length;
if (udest < (char *)&uenv[envCount]) {
envCount = i;
break;
}
uenv[i] = udest; uenv[i] = udest;
if (user_memcpy(udest, teamArgs->env[i], length) < B_OK) { if (user_memcpy(udest, teamArgs->env[i], length) < B_OK) {