[llvm-objcopy] Don't change permissions of non-regular output files

Authored by MaskRay on Jul 11 2019, 3:17 AM.


[llvm-objcopy] Don't change permissions of non-regular output files

There is currently an EPERM error when a regular user executes llvm-objcopy a.o /dev/null.
Worse, root can even change the mode bits of /dev/null.

Fix it by checking if the output file is special.

A new overload of llvm::sys::fs::setPermissions with FD as the parameter
is added. Users should provide perm & ~umask as the parameter if they
intend to respect umask.

The existing overload of llvm::sys::fs::setPermissions may be deleted if
we can find an implementation of fchmod() on Windows. fchmod() is
usually better than chmod() because it saves syscalls and can avoid race

Reviewed By: jakehehrlich, jhenderson

Differential Revision: https://reviews.llvm.org/D64236

llvm-svn: 365753