Apply by doing:
	cd /usr/src
	patch -p0 < 030_kernexec.patch
And then rebuild your kernel. 

Index: sys/kern/kern_exec.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_exec.c,v
retrieving revision 1.44
diff -u -r1.44 kern_exec.c
--- sys/kern/kern_exec.c	2000/09/28 13:41:39	1.44
+++ sys/kern/kern_exec.c	2001/06/15 16:23:03
@@ -133,6 +133,15 @@
 	    (p->p_flag & P_TRACED) || p->p_fd->fd_refcnt > 1)
 		epp->ep_vap->va_mode &= ~(VSUID | VSGID);
 
+	/*
+	 * Set the P_SUID* flags early so that we won't be fiddled with when
+	 * we sleep later in this code.
+	 * XXX - this could give us a few false positives and the caller must
+	 *       make sure to save and restore the flags if exec fails.
+	 */
+	if (epp->ep_vap->va_mode & (VSUID|VSGID))
+		p->p_flag |= P_SUGID|P_SUGIDEXEC;
+
 	/* check access.  for root we have to see if any exec bit on */
 	if ((error = VOP_ACCESS(vp, VEXEC, p->p_ucred, p)) != 0)
 		goto bad1;
@@ -244,6 +253,7 @@
 	char **tmpfap;
 	int szsigcode;
 	extern struct emul emul_native;
+	int saved_sugid;
 
 	/*
 	 * figure out the maximum size of an exec header, if necessary.
@@ -275,6 +285,7 @@
 	pack.ep_emul = &emul_native;
 	pack.ep_flags = 0;
 
+	saved_sugid = p->p_flag & (P_SUGID|P_SUGIDEXEC);
 	/* see if we can run it. */
 	if ((error = check_exec(p, &pack)) != 0) {
 		goto freehdr;
@@ -642,6 +653,7 @@
 
 freehdr:
 	free(pack.ep_hdr, M_EXEC);
+	p->p_flag = (p->p_flag & ~(P_SUGID|P_SUGIDEXEC)) | saved_sugid;
 	return (error);
 
 exec_abort:
