[PATCH 3/7] server: Fail to set delete disposition on a non-empty directory.
Alexandre Julliard
julliard at winehq.org
Thu Nov 8 09:17:12 CST 2018
Dmitry Timoshkov <dmitry at baikal.ru> writes:
> Alexandre Julliard <julliard at winehq.org> wrote:
>
>> >> >> > +static int is_directory_empty( struct fd *fd )
>> >> >> > +{
>> >> >> > + DIR *dir;
>> >> >> > + int count = 0;
>> >> >> > +
>> >> >> > + if ((dir = fdopendir( fd->unix_fd )))
>> >> >> > + {
>> >> >> > + while (readdir( dir ) != NULL && count <= 2)
>> >> >> > + count++;
>> >> >> > +
>> >> >> > + closedir( dir );
>> >> >> > + }
>> >> >>
>> >> >> This won't work, closedir() is going to close the file descriptor.
>> >> >
>> >> > Would it be acceptable to duplicate the fd before the check?
>> >>
>> >> That's what you'd have to do, yes. But honestly I'm not sure that this
>> >> check is a good idea in the first place. I wonder if we shouldn't remove
>> >> the directory right away instead.
>> >
>> > Setting a disposition is not supposed to remove a directory or a file, just
>> > mark it for the removal until the last handle to it gets closed, or do you
>> > mean something else?
>>
>> I know it's not supposed to, but I'm not sure it's a good enough reason
>> to add this check and make RemoveDirectory less reliable. Do you have an
>> app that depends on the directory still existing?
>
> It's the task scheduler service that suffers from this.
Where does it depend on the directory still existing?
--
Alexandre Julliard
julliard at winehq.org
More information about the wine-devel
mailing list