Re: inet(3) inet_network() bug, [was: cvs commit: src/usr.sbin/jexec jexec.8 jexec.c]

From: Bjoern A. Zeeb <bz_at_FreeBSD.org>
Date: Thu, 29 May 2008 14:58:38 +0000 (UTC)
On Thu, 29 May 2008, Oliver Fromme wrote:

Hi,

> > > However, I do share the concern that there's an ambiguity
> > > in the syntax:  "127" can be a jail ID as well as an IP
> > > number (same as 0.0.0.127) or a hostname.  Either the
> >
> > actually 127.0.0.0
>
> I'm afraid I think it is 0.0.0.127.
> 127.0.0.0 would be 2130706432.

127.0.0.1 is 0x0000007f.

~/tmp> ./a.out 127
127.0.0.0

> > > using 127.1 as a shotcut for 127.0.0.1.
> >
> > Yes. because that is 127.1.0.0 and not 127.0.0.1.
>
> I'm pretty sure 127.1 is the same as 127.0.0.1.  Last
> time I used telnet 127.1 to test things it worked fine.
>
> 127.1.0.0 would be 127.65536.

re-reading the man page inet(3) it seems you would be right
for 127.0.0.1 == 127.1 -- just that our implementation of
inet_network() doesn't think you are... *sigh* I know this
function. It's from bind sources...

~/tmp> ./a.out 127.1
1.127.0.0

btw. the 3 digit version seems to be broken as well:
~/tmp> ./a.out 128.1.2
2.1.128.0


~/tmp> cat 127.c 
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <err.h>

int
main(int argc, char *argv[])
{
         in_addr_t ia;
         char buf[16];

         if (argc != 2)
                 errx(1, "usage: %s IP-address", argv[0]);

         ia = inet_network(argv[1]);
         if (ia == INADDR_NONE)
                 err(1, "inet_network");

         if (inet_ntop(AF_INET, &ia, buf, sizeof(buf)) == NULL)
                 err(1, "inet_ntop");

         printf("%s\n", buf);

         return (0);
}

-- 
Bjoern A. Zeeb              Stop bit received. Insert coin for new game.
Received on Thu May 29 2008 - 15:00:07 UTC