mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-09-12 21:28:25 -04:00
Apply ACLs and xattrs through a held file descriptor instead of by path, closing the symlink-race where an attacker swaps the leaf between the transfer and the metadata set. lib/acl.c provides fd/at POSIX-ACL primitives (the system libacl *_at where available, else a /proc/self/fd compat that never follows on the fallback); acls.c routes through them and stays functional (path-based) where the OS lacks a race-safe primitive; xattrs.c routes copy_xattrs through a held fd; -VV (usage.c) reports the runtime race-safe-ACL capability.
30 lines
925 B
C
30 lines
925 B
C
#ifdef SUPPORT_XATTRS
|
|
|
|
#if defined HAVE_SYS_XATTR_H
|
|
#include <sys/xattr.h>
|
|
#elif defined HAVE_ATTR_XATTR_H
|
|
#include <attr/xattr.h>
|
|
#elif defined HAVE_SYS_EXTATTR_H
|
|
#include <sys/extattr.h>
|
|
#endif
|
|
|
|
/* Linux 2.4 does not define this as a distinct errno value: */
|
|
#ifndef ENOATTR
|
|
#define ENOATTR ENODATA
|
|
#endif
|
|
|
|
ssize_t sys_lgetxattr(const char *path, const char *name, void *value, size_t size);
|
|
ssize_t sys_fgetxattr(int filedes, const char *name, void *value, size_t size);
|
|
int sys_lsetxattr(const char *path, const char *name, const void *value, size_t size);
|
|
int sys_fsetxattr(int filedes, const char *name, const void *value, size_t size);
|
|
int sys_lremovexattr(const char *path, const char *name);
|
|
int sys_fremovexattr(int filedes, const char *name);
|
|
ssize_t sys_llistxattr(const char *path, char *list, size_t size);
|
|
ssize_t sys_flistxattr(int filedes, char *list, size_t size);
|
|
|
|
#else
|
|
|
|
/* No xattrs available */
|
|
|
|
#endif
|