svn commit: r204045 - head/usr.bin/kdump

Warner Losh imp at FreeBSD.org
Thu Feb 18 16:05:10 UTC 2010


Author: imp
Date: Thu Feb 18 16:05:09 2010
New Revision: 204045
URL: http://svn.freebsd.org/changeset/base/204045

Log:
  The kdump data stream is an unaligned data stream for stat and
  sockaddr structures.  As such, we have top copy the data structure
  into a local buffer before we can reference it, otherwise we have
  unaligned references (these are fixed up automatically on some CPUs,
  but not on others).  We do this unconditionally to make the code
  easier to read and understand.
  
  Submitted by:	Grzegorz Bernacki

Modified:
  head/usr.bin/kdump/kdump.c

Modified: head/usr.bin/kdump/kdump.c
==============================================================================
--- head/usr.bin/kdump/kdump.c	Thu Feb 18 15:45:43 2010	(r204044)
+++ head/usr.bin/kdump/kdump.c	Thu Feb 18 16:05:09 2010	(r204045)
@@ -1328,6 +1328,8 @@ ktrstruct(char *buf, size_t buflen)
 	char *name, *data;
 	size_t namelen, datalen;
 	int i;
+	struct stat sb;
+	struct sockaddr_storage ss;
 
 	for (name = buf, namelen = 0;
 	     namelen < buflen && name[namelen] != '\0';
@@ -1348,12 +1350,16 @@ ktrstruct(char *buf, size_t buflen)
 	if (strcmp(name, "stat") == 0) {
 		if (datalen != sizeof(struct stat))
 			goto invalid;
-		ktrstat((struct stat *)data);
+		memcpy(&sb, data, datalen);
+		ktrstat(&sb);
 	} else if (strcmp(name, "sockaddr") == 0) {
+		if (datalen > sizeof(ss))
+			goto invalid;
+		memcpy(&ss, data, datalen);
 		if (datalen < sizeof(struct sockaddr) ||
-		    datalen != ((struct sockaddr *)(data))->sa_len)
+		    datalen != ss.ss_len)
 			goto invalid;
-		ktrsockaddr((struct sockaddr *)data);
+		ktrsockaddr((struct sockaddr *)&ss);
 	} else {
 		printf("unknown structure\n");
 	}


More information about the svn-src-head mailing list