List Info

Thread: Re: a format error in pf_print_host()




Re: a format error in pf_print_host()
country flaguser name
Japan
2007-11-20 08:48:28
At Tue, 20 Nov 2007 23:17:43 +0900,
JINMEI Tatuya <jinmeiisl.rdc.toshiba.co.jp>
wrote:

> formats "1:2:3:4:5:6:7:8" as
":2:3:4:5:6:7:8".  This can be confirmed
> by the sample code attached to this message by
> - saving the file as e.g. "foo.c"
> - cc -o foo foo.c
> - ./foo 1:2:3:4:5:6:7:8
> 
> I've also attached a proposed patch to this problem. 
The diff was
> made against 6-STABLE, but it's probably applicable to
other versions.

Hmm...apparently attachments were stripped.  I'm directly
copying the
file contents below:

=================== sample program ===================
#include <sys/param.h>
#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

struct pf_addr {
	union {
		struct in_addr		v4;
		struct in6_addr		v6;
		u_int8_t		addr8[16];
		u_int16_t		addr16[8];
		u_int32_t		addr32[4];
	} pfa;		    /* 128-bit address */
#define v4	pfa.v4
#define v6	pfa.v6
#define addr8	pfa.addr8
#define addr16	pfa.addr16
#define addr32	pfa.addr32
};

static void
pf_print_host(struct pf_addr *addr, u_int16_t p, sa_family_t
af)
{
	switch (af) {
	case AF_INET: {
		u_int32_t a = ntohl(addr->addr32[0]);
		printf("%u.%u.%u.%u", (a>>24)&255,
(a>>16)&255,
		    (a>>8)&255, a&255);
		if (p) {
			p = ntohs(p);
			printf(":%u", p);
		}
		break;
	}
	case AF_INET6: {
		u_int16_t b;
		u_int8_t i, curstart = 255, curend = 0,
		    maxstart = 0, maxend = 0;
		for (i = 0; i < 8; i++) {
			if (!addr->addr16[i]) {
				if (curstart == 255)
					curstart = i;
				else
					curend = i;
			} else {
				if (curstart) {
					if ((curend - curstart) >
					    (maxend - maxstart)) {
						maxstart = curstart;
						maxend = curend;
						curstart = 255;
					}
				}
			}
		}
		for (i = 0; i < 8; i++) {
			if (i >= maxstart && i <= maxend) {
				if (maxend != 7) {
					if (i == maxstart)
						printf(":");
				} else {
					if (i == maxend)
						printf(":");
				}
			} else {
				b = ntohs(addr->addr16[i]);
				printf("%x", b);
				if (i < 7)
					printf(":");
			}
		}
		if (p) {
			p = ntohs(p);
			printf("[%u]", p);
		}
		break;
	}
	}
}

main(int argc, char *argv[])
{
	struct pf_addr addr;

	if (argc < 2) {
		fprintf(stderr, "specify an addressn");
		exit(1);
	}

	if (inet_pton(AF_INET6, argv[1], &addr) != 1) {
		fprintf(stderr, "inet_pton failed for %sn",
argv[1]);
		exit(1);
	}
	pf_print_host(&addr, 0, AF_INET6);
	putchar('n');

	exit(0);
}
=================== sample program ===================

=================== patch for pf.c ===================
Index: pf.c
============================================================
=======
RCS file: /home/ncvs/src/sys/contrib/pf/net/pf.c,v
retrieving revision 1.34.2.6
diff -u -r1.34.2.6 pf.c
--- pf.c	23 Aug 2007 09:38:14 -0000	1.34.2.6
+++ pf.c	20 Nov 2007 14:06:34 -0000
 -1211,7
+1211,7 
 	case AF_INET6: {
 		u_int16_t b;
 		u_int8_t i, curstart = 255, curend = 0,
-		    maxstart = 0, maxend = 0;
+		    maxstart = 255, maxend = 255;
 		for (i = 0; i < 8; i++) {
 			if (!addr->addr16[i]) {
 				if (curstart == 255)
=================== patch for pf.c ===================
_______________________________________________
freebsd-netfreebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to
"freebsd-net-unsubscribefreebsd.org"

[1]

about | contact  Other archives ( Real Estate discussion Medical topics )