On Sat, Oct 8, 2011 at 5:47 AM, Dag-Erling Smorgrav <[email protected]> wrote:
> Author: des
> Date: Sat Oct 8 12:47:00 2011
> New Revision: 226157
> URL: http://svn.freebsd.org/changeset/base/226157
>
> Log:
> Bring ioctlname() in line with all the other *name() functions, which
> actually print the name (or the numeric value, if they can't figure out
> the correct name) instead of just returning a pointer to it. Also, since
> ioctl numbers are not and probably never will be unique, drop support for
> using a switch statement instead of an if/else chain.
This commit broke truss by changing the ioctlname API signature. Example:
$ truss camcontrol devlist
# ...
Segmentation fault: 11 (core dumped)
Reason being is that truss uses ioctlname via an extern, so the
compiler doesn't note the difference (I assume because NO_WERROR= is
set in the Makefile) things go down in flames when it tries to print
out the ioctl call (dereferences a bad pointer with strdup)
This patch fixes it (with some minor Makefile cleanup), at the cost of
duplicating the mkioctls guts between kdump and truss (truss depended
on the old API signature).
Note: I did an `svn copy ../kdump/mkioctls .' beforehand in order to
bootstrap the svn history; that will need to be done before committing
my attached patch.
Thanks!
-Garrett
Index: usr.bin/truss/mkioctls
===================================================================
--- usr.bin/truss/mkioctls (working copy)
+++ usr.bin/truss/mkioctls (working copy)
@@ -58,12 +58,12 @@
print "#include <stdio.h>"
print "#include <cam/cam.h>"
print ""
- print "void ioctlname(unsigned long val, int decimal);"
+ print "const char *ioctlname(unsigned long val);"
print ""
print ioctl_includes
print ""
- print "void"
- print "ioctlname(unsigned long val, int decimal)"
+ print "const char*"
+ print "ioctlname(unsigned long val)"
print "{"
print "\tconst char *str = NULL;"
print ""
@@ -85,12 +85,7 @@
}
END {
print "\n"
- print "\tif (str != NULL)\n"
- print "\t\tprintf(\"%s\", str);\n"
- print "\telse if (decimal)\n"
- print "\t\tprintf(\"%lu\", val);\n"
- print "\telse\n"
- print "\t\tprintf(\"%#lx\", val);\n"
+ print "\treturn (str);\n"
print "}"
}
'
Index: usr.bin/truss/extern.h
===================================================================
--- usr.bin/truss/extern.h (revision 226524)
+++ usr.bin/truss/extern.h (working copy)
@@ -35,7 +35,7 @@
extern int start_tracing(int);
extern void restore_proc(int);
extern void waitevent(struct trussinfo *);
-extern const char *ioctlname(register_t val);
+const char *ioctlname(unsigned long val);
extern char *strsig(int sig);
#ifdef __amd64__
extern void amd64_syscall_entry(struct trussinfo *, int);
Index: usr.bin/truss/Makefile
===================================================================
--- usr.bin/truss/Makefile (revision 226524)
+++ usr.bin/truss/Makefile (working copy)
@@ -11,7 +11,7 @@
.endif
CFLAGS+= -I${.CURDIR} -I.
-CLEANFILES= syscalls.master syscalls.h ioctl.c
+CLEANFILES= syscalls.master
.SUFFIXES: .master
@@ -22,8 +22,8 @@
/bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh syscalls.master \
${.CURDIR}/i386.conf
-ioctl.c: ${.CURDIR}/../kdump/mkioctls
- sh ${.CURDIR}/../kdump/mkioctls ${DESTDIR}/usr/include > ${.TARGET}
+ioctl.c: ${.CURDIR}/mkioctls
+ sh ${.CURDIR}/mkioctls ${DESTDIR}/usr/include > ${.TARGET}
.if ${MACHINE_CPUARCH} == "i386"
SRCS+= i386-linux.c linux_syscalls.h
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"