mirror of
https://github.com/troglobit/libite.git
synced 2026-11-14 19:03:05 +00:00
Fix copyfile() not preserving source mode with restrictive umask
copyfile() passes the source mode to open(2), which applies the umask, so a 0644 file copied with umask 0027 ends up 0640. Apply the source mode with fchmod() after creating the destination. Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
3 files changed
+34
-1
No files matched your search
+24
-1
@@ -123,9 +123,32 @@ static int _copyfile()
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* copyfile() must preserve source mode, even with a restrictive umask */
|
||||
static int _mode(void)
|
||||
{
|
||||
const char *src = "/tmp/libite-mode-src", *dst = "/tmp/libite-mode-dst";
|
||||
struct stat st;
|
||||
mode_t old;
|
||||
int rc = 1;
|
||||
|
||||
if (touch(src) || chmod(src, 0644))
|
||||
return test(1, "copyfile() mode, prepare %s", src);
|
||||
|
||||
old = umask(0077);
|
||||
if (copyfile(src, dst, 0, 0) >= 0 && !stat(dst, &st))
|
||||
rc = (st.st_mode & 07777) != 0644;
|
||||
umask(old);
|
||||
|
||||
erase(src);
|
||||
erase(dst);
|
||||
|
||||
return test(rc, "copyfile() preserves mode 0644 with umask 0077");
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return _fcopyfile() ||
|
||||
_copyfile() ||
|
||||
_sz();
|
||||
_sz() ||
|
||||
_mode();
|
||||
}
|
||||
Reference in new issue
Block a user