[PATCH v3] server: Fail if non-empty directory marked for deletion.

Chip Davis cdavis at codeweavers.com
Thu May 28 19:26:11 CDT 2020


May 28, 2020 5:40 AM, "Daniel Lehman" <dlehman25 at gmail.com> wrote:

> diff --git a/server/fd.c b/server/fd.c
> index 06d1d81bdb..e75d489748 100644
> --- a/server/fd.c
> +++ b/server/fd.c
> @@ -2364,6 +2367,36 @@ static struct fd *get_handle_fd_obj( struct process *process, obj_handle_t handl
>      return fd;
>  }
>  
> +static int is_dir_empty( int fd )
> +{
> +#ifdef HAVE_DIRENT_H
> +    DIR *dir;
> +    int empty;
> +    struct dirent *de;
> +
> +    if ((fd = dup( fd )) == -1)
> +        return -1;
> +
> +    if (!(dir = fdopendir( fd )))
> +    {
> +        close( fd );
> +        return -1;
> +    }
> +
> +    empty = 1;
> +    while (empty && (de = readdir( dir )))
> +    {
> +        if (!strcmp( de->d_name, "." ) || !strcmp( de->d_name, ".." )) continue;
> +        empty = 0;

You could probably break from the loop after this point, since you found what you were looking for.

> +    }
> +    closedir( dir );
> +    close( fd );

This close(2) call shouldn't be necessary, since closedir(3) does that for you. It's the reason I suggested dup(2)'ing the fd in the first place. Leaving this in will set errno to EBADF, which may not be desirable.

> +    return empty;
> +#else
> +    return 1;
> +#endif
> +}
> +
>  /* set disposition for the fd */
>  static void set_fd_disposition( struct fd *fd, int unlink )
>  {


Chip



More information about the wine-devel mailing list