From 667d7255be08a70cf5f13ef687602bb02959d087 Mon Sep 17 00:00:00 2001 From: pjd Date: Wed, 18 Sep 2013 19:26:08 +0000 Subject: Fix panic in ktrcapfail() when no capability rights are passed. While here, correct all consumers to pass NULL instead of 0 as we pass capability rights as pointers now, not uint64_t. Reported by: Daniel Peyrolon Tested by: Daniel Peyrolon Approved by: re (marius) --- sys/amd64/amd64/sys_machdep.c | 2 +- sys/arm/arm/sys_machdep.c | 2 +- sys/i386/i386/sys_machdep.c | 2 +- sys/kern/kern_ktrace.c | 11 +++++++++-- sys/kern/vfs_lookup.c | 6 +++--- sys/sparc64/sparc64/sys_machdep.c | 2 +- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/sys/amd64/amd64/sys_machdep.c b/sys/amd64/amd64/sys_machdep.c index 5be8af5..81ac0e3 100644 --- a/sys/amd64/amd64/sys_machdep.c +++ b/sys/amd64/amd64/sys_machdep.c @@ -209,7 +209,7 @@ sysarch(td, uap) default: #ifdef KTRACE if (KTRPOINT(td, KTR_CAPFAIL)) - ktrcapfail(CAPFAIL_SYSCALL, 0, 0); + ktrcapfail(CAPFAIL_SYSCALL, NULL, NULL); #endif return (ECAPMODE); } diff --git a/sys/arm/arm/sys_machdep.c b/sys/arm/arm/sys_machdep.c index 7676a96..7d7f0f5 100644 --- a/sys/arm/arm/sys_machdep.c +++ b/sys/arm/arm/sys_machdep.c @@ -138,7 +138,7 @@ sysarch(td, uap) default: #ifdef KTRACE if (KTRPOINT(td, KTR_CAPFAIL)) - ktrcapfail(CAPFAIL_SYSCALL, 0, 0); + ktrcapfail(CAPFAIL_SYSCALL, NULL, NULL); #endif return (ECAPMODE); } diff --git a/sys/i386/i386/sys_machdep.c b/sys/i386/i386/sys_machdep.c index adf6ac4..746f846 100644 --- a/sys/i386/i386/sys_machdep.c +++ b/sys/i386/i386/sys_machdep.c @@ -132,7 +132,7 @@ sysarch(td, uap) default: #ifdef KTRACE if (KTRPOINT(td, KTR_CAPFAIL)) - ktrcapfail(CAPFAIL_SYSCALL, 0, 0); + ktrcapfail(CAPFAIL_SYSCALL, NULL, NULL); #endif return (ECAPMODE); } diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 3b34fb0..d4b722a 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include "opt_ktrace.h" #include +#include #include #include #include @@ -791,8 +792,14 @@ ktrcapfail(type, needed, held) return; kcf = &req->ktr_data.ktr_cap_fail; kcf->cap_type = type; - kcf->cap_needed = *needed; - kcf->cap_held = *held; + if (needed != NULL) + kcf->cap_needed = *needed; + else + cap_rights_init(&kcf->cap_needed); + if (held != NULL) + kcf->cap_held = *held; + else + cap_rights_init(&kcf->cap_held); ktr_enqueuerequest(td, req); ktrace_exit(td); } diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index d4d0166..0be0463 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -178,7 +178,7 @@ namei(struct nameidata *ndp) if (ndp->ni_dirfd == AT_FDCWD) { #ifdef KTRACE if (KTRPOINT(td, KTR_CAPFAIL)) - ktrcapfail(CAPFAIL_LOOKUP, 0, 0); + ktrcapfail(CAPFAIL_LOOKUP, NULL, NULL); #endif error = ECAPMODE; } @@ -284,7 +284,7 @@ namei(struct nameidata *ndp) if (ndp->ni_strictrelative != 0) { #ifdef KTRACE if (KTRPOINT(curthread, KTR_CAPFAIL)) - ktrcapfail(CAPFAIL_LOOKUP, 0, 0); + ktrcapfail(CAPFAIL_LOOKUP, NULL, NULL); #endif return (ENOTCAPABLE); } @@ -640,7 +640,7 @@ dirloop: if (ndp->ni_strictrelative != 0) { #ifdef KTRACE if (KTRPOINT(curthread, KTR_CAPFAIL)) - ktrcapfail(CAPFAIL_LOOKUP, 0, 0); + ktrcapfail(CAPFAIL_LOOKUP, NULL, NULL); #endif error = ENOTCAPABLE; goto bad; diff --git a/sys/sparc64/sparc64/sys_machdep.c b/sys/sparc64/sparc64/sys_machdep.c index c8e8694..9c9163f 100644 --- a/sys/sparc64/sparc64/sys_machdep.c +++ b/sys/sparc64/sparc64/sys_machdep.c @@ -71,7 +71,7 @@ sysarch(struct thread *td, struct sysarch_args *uap) default: #ifdef KTRACE if (KTRPOINT(td, KTR_CAPFAIL)) - ktrcapfail(CAPFAIL_SYSCALL, 0, 0); + ktrcapfail(CAPFAIL_SYSCALL, NULL, NULL); #endif return (ECAPMODE); } -- cgit v1.1