Fix wrong formatting of 0.0.0.0/X table records in ipfw(8).
Add `flags` u16 field to the hole in ipfw_table_xentry structure. Kernel has been guessing address family for supplied record based on xent length size. Userland, however, has been getting fixed-size ipfw_table_xentry structures guessing address family by checking address by IN6_IS_ADDR_V4COMPAT(). Fix this behavior by providing specific IPFW_TCF_INET flag for IPv4 records. PR: bin/189471 Submitted by: Dennis Yusupoff <dyr@smartspb.net> MFC after: 2 weeks
This commit is contained in:
parent
b1a4156614
commit
c3015737f3
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=266310
@ -4389,7 +4389,7 @@ table_list(uint16_t num, int need_header)
|
|||||||
addr6 = &xent->k.addr6;
|
addr6 = &xent->k.addr6;
|
||||||
|
|
||||||
|
|
||||||
if (IN6_IS_ADDR_V4COMPAT(addr6)) {
|
if ((xent->flags & IPFW_TCF_INET) != 0) {
|
||||||
/* IPv4 address */
|
/* IPv4 address */
|
||||||
inet_ntop(AF_INET, &addr6->s6_addr32[3], tbuf, sizeof(tbuf));
|
inet_ntop(AF_INET, &addr6->s6_addr32[3], tbuf, sizeof(tbuf));
|
||||||
} else {
|
} else {
|
||||||
|
@ -614,6 +614,7 @@ typedef struct _ipfw_table_xentry {
|
|||||||
uint8_t type; /* entry type */
|
uint8_t type; /* entry type */
|
||||||
uint8_t masklen; /* mask length */
|
uint8_t masklen; /* mask length */
|
||||||
uint16_t tbl; /* table number */
|
uint16_t tbl; /* table number */
|
||||||
|
uint16_t flags; /* record flags */
|
||||||
uint32_t value; /* value */
|
uint32_t value; /* value */
|
||||||
union {
|
union {
|
||||||
/* Longest field needs to be aligned by 4-byte boundary */
|
/* Longest field needs to be aligned by 4-byte boundary */
|
||||||
@ -621,6 +622,7 @@ typedef struct _ipfw_table_xentry {
|
|||||||
char iface[IF_NAMESIZE]; /* interface name */
|
char iface[IF_NAMESIZE]; /* interface name */
|
||||||
} k;
|
} k;
|
||||||
} ipfw_table_xentry;
|
} ipfw_table_xentry;
|
||||||
|
#define IPFW_TCF_INET 0x01 /* CIDR flags: IPv4 record */
|
||||||
|
|
||||||
typedef struct _ipfw_table {
|
typedef struct _ipfw_table {
|
||||||
u_int32_t size; /* size of entries in bytes */
|
u_int32_t size; /* size of entries in bytes */
|
||||||
|
@ -697,6 +697,7 @@ dump_table_xentry_base(struct radix_node *rn, void *arg)
|
|||||||
xent->masklen = 33 - ffs(ntohl(n->mask.sin_addr.s_addr));
|
xent->masklen = 33 - ffs(ntohl(n->mask.sin_addr.s_addr));
|
||||||
/* Save IPv4 address as deprecated IPv6 compatible */
|
/* Save IPv4 address as deprecated IPv6 compatible */
|
||||||
xent->k.addr6.s6_addr32[3] = n->addr.sin_addr.s_addr;
|
xent->k.addr6.s6_addr32[3] = n->addr.sin_addr.s_addr;
|
||||||
|
xent->flags = IPFW_TCF_INET;
|
||||||
xent->value = n->value;
|
xent->value = n->value;
|
||||||
tbl->cnt++;
|
tbl->cnt++;
|
||||||
return (0);
|
return (0);
|
||||||
|
Loading…
Reference in New Issue
Block a user