Re: [PATCH] libsemanage: fsync before rename

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

 



On Wed, May 13, 2020 at 8:46 PM Smalley <stephen.smalley.work@xxxxxxxxx> wrote:
>
> From: Stephen Smalley <stephen.smalley.work@xxxxxxxxx>
>
> Prior to rename(2)'ing new files into place, fsync(2) them to ensure
> the contents will be fully written prior to rename.  While we are here,
> also fix checking of write(2) to detect short writes.  This code could
> be more generally improved but keeping to the minimal changes required
> to fix this bug.
>
> Fixes: https://github.com/SELinuxProject/selinux/issues/237
> Signed-off-by: Stephen Smalley <stephen.smalley.work@xxxxxxxxx>
> ---
>  libsemanage/src/semanage_store.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/libsemanage/src/semanage_store.c b/libsemanage/src/semanage_store.c
> index 859c0a22..3cac36d4 100644
> --- a/libsemanage/src/semanage_store.c
> +++ b/libsemanage/src/semanage_store.c
> @@ -735,7 +735,7 @@ int semanage_copy_file(const char *src, const char *dst, mode_t mode)
>         }
>         umask(mask);
>         while (retval == 0 && (amount_read = read(in, buf, sizeof(buf))) > 0) {
> -               if (write(out, buf, amount_read) < 0) {
> +               if (write(out, buf, amount_read) != amount_read) {
>                         errsv = errno;
>                         retval = -1;
>                 }

If I remember correctly, errno is not defined if a short write
happens. If this is confirmed and if you want to keep the patch short,
you could for example use errsv = EIO if write() returned a value
different from -1 and from amount_read.

Thanks,
Nicolas

> @@ -745,6 +745,10 @@ int semanage_copy_file(const char *src, const char *dst, mode_t mode)
>                 retval = -1;
>         }
>         close(in);
> +       if (fsync(out) < 0) {
> +               errsv = errno;
> +               retval = -1;
> +       }
>         if (close(out) < 0) {
>                 errsv = errno;
>                 retval = -1;
> --
> 2.23.3
>




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

  Powered by Linux