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");
        }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to