svn commit: r246810 - projects/diffused_head/sbin/ipfw

Lawrence Stewart lstewart at FreeBSD.org
Fri Feb 15 00:54:33 UTC 2013


Author: lstewart
Date: Fri Feb 15 00:54:33 2013
New Revision: 246810
URL: http://svnweb.freebsd.org/changeset/base/246810

Log:
  Mitigate against possible unaligned access when parsing protocol data.
  
  Reported by:	clang

Modified:
  projects/diffused_head/sbin/ipfw/diffuse_proto.c

Modified: projects/diffused_head/sbin/ipfw/diffuse_proto.c
==============================================================================
--- projects/diffused_head/sbin/ipfw/diffuse_proto.c	Thu Feb 14 21:29:55 2013	(r246809)
+++ projects/diffused_head/sbin/ipfw/diffuse_proto.c	Fri Feb 15 00:54:33 2013	(r246810)
@@ -38,6 +38,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/endian.h>
 #include <sys/socket.h>
 #include <sys/tree.h>
 
@@ -73,7 +74,7 @@ print_field(int idx, int id, int len, ch
 	case DIP_IE_DST_IPV4:
 		{
 		/* XXX: Resolve to name. */
-		a.s_addr = *((uint32_t *)val);
+		a.s_addr = le32dec(val); /* le32dec to leave as BE. */
 		printf("%s", inet_ntoa(a));
 		break;
 		}
@@ -81,7 +82,7 @@ print_field(int idx, int id, int len, ch
 	case DIP_IE_SRC_PORT:
 	case DIP_IE_DST_PORT:
 		/* XXX: Resolve to name. */
-		printf("%u", ntohs(*((uint16_t *)val)));
+		printf("%u", be16dec(val));
 		break;
 
 	case DIP_IE_PROTO:
@@ -89,13 +90,13 @@ print_field(int idx, int id, int len, ch
 	case DIP_IE_TIMEOUT_TYPE:
 	case DIP_IE_IPV4_TOS:
 		/* XXX: Resolve to name. */
-		printf("%u", *((uint8_t *)val));
+		printf("%u", *val);
 		break;
 
 	case DIP_IE_CLASS_LABEL:
 	case DIP_IE_ACTION_FLAGS:
 	case DIP_IE_TIMEOUT:
-		printf("%u", ntohs(*((uint16_t *)val)));
+		printf("%u", be16dec(val));
 		break;
 
 	case DIP_IE_ACTION:
@@ -107,7 +108,7 @@ print_field(int idx, int id, int len, ch
 
 	case DIP_IE_PCKT_CNT:
 	case DIP_IE_KBYTE_CNT:
-		printf("%u", ntohl(*((uint32_t *)val)));
+		printf("%u", be32dec(val));
 		break;
 
 	case DIP_IE_CLASSES:
@@ -116,7 +117,7 @@ print_field(int idx, int id, int len, ch
 		while (c < val + len) {
 			printf("%s:", c);
 			c += strlen(val) + 1;
-			printf("%u", ntohs(*((uint16_t *)c)));
+			printf("%u", be16dec(c));
 			c += sizeof(uint16_t);
 			if (c < val + len)
 				printf(" ");
@@ -199,7 +200,7 @@ diffuse_proto_print_msg(char *buf, struc
 				    sizeof(struct dip_set_header) -
 				    sizeof(struct dip_templ_header)) {
 					r->fields[r->fcnt].id =
-					    ntohs(*((uint16_t *)(buf + offs)));
+					    be16dec(buf + offs);
 					offs += sizeof(uint16_t);
 					info = diffuse_proto_get_info(
 					    r->fields[r->fcnt].id);
@@ -207,8 +208,7 @@ diffuse_proto_print_msg(char *buf, struc
 					r->fields[r->fcnt].len = info.len;
 					if (r->fields[r->fcnt].len == 0) {
 						r->fields[r->fcnt].len =
-						    ntohs(*((uint16_t *)
-						    (buf + offs)));
+						    be16dec(buf + offs);
 						offs += sizeof(uint16_t);
 					}
 					r->fcnt++;


More information about the svn-src-projects mailing list