Re: [PATCH v3] libsemanage: sync filesystem with sandbox

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Jan 31, 2021 at 12:53 PM Petr Lautrbach <plautrba@xxxxxxxxxx> wrote:
>
> Commit 331a109f91ea ("libsemanage: fsync final files before rename")
> added fsync() for policy files and improved situation when something
> unexpected happens right after rename(). However the module store could
> be affected as well. After the following steps module files could be 0
> size:
>
> 1. Run `semanage fcontext -a -t var_t "/tmp/abc"`
> 2. Force shutdown the server during the command is run, or right after
>    it's finished
> 3. Boot the system and look for empty files:
>     # find /var/lib/selinux/targeted/ -type f -size 0 | wc -l
>     1266
>
> It looks like this situation can be avoided if the filesystem with the
> sandbox is sync()ed before we start to rename() directories in the
> store.
>
> Signed-off-by: Petr Lautrbach <plautrba@xxxxxxxxxx>

Acked-by: Nicolas Iooss <nicolas.iooss@xxxxxxx>

Thanks!
Nicolas

> ---
>
> - syncfs() moved before rename() dance
>
>  libsemanage/src/semanage_store.c | 13 +++++++++++++
>  1 file changed, 13 insertions(+)
>
> diff --git a/libsemanage/src/semanage_store.c b/libsemanage/src/semanage_store.c
> index cd5e46bb2401..c6a736fe2d26 100644
> --- a/libsemanage/src/semanage_store.c
> +++ b/libsemanage/src/semanage_store.c
> @@ -1736,6 +1736,19 @@ static int semanage_commit_sandbox(semanage_handle_t * sh)
>         }
>         close(fd);
>
> +       /* sync changes in sandbox to filesystem */
> +       fd = open(sandbox, O_DIRECTORY);
> +       if (fd == -1) {
> +               ERR(sh, "Error while opening %s for syncfs(): %d", sandbox, errno);
> +               return -1;
> +       }
> +       if (syncfs(fd) == -1) {
> +               ERR(sh, "Error while syncing %s to filesystem: %d", sandbox, errno);
> +               close(fd);
> +               return -1;
> +       }
> +       close(fd);
> +
>         retval = commit_number;
>
>         if (semanage_get_active_lock(sh) < 0) {
> --
> 2.30.0
>




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux