Reentrant problem with inet_ntoa in the kernel

Max Laier max at love2party.net
Fri Nov 3 11:21:02 UTC 2006


Hello "MQ",

your email client is seriously mis-configured, could you please look into 
this as it is a bit annoying.

On Friday 03 November 2006 10:46, MQ wrote:
> 2006/11/2, Brooks Davis <brooks at one-eyed-alien.net>:
> > On Thu, Nov 02, 2006 at 08:26:27AM +0000, . wrote:
> > > Hi,
> > >
> > > I am confused by the use of inet_ntoa function in the kernel.
> > >
> > > The function inet_ntoa in the /sys/libkern/inet_ntoa.c uses a
> > > static
> >
> > array
> >
> > > static char buf[4 * sizeof "123"];
> > > to store the result. And it returns the address of the array to the
> >
> > caller.
> >
> > > I think this inet_ntoa is not reentrant, though there are several
> >
> > functions
> >
> > > calling it. If two functions call it simultaneously, the result
> > > will be corrupted. Though I haven't really encountered this
> > > situation, it may
> >
> > occur
> >
> > > someday, especially when using multi-processors.
> > >
> > > There is another reentrant version of inet_ntoa called inet_ntoa_r
> > > in
> >
> > the
> >
> > > same file. It has been there for several years, but just used by
> > > ipfw2
> >
> > for
> >
> > > about four times in 7-CURRENT. In my patch, I replaced all the
> > > calls to inet_ntoa with calls to inet_ntoa_r.
> > >
> > > By the way, some of the original calls is written in this style:
> > > strcpy(buf, inet_ntoa(ip))
> > > The modified code is written in this style
> > > inet_ntoa_r(ip, buf)
> > > This change avoids a call to strcpy, and can save a little time.
> > >
> > > Here is the patch.
> >
> > http://people.freebsd.org/~delphij/misc/patch-itoa-by-nodummy-at-yeah
> >-net
> >
> > > I've already sent to PR(kern/104738), but got no reply, maybe it
> > > should
> >
> > be
> >
> > > discussed here first?
> >
> > I've got to agree with other posters that the stack variable
> > allocations are ugly.  What about extending log and printf to
> > understand ip4v addresses?  That's 90% of the uses and the others
> > appears to have buffers already.
> >
> > -- Brooks
> >
>
> Ugly? Why? Don't you use local variables in your sources?

You have to understand, that stack space is a limited resource in the 
kernel.  Some of the functions are leaf nodes in quite long call paths, 
which means adding those buffers can hit quite hard.

I guess what Brooks and I are trying to say is, that this needs to be 
considered carefully.  A simple search and replace won't do.

BTW, I took the PR for now and will look into it.  I don't think it's 
something we need to rush, as I haven't seen any reports or indication of 
real problems yet - fwiw we don't spew a lot of IP addresses to console 
or log in normal operation.

> By the way, implementing a printf/log which understands ipv4 address is
> tedious, perhaps.

Actually, it's a ~15 line patch, I will see if I can get to it later 
today.  If we reuse the number buffer we can even get away without 
increase in stack space usage.  Whether or not this is a good idea is on 
another page, but %I and %lI (for IPv6) would be available and we already 
have %D and %b as special cases in the kernel.

-- 
/"\  Best regards,                      | mlaier at freebsd.org
\ /  Max Laier                          | ICQ #67774661
 X   http://pf4freebsd.love2party.net/  | mlaier at EFnet
/ \  ASCII Ribbon Campaign              | Against HTML Mail and News
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-net/attachments/20061103/0d61322a/attachment.pgp


More information about the freebsd-net mailing list