diff options
author | Jeremie Courreges-Anglas <jca@cvs.openbsd.org> | 2015-11-15 14:05:26 +0000 |
---|---|---|
committer | Jeremie Courreges-Anglas <jca@cvs.openbsd.org> | 2015-11-15 14:05:26 +0000 |
commit | ad05d4ea4426988ba9304d73f62cd5c9e964b37a (patch) | |
tree | cd5f7fc775dc45830f40e1cddffe1722e48885ea /gnu/usr.bin | |
parent | 3419b06e9104cd7cb1dc937db0e007d67df814b3 (diff) |
Same as in binutils-2.17, only restore regular permission bits.
But don't restore ownership/setuid/etc bits. ok deraadt@
Diffstat (limited to 'gnu/usr.bin')
-rw-r--r-- | gnu/usr.bin/binutils/binutils/rename.c | 55 |
1 files changed, 20 insertions, 35 deletions
diff --git a/gnu/usr.bin/binutils/binutils/rename.c b/gnu/usr.bin/binutils/binutils/rename.c index 78ea9fd6b20..cebeba81848 100644 --- a/gnu/usr.bin/binutils/binutils/rename.c +++ b/gnu/usr.bin/binutils/binutils/rename.c @@ -1,5 +1,5 @@ /* rename.c -- rename a file, preserving symlinks. - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright 1999, 2002, 2003 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -37,7 +37,7 @@ #define O_BINARY 0 #endif -static int simple_copy PARAMS ((const char *, const char *)); +static int simple_copy (const char *, const char *); /* The number of bytes to copy at once. */ #define COPY_BUF 8192 @@ -46,9 +46,7 @@ static int simple_copy PARAMS ((const char *, const char *)); Return 0 if ok, -1 if error. */ static int -simple_copy (from, to) - const char *from; - const char *to; +simple_copy (const char *from, const char *to) { int fromfd, tofd, nread; int saved; @@ -95,9 +93,7 @@ simple_copy (from, to) STATBUF. */ void -set_times (destination, statbuf) - const char *destination; - const struct stat *statbuf; +set_times (const char *destination, const struct stat *statbuf) { int result; @@ -144,12 +140,9 @@ set_times (destination, statbuf) Return 0 if ok, -1 if error. */ int -smart_rename (from, to, preserve_dates) - const char *from; - const char *to; - int preserve_dates; +smart_rename (const char *from, const char *to, int preserve_dates) { - boolean exists; + bfd_boolean exists; struct stat s; int ret = 0; @@ -165,42 +158,34 @@ smart_rename (from, to, preserve_dates) ret = rename (from, to); if (ret != 0) { - /* We have to clean up here. */ - - non_fatal (_("%s: rename: %s"), to, strerror (errno)); + /* We have to clean up here. */ + non_fatal (_("unable to rename '%s' reason: %s"), to, strerror (errno)); unlink (from); } #else /* Use rename only if TO is not a symbolic link and has - only one hard link. */ - if (! exists || (!S_ISLNK (s.st_mode) && s.st_nlink == 1)) + only one hard link, and we have permission to write to it. */ + if (! exists + || (!S_ISLNK (s.st_mode) + && S_ISREG (s.st_mode) + && (s.st_mode & S_IWUSR) + && s.st_nlink == 1) + ) { ret = rename (from, to); if (ret == 0) { if (exists) { - /* Try to preserve the permission bits and ownership of - TO. First get the mode right except for the setuid - bit. Then change the ownership. Then fix the setuid - bit. We do the chmod before the chown because if the - chown succeeds, and we are a normal user, we won't be - able to do the chmod afterward. We don't bother to - fix the setuid bit first because that might introduce - a fleeting security problem, and because the chown - will clear the setuid bit anyhow. We only fix the - setuid bit if the chown succeeds, because we don't - want to introduce an unexpected setuid file owned by - the user running objcopy. */ + /* Try to preserve the permission bits of TO. Don't + * restore special bits. */ chmod (to, s.st_mode & 0777); - if (chown (to, s.st_uid, s.st_gid) >= 0) - chmod (to, s.st_mode & 07777); } } else { - /* We have to clean up here. */ - non_fatal (_("%s: rename: %s"), to, strerror (errno)); + /* We have to clean up here. */ + non_fatal (_("unable to rename '%s' reason: %s"), to, strerror (errno)); unlink (from); } } @@ -208,7 +193,7 @@ smart_rename (from, to, preserve_dates) { ret = simple_copy (from, to); if (ret != 0) - non_fatal (_("%s: simple_copy: %s"), to, strerror (errno)); + non_fatal (_("unable to copy file '%s' reason: %s"), to, strerror (errno)); if (preserve_dates) set_times (to, &s); |