Submit #2988 ยป submit_2988.diff
| bin/cpdup/cpdup.c | ||
|---|---|---|
|
static int
|
||
|
FlagsMatch(struct stat *st1, struct stat *st2)
|
||
|
{
|
||
|
if (DstRootPrivs)
|
||
|
return (st1->st_flags == st2->st_flags);
|
||
|
else
|
||
|
/* Only consider the user-settable flags. */
|
||
|
return (((st1->st_flags ^ st2->st_flags) & UF_SETTABLE) == 0);
|
||
|
/*
|
||
|
* Ignore UF_ARCHIVE. It gets set automatically by the filesystem, for
|
||
|
* filesystems that support it. If the destination filesystem supports it, but
|
||
|
* it's cleared on the source file, then multiple invocations of cpdup would
|
||
|
* all try to copy the file because the flags wouldn't match.
|
||
|
*
|
||
|
* When unpriveleged, ignore flags we can't set
|
||
|
*/
|
||
|
u_long ignored = DstRootPrivs ? 0 : SF_SETTABLE;
|
||
|
#ifdef UF_ARCHIVE
|
||
|
ignored |= UF_ARCHIVE;
|
||
|
#endif
|
||
|
return (((st1->st_flags ^ st2->st_flags) & ~ignored) == 0);
|
||
|
}
|
||
|
#endif
|
||