On 16/03/20(Mon) 14:01, Martin Pieuchot wrote:
> vget(9) might fail, stop right away if that happens.
>
> CID 1453020 Unchecked return value.
Updated diff that stops tracing if vget(9) fails, similar to what's
currently done if VOP_WRITE(9) fails, suggested by visa@.
Code shuffling is there to avoid calling vput(9) if vget(9) doesn't
succeed.
ok?
Index: kern/kern_ktrace.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_ktrace.c,v
retrieving revision 1.100
diff -u -p -r1.100 kern_ktrace.c
--- kern/kern_ktrace.c 6 Oct 2019 16:24:14 -0000 1.100
+++ kern/kern_ktrace.c 17 Mar 2020 09:46:03 -0000
@@ -649,12 +649,17 @@ ktrwriteraw(struct proc *curp, struct vn
auio.uio_iovcnt++;
auio.uio_resid += kth->ktr_len;
}
- vget(vp, LK_EXCLUSIVE | LK_RETRY);
+ error = vget(vp, LK_EXCLUSIVE | LK_RETRY);
+ if (error)
+ goto bad;
error = VOP_WRITE(vp, &auio, IO_UNIT|IO_APPEND, cred);
- if (!error) {
- vput(vp);
- return (0);
- }
+ vput(vp);
+ if (error)
+ goto bad;
+
+ return (0);
+
+bad:
/*
* If error encountered, give up tracing on this vnode.
*/
@@ -663,8 +668,6 @@ ktrwriteraw(struct proc *curp, struct vn
LIST_FOREACH(pr, &allprocess, ps_list)
if (pr->ps_tracevp == vp && pr->ps_tracecred == cred)
ktrcleartrace(pr);
-
- vput(vp);
return (error);
}