[Labs-l] [tools] New version of take

Petr Bena benapetr at gmail.com
Sun Jun 23 07:04:57 UTC 2013


Purpose of the struct is that if I forgot to close some FD it would
get automagically closed once the object is destroyed (it's created on
stack, so once it get removed from stack it get auto-closed)

your change is correct, I should have make sure that closing it
multiple times doesn't cause troubles, however I don't see where I am
closing it three times?

On Sun, Jun 23, 2013 at 12:25 AM, Platonides <platonides at gmail.com> wrote:
> On 22/06/13 20:24, Petr Bena wrote:
>>
>> resolved.
>
>
> No, you're still vulnerable (1609de5f).
> Moreover, your are changing a file different than the one you checked.
>
> I also noticed that you are closing each descriptor thrice.
>
> One instance is trivially fixed by:
>>
>> diff --git a/include/Take.h b/include/Take.h
>> index dd063f3..4fa2a41 100644
>> --- a/include/Take.h
>> +++ b/include/Take.h
>> @@ -20,7 +20,7 @@ class Take
>>          int fd;
>>          FD(int f): fd(f)                { };
>>          ~FD()                           { Close(); };
>> -        void Close()                    { if(fd >= 0) close(fd); };
>> +        void Close()                    { if(fd >= 0) close(fd); fd = -1;
>> };
>>          operator int (void) const       { return fd; };
>>      };
>
>
>
> The other close was hidden in copied objects (why did you need an object?
> This would have been much easier simply passing the fds!)
>
>> diff --git a/include/Take.h b/include/Take.h
>> index dd063f3..ac8a417 100644
>> --- a/include/Take.h
>> +++ b/include/Take.h
>> @@ -29,10 +29,10 @@ class Take
>>          virtual ~Take();
>>      protected:
>>      private:
>> -        bool Overtake(string path, FD fd);
>> +        bool Overtake(string path, FD& fd);
>>          bool Verify(string path);
>>          static int Callback(const char* path, const struct stat *sb, int
>> typeflag, struct FTW *ftwbuf);
>> -        static void ChangeOwner(string path, uid_t owner, FD fd, bool
>> ChangeGroup);
>> +        static void ChangeOwner(string path, uid_t owner, FD& fd, bool
>> ChangeGroup);
>>          static bool CheckGroups(struct stat info);
>>          static bool CheckHL(string path);
>>          static bool CheckHL(struct stat info);
>> diff --git a/src/Take.cpp b/src/Take.cpp
>> index 8a111d6..accfc02 100644
>> --- a/src/Take.cpp
>> +++ b/src/Take.cpp
>> @@ -126,7 +126,7 @@ int Take::Callback(const char* path, const struct stat
>> *sb, int typeflag, struct
>>      return 0;
>>  }
>>
>> -void Take::ChangeOwner(string path, uid_t owner, Take::FD fd, bool
>> ChangeGroup)
>> +void Take::ChangeOwner(string path, uid_t owner, Take::FD& fd, bool
>> ChangeGroup)
>>  {
>>      if (!ChangeGroup)
>>      {
>> @@ -215,7 +215,7 @@ bool Take::CheckHL(string path)
>>      return false;
>>  }
>>
>> -bool Take::Overtake(string path, Take::FD fd)
>> +bool Take::Overtake(string path, Take::FD& fd)
>>  {
>>      char * p = realpath(path.c_str(), NULL);
>>
>
>
> _______________________________________________
> Labs-l mailing list
> Labs-l at lists.wikimedia.org
> https://lists.wikimedia.org/mailman/listinfo/labs-l



More information about the Labs-l mailing list