summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cpukit/ChangeLog7
-rw-r--r--cpukit/libmisc/shell/shell.c16
2 files changed, 17 insertions, 6 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog
index 8c6836242a..a30f4d5436 100644
--- a/cpukit/ChangeLog
+++ b/cpukit/ChangeLog
@@ -1,5 +1,12 @@
2009-11-23 Joel Sherrill <joel.sherrill@oarcorp.com>
+ * libmisc/shell/shell.c: Always duplicate the environment passed to us
+ because we will delete it when the shell exits. If we do not
+ duplicate it, we could end up freeing memory which was not allocated
+ from the heap or double freeing it.
+
+2009-11-23 Joel Sherrill <joel.sherrill@oarcorp.com>
+
* libmisc/shell/login_prompt.c: Properly process EOF and do not depend
on ungetc() to propagate the status back.
diff --git a/cpukit/libmisc/shell/shell.c b/cpukit/libmisc/shell/shell.c
index d270d9d92c..b87b79f01e 100644
--- a/cpukit/libmisc/shell/shell.c
+++ b/cpukit/libmisc/shell/shell.c
@@ -62,16 +62,20 @@ rtems_shell_env_t *rtems_current_shell_env = &rtems_global_shell_env;
* Initialize the shell user/process environment information
*/
rtems_shell_env_t *rtems_shell_init_env(
- rtems_shell_env_t *shell_env
+ rtems_shell_env_t *shell_env_p
)
{
- if ( !shell_env ) {
- shell_env = malloc(sizeof(rtems_shell_env_t));
- if ( !shell_env )
- return NULL;
+ rtems_shell_env_t *shell_env;
+
+ shell_env = malloc(sizeof(rtems_shell_env_t));
+ if ( !shell_env )
+ return NULL;
+ if ( !shell_env_p ) {
*shell_env = rtems_global_shell_env;
- shell_env->taskname = NULL;
+ } else {
+ *shell_env = *shell_env_p;
}
+ shell_env->taskname = NULL;
return shell_env;
}