Nmap Security Scanner
*Intro
*Ref Guide
*Install Guide
*Download
*Changelog
*Book
*Docs
Security Lists
*Nmap Hackers
*Nmap Dev
*Bugtraq
*Full Disclosure
*Pen Test
*Basics
*More
Security Tools
*Pass crackers
*Sniffers
*Vuln Scanners
*Web scanners
*Wireless
*Exploitation
*Packet crafters
*More
Site News
Site Search:
Exploit World
Advertising
About/Contact
Credits
Sponsors:
edgeos



Full Disclosure: Re: Re: readdir_r considered harmful

Re: Re: readdir_r considered harmful

From: Andrew Farmer <andfarm_at_gmail.com>
Date: Sun, 6 Nov 2005 17:00:48 -0800

On 06 Nov 05, at 01:00, Casper.Dik_at_Sun.COM wrote:
>> Then you never really understood the implementation, seems. Of
>> course
>> all implementations keep the content of the directory as read with
>> getdents or so in the DIR descriptor. But it is usually not the case
>> that the whole content fits into the buffer allocated. One could, of
>> course, resize the buffer to fit the content of the directory read,
>> even if this means reserving hundreds or thousands of kBs. But this
>> is not how most implementations work.
>>
>
> I don't see how that is relevant; the typical use of readdir() is
> as follows:
>
> DIR *dirp = opendir(name);
>
> while ((dent = readdir(dirp)) != NULL) {
> ...
> }
>
> closedir(dirp);
>
> Nothing other threads do with readdir() on different dirp's will
> influence
> what "dent" points to.
>
> I have *never* seen a program where multiple threads read from a
> single
> dirp; and I can't image the use.
>

In practice, you're correct. In theory, however, consider the
following code
path.

> THREAD 1 THREAD 2
> ------------------------------ ------------------------------
> DIR *d1 = opendir(dir1);
> DIR *d2 = opendir(dir2);
> dent1 = readdir(dir1);
> dent2 = readdir(dir2);
> use(dent1);
>

In most implementations, dent1 != dent2. HOWEVER, there is no
guarantee that
they will not both point to the same statically allocated buffer, and
some
implementations may do so. For example, this is why ctime_r exists:
ctime
returns a pointer to a statically allocated buffer, and hence is not
thread
safe.

You are correct, though, that the glibc implementation of readdir is
thread-safe, so readdir_r is unnecessary in all common situations.

_______________________________________________
Full-Disclosure - We believe in it.
Charter: http://lists.grok.org.uk/full-disclosure-charter.html
Hosted and sponsored by Secunia - http://secunia.com/

Received on Nov 07 2005
[ Nmap | Sec Tools | Mailing Lists | Site News | About/Contact | Advertising | Privacy ]