copy_tree: do not block on fifos
Fixes regression introduced in faeab50e71
.
If a directory contains fifos, then openat blocks until the other side
of the fifo is connected as well.
This means that users can prevent "usermod -m" from completing if their
home directories contain at least one fifo.
This commit is contained in:
committed by
Iker Pedrosa
parent
f3bdb28e57
commit
10cd68e0f0
@@ -126,12 +126,12 @@ static int perm_copy_path(const struct path_info *src,
|
|||||||
{
|
{
|
||||||
int src_fd, dst_fd, ret;
|
int src_fd, dst_fd, ret;
|
||||||
|
|
||||||
src_fd = openat(src->dirfd, src->name, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
|
src_fd = openat(src->dirfd, src->name, O_RDONLY | O_NOFOLLOW | O_NONBLOCK | O_CLOEXEC);
|
||||||
if (src_fd < 0) {
|
if (src_fd < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dst_fd = openat(dst->dirfd, dst->name, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
|
dst_fd = openat(dst->dirfd, dst->name, O_RDONLY | O_NOFOLLOW | O_NONBLOCK | O_CLOEXEC);
|
||||||
if (dst_fd < 0) {
|
if (dst_fd < 0) {
|
||||||
(void) close (src_fd);
|
(void) close (src_fd);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -152,12 +152,12 @@ static int attr_copy_path(const struct path_info *src,
|
|||||||
{
|
{
|
||||||
int src_fd, dst_fd, ret;
|
int src_fd, dst_fd, ret;
|
||||||
|
|
||||||
src_fd = openat(src->dirfd, src->name, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
|
src_fd = openat(src->dirfd, src->name, O_RDONLY | O_NOFOLLOW | O_NONBLOCK | O_CLOEXEC);
|
||||||
if (src_fd < 0) {
|
if (src_fd < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dst_fd = openat(dst->dirfd, dst->name, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
|
dst_fd = openat(dst->dirfd, dst->name, O_RDONLY | O_NOFOLLOW | O_NONBLOCK | O_CLOEXEC);
|
||||||
if (dst_fd < 0) {
|
if (dst_fd < 0) {
|
||||||
(void) close (src_fd);
|
(void) close (src_fd);
|
||||||
return -1;
|
return -1;
|
||||||
|
Reference in New Issue
Block a user