diff options
author | Miles Bader <miles@gnu.org> | 1996-06-26 17:44:44 +0000 |
---|---|---|
committer | Miles Bader <miles@gnu.org> | 1996-06-26 17:44:44 +0000 |
commit | aeb0816f97b5f6cd6d1ca1a1e5dc461c1bcc3403 (patch) | |
tree | d940da846aae33fd4683d091e0c337f64edd98d9 | |
parent | bba7bb78f3bc3be2dacafc336d1342fcc5c57489 (diff) | |
download | glibc-aeb0816f97b5f6cd6d1ca1a1e5dc461c1bcc3403.tar.gz glibc-aeb0816f97b5f6cd6d1ca1a1e5dc461c1bcc3403.tar.xz glibc-aeb0816f97b5f6cd6d1ca1a1e5dc461c1bcc3403.zip |
(_hurd_canonicalize_directory_name_internal): Don't deallocate DOTID & DOTDEVID until we're finished with them (we need to keep them at least until we've fetched the next level of id ports, so that mach will be able to use the same name if they're the same). Add inner_errlose: label, which deallocates DOTID & DOTDEVID and jumps to errlose, for those places where such cleanup is needed.
-rw-r--r-- | sysdeps/mach/hurd/getcwd.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/sysdeps/mach/hurd/getcwd.c b/sysdeps/mach/hurd/getcwd.c index a167730a0a..daa67fb858 100644 --- a/sysdeps/mach/hurd/getcwd.c +++ b/sysdeps/mach/hurd/getcwd.c @@ -131,8 +131,6 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir, /* Get this directory's identity and figure out if it's a mount point. */ if (err = __io_identity (parent, &dotid, &dotdevid, &dotino)) goto errlose; - __mach_port_deallocate (__mach_task_self (), dotid); - __mach_port_deallocate (__mach_task_self (), dotdevid); mount_point = dotdevid != thisdevid; /* Search for the last directory. */ @@ -186,7 +184,7 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir, err = __io_identity (try, &id, &devid, &fileno); __mach_port_deallocate (__mach_task_self (), try); if (err) - goto errlose; + goto inner_errlose; __mach_port_deallocate (__mach_task_self (), id); __mach_port_deallocate (__mach_task_self (), devid); if (id == thisid) @@ -196,14 +194,19 @@ _hurd_canonicalize_directory_name_internal (file_t thisdir, } if (err) - goto errlose; + { + inner_errlose: /* Goto ERRLOSE: after cleaning up. */ + __mach_port_deallocate (__mach_task_self (), dotid); + __mach_port_deallocate (__mach_task_self (), dotdevid); + goto errlose; + } else if (nentries == 0) { /* We got to the end of the directory without finding anything! We are in a directory that has been unlinked, or something is broken. */ err = ENOENT; - goto errlose; + goto inner_errlose; } else found: |