Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 7 May 2011 19:09:03 -0700
From:      Garrett Cooper <yanegomi@gmail.com>
To:        freebsd-hackers@freebsd.org
Subject:   Re: [PATCH] draft patch to make usr.bin/kdump WARNS?= 6 clean
Message-ID:  <BANLkTimGjDovv=SAYw98m4L=xOhojN1anQ@mail.gmail.com>
In-Reply-To: <BANLkTin4ip5gp3gQJVz3dvONtW8cH7puCg@mail.gmail.com>
References:  <BANLkTinR1qXERz9QJfneM4aKXhdLdz3ZtQ@mail.gmail.com> <BANLkTiniKkdQYs7vyWmoeYDjJMH%2B0oAFRg@mail.gmail.com> <BANLkTimAZ3E6BNT606z_AN0uYGuVrN9N3A@mail.gmail.com> <BANLkTikHBVWkRDPBjSCkXLm-%2BUd-KisZgw@mail.gmail.com> <BANLkTin4ip5gp3gQJVz3dvONtW8cH7puCg@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
On Mon, May 2, 2011 at 9:40 AM, Garrett Cooper <yanegomi@gmail.com> wrote:
> On Mon, May 2, 2011 at 9:24 AM, Garrett Cooper <yanegomi@gmail.com> wrote:
>> ---------- Forwarded message ----------
>> From: Garrett Cooper <yanegomi@gmail.com>
>> Date: Mon, May 2, 2011 at 9:24 AM
>> Subject: Re: [PATCH] draft patch to make usr.bin/kdump WARNS?= 6 clean
>> To: Arnaud Lacombe <lacombar@gmail.com>
>>
>>
>> On Mon, May 2, 2011 at 9:21 AM, Arnaud Lacombe <lacombar@gmail.com> wrote:
>>> Hi,
>>>
>>> On Mon, May 2, 2011 at 12:10 PM, Garrett Cooper <yanegomi@gmail.com> wrote:
>>>>    I wanted to do something different this weekend, and I picked
>>>> usr.bin/kdump as a likely 'victim' for converting from WARNS?= 0 to
>>>> WARNS?= 6. I'm curious as to whether or not this is on the right
>>>> track, but here's the reasoning I used:
>>>>
>>>> 1. Conditionally include diskmbr.h or diskpc98.h based on whether or
>>>> not an architecture was non-pc98 or pc98 to avoid duplicate
>>>> definitions, because the beforementioned headers are mutually
>>>> exclusive.
>>>> 2. Move the sockfamilyname declaration to kdump_subr.h as it's used in
>>>> the generated ioctl.c file.
>>>> 3. Fix a signed vs unsigned comparison with a simple cast because the
>>>> size_t value will be sufficiently small that it can be converted to a
>>>> signed comparison.
>>>> 4. Fix a cast assignment type source//dest value alignment issue on
>>>> ia64 assigning a struct sockaddr value to either struct sockaddr_in or
>>>> struct sockaddr_in6 by using calloc and memcpy.
>>>> 5. Fix structure alignment issues on arm by marking some structures as __packed.
>>>> 6. Fix a shadowed declaration for flags by renaming a locally scoped
>>>> variable to _flags; add appropriate type to field.
>>>> 7. Remove unused argument to ktruser_malloc.
>>>> 8. Add missing declarations for ktruser_malloc and ktruser_rtld.
>>>>
>>>>    I've run some basic tests and things seem sane (in particular
>>>> ktrace'ing ktrace :)... ktrace'ing 'ssh ::1' and ktrace'ing 'ssh
>>>> localhost', but I was wondering if there was anything I was missing or
>>>> if someone else who ran arm or ia64 could test this patch out for me.
>>>>    I've run make universe on amd64, i386, ia64, mips, and pc98, and
>>>> things seem sane, but I can't play around with those machines to
>>>> determine whether or not they're functional at runtime with the above
>>>> changes.
>>>> Thanks!
>>>> -Garrett
>>>>
>>> I do not see any patch, either inline or attached.
>>>
>>>  - Arnaud
>>>
>>>> PS Oh yeah... no commit bit means that I can't commit this either, but
>>>> I was curious if my approach was correct before getting to that step
>>>> :).
>>
>> Yeah... I'm stupid for not attaching it. Need to get more sleep.
>
> Note to self: should be freeing socket structures after use, and I
> should apply similar logic to the rest of the socket inspection code.
> I'll attach another version after I do some more testing.

    Here's an updated patch that was run through make universe a
couple of times.
Thanks!
-Garrett

[-- Attachment #2 --]
Index: usr.bin/kdump/kdump.c
===================================================================
--- usr.bin/kdump/kdump.c	(revision 221219)
+++ usr.bin/kdump/kdump.c	(working copy)
@@ -99,8 +99,9 @@
 void ktrsockaddr(struct sockaddr *);
 void ktrstat(struct stat *);
 void ktrstruct(char *, size_t);
+void ktruser_malloc(unsigned char * p);
+void ktruser_rtld(int len, unsigned char * p);
 void usage(void);
-void sockfamilyname(int);
 const char *ioctlname(u_long);
 
 int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
@@ -528,13 +529,13 @@
 				ip++;
 				narg--;
 			} else if (ktr->ktr_code == SYS_open) {
-				int	flags;
+				int	open_flags;
 				int	mode;
 				print_number(ip,narg,c);
-				flags = *ip;
+				open_flags = *ip;
 				mode = *++ip;
 				(void)putchar(',');
-				flagsandmodename (flags, mode, decimal);
+				flagsandmodename (open_flags, mode, decimal);
 				ip++;
 				narg-=2;
 			} else if (ktr->ktr_code == SYS_wait4) {
@@ -1167,7 +1168,7 @@
 	size_t mapsize;
 	int refcnt;
 	char name[MAXPATHLEN];
-};
+} __packed;
 
 void
 ktruser_rtld(int len, unsigned char *p)
@@ -1253,10 +1254,10 @@
 	void *p;
 	size_t s;
 	void *r;
-};
+} __packed;
 
 void
-ktruser_malloc(int len, unsigned char *p)
+ktruser_malloc(unsigned char *p)
 {
 	struct utrace_malloc *ut = (struct utrace_malloc *)p;
 
@@ -1280,7 +1281,7 @@
 	}
 
 	if (len == sizeof(struct utrace_malloc)) {
-		ktruser_malloc(len, p);
+		ktruser_malloc(p);
 		return;
 	}
 
@@ -1315,61 +1316,67 @@
 	printf(", ");
 
 #define check_sockaddr_len(n)					\
-	if (sa_##n->s##n##_len < sizeof(struct sockaddr_##n)) {	\
+	if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {	\
 		printf("invalid");				\
 		break;						\
 	}
 
 	switch(sa->sa_family) {
 	case AF_INET: {
-		struct sockaddr_in	*sa_in;
+		struct sockaddr_in sa_in;
 
-		sa_in = (struct sockaddr_in *)sa;
+		memset(&sa_in, 0, sizeof(sa_in));
+		memcpy(&sa_in, sa, sizeof(sa));
 		check_sockaddr_len(in);
-		inet_ntop(AF_INET, &sa_in->sin_addr, addr, sizeof addr);
-		printf("%s:%u", addr, ntohs(sa_in->sin_port));
+		inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
+		printf("%s:%u", addr, ntohs(sa_in.sin_port));
 		break;
 	}
 #ifdef NETATALK
 	case AF_APPLETALK: {
-		struct sockaddr_at	*sa_at;
+		struct sockaddr_at	sa_at;
 		struct netrange		*nr;
 
-		sa_at = (struct sockaddr_at *)sa;
+		memset(&sa_at, 0, sizeof(sa_at));
+		memcpy(&sa_at, sa, sizeof(sa));
 		check_sockaddr_len(at);
-		nr = &sa_at->sat_range.r_netrange;
-		printf("%d.%d, %d-%d, %d", ntohs(sa_at->sat_addr.s_net),
-			sa_at->sat_addr.s_node, ntohs(nr->nr_firstnet),
+		nr = &sa_at.sat_range.r_netrange;
+		printf("%d.%d, %d-%d, %d", ntohs(sa_at.sat_addr.s_net),
+			sa_at.sat_addr.s_node, ntohs(nr->nr_firstnet),
 			ntohs(nr->nr_lastnet), nr->nr_phase);
 		break;
 	}
 #endif
 	case AF_INET6: {
-		struct sockaddr_in6	*sa_in6;
+		struct sockaddr_in6 sa_in6;
 
-		sa_in6 = (struct sockaddr_in6 *)sa;
+		memset(&sa_in6, 0, sizeof(sa_in6));
+		memcpy(&sa_in6, sa, sizeof(sa));
 		check_sockaddr_len(in6);
-		inet_ntop(AF_INET6, &sa_in6->sin6_addr, addr, sizeof addr);
-		printf("[%s]:%u", addr, htons(sa_in6->sin6_port));
+		inet_ntop(AF_INET6, &sa_in6.sin6_addr, addr, sizeof addr);
+		printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
 		break;
 	}
 #ifdef IPX
 	case AF_IPX: {
-		struct sockaddr_ipx	*sa_ipx;
+		struct sockaddr_ipx sa_ipx;
 
-		sa_ipx = (struct sockaddr_ipx *)sa;
+		memset(&sa_ipx, 0, sizeof(sa_ipx));
+		memcpy(&sa_ipx, sa, sizeof(sa));
 		check_sockaddr_len(ipx);
 		/* XXX wish we had ipx_ntop */
-		printf("%s", ipx_ntoa(sa_ipx->sipx_addr));
+		printf("%s", ipx_ntoa(sa_ipx.sipx_addr));
+		free(sa_ipx);
 		break;
 	}
 #endif
 	case AF_UNIX: {
-		struct sockaddr_un *sa_un;
+		struct sockaddr_un sa_un;
 
-		sa_un = (struct sockaddr_un *)sa;
+		memset(&sa_un, 0, sizeof(sa_un));
+		memcpy(&sa_un, sa, sizeof(sa));
 		check_sockaddr_len(un);
-		printf("%.*s", (int)sizeof(sa_un->sun_path), sa_un->sun_path);
+		printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
 		break;
 	}
 	default:
@@ -1480,8 +1487,8 @@
 	if (datalen == 0)
 		goto invalid;
 	/* sanity check */
-	for (i = 0; i < namelen; ++i)
-		if (!isalpha((unsigned char)name[i]))
+	for (i = 0; i < (int)namelen; ++i)
+		if (!isalpha(name[i]))
 			goto invalid;
 	if (strcmp(name, "stat") == 0) {
 		if (datalen != sizeof(struct stat))
Index: usr.bin/kdump/kdump_subr.h
===================================================================
--- usr.bin/kdump/kdump_subr.h	(revision 221219)
+++ usr.bin/kdump/kdump_subr.h	(working copy)
@@ -45,3 +45,4 @@
 void minheritname (int);
 void quotactlname (int);
 void ptraceopname (int);
+void sockfamilyname(int);
Index: usr.bin/kdump/mkioctls
===================================================================
--- usr.bin/kdump/mkioctls	(revision 221219)
+++ usr.bin/kdump/mkioctls	(working copy)
@@ -22,12 +22,21 @@
 # XXX should we use an ANSI cpp?
 ioctl_includes=`
 	cd $1
-	find -H -s * -name '*.h' |
+	find -H -s * -name '*.h' | grep -v '.*disk.*\.h' | \
 		xargs egrep -l \
 '^#[ 	]*define[ 	]+[A-Za-z_][A-Za-z0-9_]*[ 	]+_IO[^a-z0-9_]' |
 		awk '{printf("#include <%s>\\\\n", $1)}'
 `
 
+case "`uname -m`" in
+*pc98*)
+	ioctl_includes="$ioctl_includes#include <sys/diskpc98.h>\\n"
+	;;
+*)
+	ioctl_includes="$ioctl_includes#include <sys/diskmbr.h>\\n"
+	;;
+esac
+
 awk -v x="$ioctl_includes" 'BEGIN {print x}' |
 	gcc -E -I$1 -dM -DCOMPAT_43TTY - |
 	awk -v ioctl_includes="$ioctl_includes" -v use_switch="$use_switch" '
Index: usr.bin/kdump/Makefile
===================================================================
--- usr.bin/kdump/Makefile	(revision 221219)
+++ usr.bin/kdump/Makefile	(working copy)
@@ -15,7 +15,7 @@
 SRCS+=		linux_syscalls.c
 .endif
 
-WARNS?=		0
+WARNS?=		6
 
 CLEANFILES=	ioctl.c kdump_subr.c linux_syscalls.c
 

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BANLkTimGjDovv=SAYw98m4L=xOhojN1anQ>