diff options
Diffstat (limited to 'rtemsNfs/rtems-filesystem-patch')
-rw-r--r-- | rtemsNfs/rtems-filesystem-patch | 860 |
1 files changed, 0 insertions, 860 deletions
diff --git a/rtemsNfs/rtems-filesystem-patch b/rtemsNfs/rtems-filesystem-patch deleted file mode 100644 index c2d7861..0000000 --- a/rtemsNfs/rtems-filesystem-patch +++ /dev/null @@ -1,860 +0,0 @@ -# Diffed against OAR_orig (ss-20020301) on Sun Nov 3 00:24:13 PST 2002 -# T.S. - -For more information about this patch consult README (CAVEATS section). - -To apply this patch, - -chdir to c/src/lib/libc - -and issue - - patch -p0 < this_file - -It is always a good idea to try a "dry-run" before applying a patch: - - patch --dry-run -p0 < this_file - -Index: Makefile.am -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/Makefile.am,v -retrieving revision 1.1.1.2 -retrieving revision 1.2 -diff -c -r1.1.1.2 -r1.2 -*** Makefile.am 7 Mar 2002 01:53:46 -0000 1.1.1.2 ---- Makefile.am 28 Mar 2002 20:59:16 -0000 1.2 -*************** -*** 1,5 **** - ## -! ## $Id$ - ## - - AUTOMAKE_OPTIONS = foreign 1.4 ---- 1,5 ---- - ## -! ## $Id$ - ## - - AUTOMAKE_OPTIONS = foreign 1.4 -*************** -*** 32,37 **** ---- 32,39 ---- - - MALLOC_C_FILES = malloc.c mallocfreespace.c __brk.c __sbrk.c - -+ ENVIRON_C_FILES = envlock.c -+ - PASSWORD_GROUP_C_FILES = getpwent.c getgrent.c - - TERMINAL_IDENTIFICATION_C_FILES = ctermid.c isatty.c ttyname.c ttyname_r.c -*************** -*** 42,48 **** - UNIX_LIBC_C_FILES = unixlibc.c hosterr.c - - COMMON_C_FILES = gxx_wrappers.c printk.c $(BASE_FS_C_FILES) \ -! $(MALLOC_C_FILES) $(TERMIOS_C_FILES) $(ERROR_C_FILES) \ - $(ASSOCIATION_C_FILES) - - UNIX_C_FILES = $(UNIX_LIBC_C_FILES) ---- 44,50 ---- - UNIX_LIBC_C_FILES = unixlibc.c hosterr.c - - COMMON_C_FILES = gxx_wrappers.c printk.c $(BASE_FS_C_FILES) \ -! $(MALLOC_C_FILES) $(ENVIRON_C_FILES) $(TERMIOS_C_FILES) $(ERROR_C_FILES) \ - $(ASSOCIATION_C_FILES) - - UNIX_C_FILES = $(UNIX_LIBC_C_FILES) -Index: base_fs.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/base_fs.c,v -retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 base_fs.c -*** base_fs.c 14 Dec 2001 22:52:31 -0000 1.1.1.1 ---- base_fs.c 26 Oct 2002 02:45:15 -0000 -*************** -*** 49,54 **** ---- 49,55 ---- - int status; - rtems_filesystem_mount_table_entry_t *entry; - rtems_filesystem_mount_table_t *mt; -+ rtems_filesystem_location_info_t loc; - - /* - * Set the default umask to "022". -*************** -*** 75,82 **** - rtems_fatal_error_occurred( 0xABCD0002 ); - - rtems_filesystem_link_counts = 0; - rtems_filesystem_root = entry->mt_fs_root; -! rtems_filesystem_current = rtems_filesystem_root; - - - /* ---- 76,113 ---- - rtems_fatal_error_occurred( 0xABCD0002 ); - - rtems_filesystem_link_counts = 0; -+ -+ /* setup the 'current' and 'root' directories -+ * -+ * NOTE: cloning the pathlocs is not strictly -+ * necessary. Since we implicitely let -+ * all threads that don't call -+ * libio_set_private_env() share the same -+ * (initial) 'root' and 'current' locs, -+ * we (also implicitely) assume that the -+ * root filesystem doesn't care about -+ * reference counts. -+ * I just inserted the code snippet below -+ * to remind everybody of the fact by -+ * making it more explicit... -+ * Ideally, every thread would have to -+ * call either share_private_env() or -+ * set_private_env() - but then: that's -+ * gonna hit performance. -+ * -+ * Till Straumann, 10/25/2002 -+ */ - rtems_filesystem_root = entry->mt_fs_root; -! /* Clone the root pathloc */ -! rtems_filesystem_evaluate_path("/", 0, &loc, 0); -! rtems_filesystem_root = loc; -! /* One more clone for the current node */ -! rtems_filesystem_evaluate_path("/", 0, &loc, 0); -! rtems_filesystem_current = loc; -! -! /* Note: the global_env's refcnt doesn't matter -! * as the global env is never released -! */ - - - /* -Index: chroot.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/chroot.c,v -retrieving revision 1.1.1.2 -diff -c -r1.1.1.2 chroot.c -*** chroot.c 7 Mar 2002 01:53:47 -0000 1.1.1.2 ---- chroot.c 29 Oct 2002 03:01:47 -0000 -*************** -*** 38,51 **** - rtems_set_errno_and_return_minus_one( ENOTSUP ); - }; - -- loc = rtems_filesystem_root; /* save the value */ -- - result = chdir(pathname); - if (result) { -- rtems_filesystem_root = loc; /* restore the value */ - rtems_set_errno_and_return_minus_one( errno ); - }; -! rtems_filesystem_root = rtems_filesystem_current; - - return 0; - } ---- 38,53 ---- - rtems_set_errno_and_return_minus_one( ENOTSUP ); - }; - - result = chdir(pathname); - if (result) { - rtems_set_errno_and_return_minus_one( errno ); - }; -! /* clone the new root location */ -! if (rtems_filesystem_evaluate_path(".", 0, &loc, 0)) { -! rtems_set_errno_and_return_minus_one( errno ); -! } -! rtems_filesystem_freenode(&rtems_filesystem_root); -! rtems_filesystem_root = loc; - - return 0; - } -Index: eval.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/eval.c,v -retrieving revision 1.1.1.2 -retrieving revision 1.2 -diff -c -r1.1.1.2 -r1.2 -*** eval.c 7 Mar 2002 01:53:48 -0000 1.1.1.2 ---- eval.c 29 Oct 2002 21:03:50 -0000 1.2 -*************** -*** 10,16 **** - * found in the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * -! * $Id$ - */ - - #if HAVE_CONFIG_H ---- 10,16 ---- - * found in the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * -! * $Id$ - */ - - #if HAVE_CONFIG_H -*************** -*** 60,76 **** - - if ( (result == 0) && follow_link ) { - -! if ( !pathloc->ops->node_type_h ) - rtems_set_errno_and_return_minus_one( ENOTSUP ); - - type = (*pathloc->ops->node_type_h)( pathloc ); - - if ( ( type == RTEMS_FILESYSTEM_HARD_LINK ) || - ( type == RTEMS_FILESYSTEM_SYM_LINK ) ) { - -! if ( !pathloc->ops->eval_link_h ) - rtems_set_errno_and_return_minus_one( ENOTSUP ); - - result = (*pathloc->ops->eval_link_h)( pathloc, flags ); - - } ---- 60,93 ---- - - if ( (result == 0) && follow_link ) { - -! if ( !pathloc->ops->node_type_h ) { -! rtems_filesystem_freenode(pathloc); - rtems_set_errno_and_return_minus_one( ENOTSUP ); -+ } - - type = (*pathloc->ops->node_type_h)( pathloc ); - - if ( ( type == RTEMS_FILESYSTEM_HARD_LINK ) || - ( type == RTEMS_FILESYSTEM_SYM_LINK ) ) { - -! if ( !pathloc->ops->eval_link_h ) { -! rtems_filesystem_freenode(pathloc); - rtems_set_errno_and_return_minus_one( ENOTSUP ); -+ } - -+ /* what to do with the valid node pathloc points to -+ * if eval_link_h() fails? -+ * Let the FS implementation deal with this case. It -+ * should probably free pathloc in either case: -+ * - if the link evaluation fails, it must free the -+ * original (valid) pathloc because we are going -+ * to return -1 and hence the FS generics won't -+ * cleanup pathloc -+ * - if the link evaluation is successful, the updated -+ * pathloc will be passed up (and eventually released). -+ * Hence, the (valid) original node that we submit to -+ * eval_link_h() should be released by the handler. -+ */ - result = (*pathloc->ops->eval_link_h)( pathloc, flags ); - - } -Index: fchdir.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/fchdir.c,v -retrieving revision 1.1.1.2 -diff -c -r1.1.1.2 fchdir.c -*** fchdir.c 7 Mar 2002 01:53:48 -0000 1.1.1.2 ---- fchdir.c 25 Oct 2002 23:59:03 -0000 -*************** -*** 29,34 **** ---- 29,35 ---- - ) - { - rtems_libio_t *iop; -+ rtems_filesystem_location_info_t loc; - - rtems_libio_check_fd( fd ); - iop = rtems_libio_iop( fd ); -*************** -*** 65,74 **** - * this node which we are making here. I can - * see the freenode interface but do not see - * allocnode node interface. It maybe node_type. - */ - - rtems_filesystem_current = iop->pathinfo; - - return 0; - } -- ---- 66,80 ---- - * this node which we are making here. I can - * see the freenode interface but do not see - * allocnode node interface. It maybe node_type. -+ * -+ * FIXEC: T.Straumann: it is evaluate_path() - */ - - rtems_filesystem_current = iop->pathinfo; - -+ /* clone the current node */ -+ rtems_filesystem_evaluate_path(".", 0, &loc, 0); -+ rtems_filesystem_current = loc; -+ - return 0; - } -Index: getgrent.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/getgrent.c,v -retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 getgrent.c -*** getgrent.c 14 Dec 2001 22:52:31 -0000 1.1.1.1 ---- getgrent.c 27 Oct 2002 18:24:20 -0000 -*************** -*** 50,63 **** ---- 50,69 ---- - ) - { - FILE *fp; -+ #if 0 - rtems_user_env_t * aux=rtems_current_user_env; /* save */ -+ #endif - - init_etc_passwd_group(); -+ #if 0 - rtems_current_user_env=&rtems_global_user_env; /* set root */ -+ #endif - - if ((fp = fopen ("/etc/group", "r")) == NULL) { - errno = EINVAL; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return -1; - } - -*************** -*** 72,84 **** ---- 78,94 ---- - if (!strcmp (groupname, name)) { - fclose (fp); - *result = grp; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return 0; - } - } - fclose (fp); - errno = EINVAL; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return -1; - } - -*************** -*** 104,118 **** ---- 114,134 ---- - ) - { - FILE *fp; -+ #if 0 - rtems_user_env_t * aux=rtems_current_user_env; /* save */ -+ #endif - - - init_etc_passwd_group(); -+ #if 0 - rtems_current_user_env=&rtems_global_user_env; /* set root */ -+ #endif - - if ((fp = fopen ("/etc/group", "r")) == NULL) { - errno = EINVAL; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return -1; - } - -*************** -*** 128,140 **** ---- 144,160 ---- - if (gid == gr_group.gr_gid) { - fclose (fp); - *result = grp; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return 0; - } - } - fclose (fp); - errno = EINVAL; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return -1; - } - -*************** -*** 174,188 **** ---- 194,214 ---- - void - setgrent () - { -+ #if 0 - rtems_user_env_t * aux=rtems_current_user_env; /* save */ -+ #endif - init_etc_passwd_group(); -+ #if 0 - rtems_current_user_env=&rtems_global_user_env; /* set root */ -+ #endif - - if (group_fp != NULL) - fclose (group_fp); - - group_fp = fopen ("/etc/group", "r"); -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - } - - void -Index: getpwent.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/getpwent.c,v -retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 getpwent.c -*** getpwent.c 14 Dec 2001 22:52:31 -0000 1.1.1.1 ---- getpwent.c 27 Oct 2002 18:18:52 -0000 -*************** -*** 97,110 **** ---- 97,116 ---- - ) - { - FILE *fp; -+ #if 0 - rtems_user_env_t * aux=rtems_current_user_env; /* save */ -+ #endif - - init_etc_passwd_group(); -+ #if 0 - rtems_current_user_env=&rtems_global_user_env; /* set root */ -+ #endif - - if ((fp = fopen ("/etc/passwd", "r")) == NULL) { - errno = EINVAL; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return -1; - } - -*************** -*** 123,135 **** ---- 129,145 ---- - if (!strcmp (logname, name)) { - fclose (fp); - *result = pwd; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return 0; - } - } - fclose (fp); - errno = EINVAL; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return -1; - } - -*************** -*** 155,168 **** ---- 165,184 ---- - ) - { - FILE *fp; -+ #if 0 - rtems_user_env_t * aux=rtems_current_user_env; /* save */ -+ #endif - - init_etc_passwd_group(); -+ #if 0 - rtems_current_user_env=&rtems_global_user_env; /* set root */ -+ #endif - - if ((fp = fopen ("/etc/passwd", "r")) == NULL) { - errno = EINVAL; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return -1; - } - -*************** -*** 181,193 **** ---- 197,213 ---- - if (uid == pwd->pw_uid) { - fclose (fp); - *result = pwd; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return 0; - } - } - fclose (fp); - errno = EINVAL; -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - return -1; - } - -*************** -*** 230,244 **** ---- 250,270 ---- - - void setpwent( void ) - { -+ #if 0 - rtems_user_env_t * aux=rtems_current_user_env; /* save */ -+ #endif - init_etc_passwd_group(); -+ #if 0 - rtems_current_user_env=&rtems_global_user_env; /* set root */ -+ #endif - - if (passwd_fp != NULL) - fclose (passwd_fp); - - passwd_fp = fopen ("/etc/passwd", "r"); -+ #if 0 - rtems_current_user_env=aux; /* restore */ -+ #endif - } - - void endpwent( void ) -Index: mknod.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/mknod.c,v -retrieving revision 1.1.1.2 -retrieving revision 1.2 -diff -c -r1.1.1.2 -r1.2 -*** mknod.c 7 Mar 2002 01:53:51 -0000 1.1.1.2 ---- mknod.c 29 Oct 2002 21:03:50 -0000 1.2 -*************** -*** 12,18 **** - * found in the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * -! * $Id$ - */ - - #if HAVE_CONFIG_H ---- 12,18 ---- - * found in the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * -! * $Id$ - */ - - #if HAVE_CONFIG_H -*************** -*** 49,55 **** - rtems_filesystem_get_start_loc( pathname, &i, &temp_loc ); - - if ( !temp_loc.ops->evalformake_h ) { -- rtems_filesystem_freenode( &temp_loc ); - rtems_set_errno_and_return_minus_one( ENOTSUP ); - } - ---- 49,54 ---- -Index: mount.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/mount.c,v -retrieving revision 1.1.1.1 -diff -c -r1.1.1.1 mount.c -*** mount.c 14 Dec 2001 22:52:33 -0000 1.1.1.1 ---- mount.c 30 Oct 2002 06:39:09 -0000 -*************** -*** 14,20 **** - * found in the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * -! * $Id$ - */ - - #if HAVE_CONFIG_H ---- 14,20 ---- - * found in the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * -! * $Id$ - */ - - #if HAVE_CONFIG_H -*************** -*** 101,106 **** ---- 101,113 ---- - return -1; - } - -+ /* Do they support being mounted at all ? */ -+ if ( !fs_ops->fsmount_me_h ) { -+ errno = ENOTSUP; -+ goto cleanup_and_bail; -+ } -+ -+ - /* - * Allocate a mount table entry - */ -*************** -*** 140,145 **** ---- 147,158 ---- - */ - - loc_to_free = &loc; -+ -+ if ( !loc.ops->node_type_h ) { -+ errno = ENOTSUP; -+ goto cleanup_and_bail; -+ } -+ - if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { - errno = ENOTDIR; - goto cleanup_and_bail; -*************** -*** 198,210 **** - temp_mt_entry->mt_point_node.mt_entry = NULL; - } - -! if ( !fs_ops->fsmount_me_h ) { -! errno = ENOTSUP; - goto cleanup_and_bail; - } -- -- if ( fs_ops->fsmount_me_h( temp_mt_entry ) ) -- goto cleanup_and_bail; - - /* - * Add the mount table entry to the mount table chain ---- 211,223 ---- - temp_mt_entry->mt_point_node.mt_entry = NULL; - } - -! if ( fs_ops->fsmount_me_h( temp_mt_entry ) ) { -! /* try to undo the mount operation */ -! if ( loc.ops->unmount_h ) { -! loc.ops->unmount_h( temp_mt_entry ); -! } - goto cleanup_and_bail; - } - - /* - * Add the mount table entry to the mount table chain -Index: newlibc.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/newlibc.c,v -retrieving revision 1.1.1.1 -retrieving revision 1.3 -diff -c -r1.1.1.1 -r1.3 -*** newlibc.c 14 Dec 2001 22:52:33 -0000 1.1.1.1 ---- newlibc.c 16 Apr 2002 19:41:03 -0000 1.3 -*************** -*** 9,15 **** - * found in the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * -! * $Id$ - * - */ - ---- 9,15 ---- - * found in the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * -! * $Id$ - * - */ - -Index: privateenv.c -=================================================================== -RCS file: /afs/slac/g/spear/cvsrep/rtems/src/c/src/lib/libc/privateenv.c,v -retrieving revision 1.1.1.2 -diff -c -r1.1.1.2 privateenv.c -*** privateenv.c 7 Mar 2002 01:53:51 -0000 1.1.1.2 ---- privateenv.c 27 Oct 2002 18:35:34 -0000 -*************** -*** 23,47 **** - #include <rtems/libio.h> - #include <rtems/libio_.h> - - rtems_status_code rtems_libio_set_private_env(void) { -! rtems_status_code sc; -! rtems_id task_id; - - sc=rtems_task_ident(RTEMS_SELF,0,&task_id); - if (sc != RTEMS_SUCCESSFUL) return sc; - - /* Only for the first time a malloc is necesary */ -! if (rtems_current_user_env==&rtems_global_user_env) { -! sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free); -! if (sc != RTEMS_SUCCESSFUL) return sc; -! rtems_current_user_env = malloc(sizeof(rtems_user_env_t)); -! if (!rtems_current_user_env) - return RTEMS_NO_MEMORY; - }; - -- /* the side effect desired . chroot("/") */ - *rtems_current_user_env = rtems_global_user_env; /* get the global values*/ - rtems_current_user_env->task_id=task_id; /* mark the local values*/ - - return RTEMS_SUCCESSFUL; - } ---- 23,92 ---- - #include <rtems/libio.h> - #include <rtems/libio_.h> - -+ extern Chain_Control rtems_filesystem_mount_table_control; -+ -+ #define THE_ROOT_FS_LOC \ -+ (((rtems_filesystem_mount_table_entry_t*)\ -+ rtems_filesystem_mount_table_control.first)->mt_fs_root) -+ -+ /* cleanup a user environment -+ * NOTE: this must be called with -+ * thread dispatching disabled! -+ */ -+ static void -+ free_user_env(rtems_user_env_t *env) -+ { -+ if (env != &rtems_global_user_env -+ && --env->refcnt <= 0) { -+ rtems_filesystem_freenode( &env->current_directory); -+ rtems_filesystem_freenode( &env->root_directory); -+ free(env); -+ } -+ } -+ - rtems_status_code rtems_libio_set_private_env(void) { -! rtems_status_code sc; -! rtems_id task_id; -! rtems_filesystem_location_info_t loc; - - sc=rtems_task_ident(RTEMS_SELF,0,&task_id); - if (sc != RTEMS_SUCCESSFUL) return sc; - - /* Only for the first time a malloc is necesary */ -! if (rtems_current_user_env==&rtems_global_user_env) { -! rtems_user_env_t *tmp = malloc(sizeof(rtems_user_env_t)); -! if (!tmp) - return RTEMS_NO_MEMORY; -+ -+ tmp->refcnt = 1; -+ -+ sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free_user_env); -+ if (sc != RTEMS_SUCCESSFUL) { -+ /* don't use free_user_env because the pathlocs are -+ * not initialized yet -+ */ -+ free(tmp); -+ return sc; -+ } -+ rtems_current_user_env = tmp; - }; - - *rtems_current_user_env = rtems_global_user_env; /* get the global values*/ - rtems_current_user_env->task_id=task_id; /* mark the local values*/ -+ -+ /* get a clean root */ -+ rtems_filesystem_root = THE_ROOT_FS_LOC; -+ -+ /* Clone the pathlocs. In contrast to most other -+ * code we must _not_ free the original locs because -+ * what we are trying to do here is forking off -+ * clones. -+ */ -+ -+ rtems_filesystem_evaluate_path("/", 0, &loc, 0); -+ rtems_filesystem_root = loc; -+ rtems_filesystem_evaluate_path("/", 0, &loc, 0); -+ rtems_filesystem_current = loc; - - return RTEMS_SUCCESSFUL; - } -*************** -*** 51,56 **** ---- 96,115 ---- - * Task_id (remote) and RTEMS_SELF(current). - */ - -+ /* NOTE: -+ * -+ * THIS CODE HAS NO PROTECTION IMPLEMENTED -+ * -+ * Tasks who wish to share their environments must -+ * -+ * a) assert that no participants are concurrently -+ * executing -+ * libio_share_private_env() and/or libio_set_private_env() -+ * -+ * b) mutex access to rtems_filesystem_current, rtems_filesytem_root -+ * while changing any of those (chdir(), chroot()). -+ */ -+ - rtems_status_code rtems_libio_share_private_env(rtems_id task_id) { - rtems_status_code sc; - rtems_user_env_t * shared_user_env; -*************** -*** 61,81 **** - - if (rtems_current_user_env->task_id==current_task_id) { - /* kill the current user env & task_var*/ -! free(rtems_current_user_env); - sc = rtems_task_variable_delete(RTEMS_SELF,(void*)&rtems_current_user_env); - if (sc != RTEMS_SUCCESSFUL) return sc; - }; - - sc = rtems_task_variable_get(task_id,(void*)&rtems_current_user_env, - (void*)&shared_user_env ); -! if (sc != RTEMS_SUCCESSFUL) return sc; - -! /* don't free(NULL'ed) at the task_delete. It is a shared var... */ -! sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,NULL); -! if (sc != RTEMS_SUCCESSFUL) return sc; - - /* the current_user_env is the same pointer that remote env */ - rtems_current_user_env = shared_user_env; - - return RTEMS_SUCCESSFUL; - } ---- 120,152 ---- - - if (rtems_current_user_env->task_id==current_task_id) { - /* kill the current user env & task_var*/ -! rtems_user_env_t *tmp = rtems_current_user_env; - sc = rtems_task_variable_delete(RTEMS_SELF,(void*)&rtems_current_user_env); - if (sc != RTEMS_SUCCESSFUL) return sc; -+ free_user_env(tmp); - }; - -+ /* AT THIS POINT, rtems_current_user_env is DANGLING */ -+ - sc = rtems_task_variable_get(task_id,(void*)&rtems_current_user_env, - (void*)&shared_user_env ); -! if (sc != RTEMS_SUCCESSFUL) -! goto bailout; - -! sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free_user_env); -! if (sc != RTEMS_SUCCESSFUL) -! goto bailout; - - /* the current_user_env is the same pointer that remote env */ - rtems_current_user_env = shared_user_env; - -+ /* increase the reference count */ -+ rtems_current_user_env->refcnt++; -+ - return RTEMS_SUCCESSFUL; -+ -+ bailout: -+ /* fallback to the global env */ -+ rtems_current_user_env = &rtems_global_user_env; -+ return sc; - } |