Re: [PATCH] semodule: avoid toctou on output module

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

 



On Fri, May 20, 2022 at 3:20 PM Christian Göttsche
<cgzones@xxxxxxxxxxxxxx> wrote:
>
> Do not check for file existence and open afterwards, open with the
> exclusive flag (supported in Glibc and musl 0.9.6 and also standardized
> in C11).
>
> Found by GitHub CodeQL.
>
> Signed-off-by: Christian Göttsche <cgzones@xxxxxxxxxxxxxx>

This looks good to me.

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

Thanks!

> ---
>  policycoreutils/semodule/semodule.c | 13 +++++--------
>  1 file changed, 5 insertions(+), 8 deletions(-)
>
> diff --git a/policycoreutils/semodule/semodule.c b/policycoreutils/semodule/semodule.c
> index 1ed8e690..48bc28dd 100644
> --- a/policycoreutils/semodule/semodule.c
> +++ b/policycoreutils/semodule/semodule.c
> @@ -550,15 +550,12 @@ int main(int argc, char *argv[])
>                                         goto cleanup_extract;
>                                 }
>
> -                               if (access(output_path, F_OK) == 0) {
> -                                       fprintf(stderr, "%s: %s is already extracted with extension %s.\n", argv[0], mode_arg, lang_ext);
> -                                       result = -1;
> -                                       goto cleanup_extract;
> -                               }
> -
> -                               output_fd = fopen(output_path, "w");
> +                               output_fd = fopen(output_path, "wx");
>                                 if (output_fd == NULL) {
> -                                       fprintf(stderr, "%s: Unable to open %s\n", argv[0], output_path);
> +                                       if (errno == EEXIST)
> +                                               fprintf(stderr, "%s: %s is already extracted with extension %s.\n", argv[0], mode_arg, lang_ext);
> +                                       else
> +                                               fprintf(stderr, "%s: Unable to open %s:  %s\n", argv[0], output_path, strerror(errno));
>                                         result = -1;
>                                         goto cleanup_extract;
>                                 }
> --
> 2.36.1
>




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

  Powered by Linux