Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Feb 2010 16:05:09 +0000 (UTC)
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r204045 - head/usr.bin/kdump
Message-ID:  <201002181605.o1IG59IQ011734@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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");
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201002181605.o1IG59IQ011734>