mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
014cc7f849
smart_rename is capable of handling symlinks by copying and it also tries to preserve ownership and permissions of files when they're overwritten during the rename. This is useful in objcopy where the file properties need to be preserved. However because smart_rename does this using file names, it leaves a race window between renames and permission fixes. This change removes this race window by using file descriptors from the original BFDs that were used to manipulate these files wherever possible. The file that is to be renamed is also passed as a file descriptor so that we use fchown/fchmod on the file descriptor, thus making sure that we only modify the file we have opened to write. Further, in case the file is to be overwritten (as is the case in ar or objcopy), the permissions that need to be restored are taken from the file descriptor that was opened for input so that integrity of the file status is maintained all the way through to the rename. binutils/ * rename.c * ar.c (write_archive) [!defined (_WIN32) || defined (__CYGWIN32__)]: Initialize TARGET_STAT and OFD to pass to SMART_RENAME. * arsup.c (ar_save) [defined (_WIN32) || defined (__CYGWIN32__)]: Likewise. * bucomm.h (smart_rename): Add new arguments to declaration. * objcopy.c (strip_main)[defined (_WIN32) || defined (__CYGWIN32__)]: Initialize COPYFD and pass to SMART_RENAME. (copy_main) [defined (_WIN32) || defined (__CYGWIN32__)]: Likewise. * rename.c (try_preserve_permissions): New function. (smart_rename): Use it and add new arguments.
83 lines
2.3 KiB
C
83 lines
2.3 KiB
C
/* bucomm.h -- binutils common include file.
|
||
Copyright (C) 1991-2020 Free Software Foundation, Inc.
|
||
|
||
This file is part of GNU Binutils.
|
||
|
||
This program is free software; you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation; either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program; if not, write to the Free Software
|
||
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||
MA 02110-1301, USA. */
|
||
|
||
#ifndef _BUCOMM_H
|
||
#define _BUCOMM_H
|
||
|
||
/* In bucomm.c. */
|
||
|
||
/* Return the filename in a static buffer. */
|
||
const char *bfd_get_archive_filename (const bfd *);
|
||
|
||
void bfd_nonfatal (const char *);
|
||
|
||
void bfd_nonfatal_message (const char *, const bfd *, const asection *,
|
||
const char *, ...);
|
||
|
||
void bfd_fatal (const char *) ATTRIBUTE_NORETURN;
|
||
|
||
void report (const char *, va_list) ATTRIBUTE_PRINTF(1,0);
|
||
|
||
void fatal (const char *, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
|
||
|
||
void non_fatal (const char *, ...) ATTRIBUTE_PRINTF_1;
|
||
|
||
void set_default_bfd_target (void);
|
||
|
||
void list_matching_formats (char **);
|
||
|
||
void list_supported_targets (const char *, FILE *);
|
||
|
||
void list_supported_architectures (const char *, FILE *);
|
||
|
||
int display_info (void);
|
||
|
||
void print_arelt_descr (FILE *, bfd *, bfd_boolean, bfd_boolean);
|
||
|
||
char *make_tempname (const char *, int *);
|
||
char *make_tempdir (const char *);
|
||
|
||
bfd_vma parse_vma (const char *, const char *);
|
||
|
||
off_t get_file_size (const char *);
|
||
|
||
bfd_boolean is_valid_archive_path (char const *);
|
||
|
||
extern char *program_name;
|
||
|
||
/* In filemode.c. */
|
||
void mode_string (unsigned long, char *);
|
||
|
||
/* In version.c. */
|
||
extern void print_version (const char *);
|
||
|
||
/* In rename.c. */
|
||
extern void set_times (const char *, const struct stat *);
|
||
|
||
extern int smart_rename (const char *, const char *, int, struct stat *, int);
|
||
|
||
|
||
/* In libiberty. */
|
||
void *xmalloc (size_t);
|
||
|
||
void *xrealloc (void *, size_t);
|
||
|
||
#endif /* _BUCOMM_H */
|