mirror of
https://github.com/systemd/systemd
synced 2024-09-06 16:56:43 +00:00
shared/copy: rewind dir fd before using it for cleanup
This seems to be the only place where rm_rf_children() is called with a possibly used fd, which is then passed through to rm_rf_children_impl(). This also fixes #29606. (Tested on Fedora rawhide with kernel 6.5.6-300.fc39.x86_64.)
This commit is contained in:
parent
59ccbad65e
commit
e3b84b105e
|
@ -638,6 +638,10 @@ static void hardlink_context_destroy(HardlinkContext *c) {
|
|||
* _cleanup_() so that we really delete this, even on failure. */
|
||||
|
||||
if (c->dir_fd >= 0) {
|
||||
/* <dir_fd> might be have already been used for reading, so we need to rewind it. */
|
||||
if (lseek(c->dir_fd, 0, SEEK_SET) < 0)
|
||||
log_debug_errno(errno, "Failed to lseek on file descriptor, ignoring: %m");
|
||||
|
||||
r = rm_rf_children(TAKE_FD(c->dir_fd), REMOVE_PHYSICAL, NULL); /* consumes dir_fd in all cases, even on failure */
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to remove hardlink store (%s) contents, ignoring: %m", c->subdir);
|
||||
|
|
|
@ -25,6 +25,8 @@ int fstatat_harder(int dfd,
|
|||
int fstatat_flags,
|
||||
RemoveFlags remove_flags);
|
||||
|
||||
/* Note: directory file descriptors passed to the functions below must be
|
||||
* positioned at the beginning. If the fd was already used for reading, rewind it. */
|
||||
int rm_rf_children(int fd, RemoveFlags flags, const struct stat *root_dev);
|
||||
int rm_rf_child(int fd, const char *name, RemoveFlags flags);
|
||||
int rm_rf_at(int dir_fd, const char *path, RemoveFlags flags);
|
||||
|
|
Loading…
Reference in a new issue