patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
		
			
				
	
	
		
			334 lines
		
	
	
	
		
			9.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			334 lines
		
	
	
	
		
			9.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Index: miscfs/procfs/procfs.h
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/sys/miscfs/procfs/procfs.h,v
 | |
| retrieving revision 1.32
 | |
| retrieving revision 1.32.2.1
 | |
| diff -u -r1.32 -r1.32.2.1
 | |
| --- miscfs/procfs/procfs.h	1999/12/29 04:54:46	1.32
 | |
| +++ miscfs/procfs/procfs.h	2000/11/01 20:19:48	1.32.2.1
 | |
| @@ -95,6 +95,13 @@
 | |
|  			((type) + 2) : \
 | |
|  			((((pid)+1) << 4) + ((int) (type))))
 | |
|  
 | |
| +#define CHECKIO(p1, p2) \
 | |
| +     ((((p1)->p_cred->pc_ucred->cr_uid == (p2)->p_cred->p_ruid) && \
 | |
| +       ((p1)->p_cred->p_ruid == (p2)->p_cred->p_ruid) && \
 | |
| +       ((p1)->p_cred->p_svuid == (p2)->p_cred->p_ruid) && \
 | |
| +       ((p2)->p_flag & P_SUGID) == 0) || \
 | |
| +      (suser_xxx((p1)->p_cred->pc_ucred, (p1), PRISON_ROOT) == 0))
 | |
| +
 | |
|  /*
 | |
|   * Convert between pfsnode vnode
 | |
|   */
 | |
| Index: miscfs/procfs/procfs_ctl.c
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/sys/miscfs/procfs/procfs_ctl.c,v
 | |
| retrieving revision 1.20
 | |
| retrieving revision 1.20.2.1
 | |
| diff -u -r1.20 -r1.20.2.1
 | |
| --- miscfs/procfs/procfs_ctl.c	1999/12/08 08:59:36	1.20
 | |
| +++ miscfs/procfs/procfs_ctl.c	2000/12/17 03:13:05	1.20.2.1
 | |
| @@ -111,6 +111,20 @@
 | |
|  	int error;
 | |
|  
 | |
|  	/*
 | |
| +	 * Authorization check: rely on normal debugging protection, except
 | |
| +	 * allow processes to disengage debugging on a process onto which
 | |
| +	 * they have previously attached, but no longer have permission to
 | |
| +	 * debug.
 | |
| +	 */
 | |
| +	if (op != PROCFS_CTL_DETACH) {
 | |
| +		if (securelevel > 0 && p->p_pid == 1)
 | |
| +			return (EPERM);
 | |
| +
 | |
| +		if (!CHECKIO(curp, p) || p_trespass(curp, p))
 | |
| +			return (EPERM);
 | |
| +	}
 | |
| +
 | |
| +	/*
 | |
|  	 * Attach - attaches the target process for debugging
 | |
|  	 * by the calling process.
 | |
|  	 */
 | |
| @@ -122,10 +136,6 @@
 | |
|  		/* can't trace yourself! */
 | |
|  		if (p->p_pid == curp->p_pid)
 | |
|  			return (EINVAL);
 | |
| -
 | |
| -		/* can't trace init when securelevel > 0 */
 | |
| -		if (securelevel > 0 && p->p_pid == 1)
 | |
| -			return (EPERM);
 | |
|  
 | |
|  		/*
 | |
|  		 * Go ahead and set the trace flag.
 | |
| Index: miscfs/procfs/procfs_dbregs.c
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/sys/miscfs/procfs/procfs_dbregs.c,v
 | |
| retrieving revision 1.4
 | |
| retrieving revision 1.4.2.1
 | |
| diff -u -r1.4 -r1.4.2.1
 | |
| --- miscfs/procfs/procfs_dbregs.c	1999/12/08 08:59:36	1.4
 | |
| +++ miscfs/procfs/procfs_dbregs.c	2000/11/01 20:19:48	1.4.2.1
 | |
| @@ -62,7 +62,7 @@
 | |
|  	char *kv;
 | |
|  	int kl;
 | |
|  
 | |
| -	if (p_trespass(curp, p))
 | |
| +	if (!CHECKIO(curp, p) || p_trespass(curp, p))
 | |
|  		return (EPERM);
 | |
|  	kl = sizeof(r);
 | |
|  	kv = (char *) &r;
 | |
| Index: miscfs/procfs/procfs_fpregs.c
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/sys/miscfs/procfs/procfs_fpregs.c,v
 | |
| retrieving revision 1.11
 | |
| retrieving revision 1.11.2.1
 | |
| diff -u -r1.11 -r1.11.2.1
 | |
| --- miscfs/procfs/procfs_fpregs.c	1999/12/08 08:59:37	1.11
 | |
| +++ miscfs/procfs/procfs_fpregs.c	2000/11/01 20:19:48	1.11.2.1
 | |
| @@ -59,7 +59,7 @@
 | |
|  	char *kv;
 | |
|  	int kl;
 | |
|  
 | |
| -	if (p_trespass(curp, p))
 | |
| +	if (!CHECKIO(curp, p) || p_trespass(curp, p))
 | |
|  		return EPERM;
 | |
|  	kl = sizeof(r);
 | |
|  	kv = (char *) &r;
 | |
| Index: miscfs/procfs/procfs_mem.c
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/sys/miscfs/procfs/procfs_mem.c,v
 | |
| retrieving revision 1.46
 | |
| retrieving revision 1.46.2.1
 | |
| diff -u -r1.46 -r1.46.2.1
 | |
| --- miscfs/procfs/procfs_mem.c	1999/12/20 18:26:58	1.46
 | |
| +++ miscfs/procfs/procfs_mem.c	2000/11/01 20:19:48	1.46.2.1
 | |
| @@ -256,7 +256,7 @@
 | |
|   	 * All in all, quite yucky.
 | |
|   	 */
 | |
|   
 | |
| - 	if (p_trespass(curp, p) &&
 | |
| + 	if ((!CHECKIO(curp, p) || p_trespass(curp, p)) &&
 | |
|  	    !(uio->uio_rw == UIO_READ &&
 | |
|  	      procfs_kmemaccess(curp)))
 | |
|   		return EPERM;
 | |
| Index: miscfs/procfs/procfs_regs.c
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/sys/miscfs/procfs/procfs_regs.c,v
 | |
| retrieving revision 1.10
 | |
| retrieving revision 1.10.2.1
 | |
| diff -u -r1.10 -r1.10.2.1
 | |
| --- miscfs/procfs/procfs_regs.c	1999/11/21 19:03:19	1.10
 | |
| +++ miscfs/procfs/procfs_regs.c	2000/11/01 20:19:48	1.10.2.1
 | |
| @@ -60,7 +60,7 @@
 | |
|  	char *kv;
 | |
|  	int kl;
 | |
|  
 | |
| -	if (p_trespass(curp, p))
 | |
| +	if (!CHECKIO(curp, p) || p_trespass(curp, p))
 | |
|  		return EPERM;
 | |
|  	kl = sizeof(r);
 | |
|  	kv = (char *) &r;
 | |
| Index: miscfs/procfs/procfs_status.c
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/sys/miscfs/procfs/procfs_status.c,v
 | |
| retrieving revision 1.20
 | |
| retrieving revision 1.20.2.3
 | |
| diff -u -r1.20 -r1.20.2.3
 | |
| --- miscfs/procfs/procfs_status.c	1999/12/27 16:03:38	1.20
 | |
| +++ miscfs/procfs/procfs_status.c	2000/11/16 13:50:00	1.20.2.3
 | |
| @@ -55,6 +55,7 @@
 | |
|  #include <vm/vm_param.h>
 | |
|  #include <sys/exec.h>
 | |
|  
 | |
| +#define DOCHECK() do { if (ps >= psbuf+sizeof(psbuf)) goto bailout; } while (0)
 | |
|  int
 | |
|  procfs_dostatus(curp, p, pfs, uio)
 | |
|  	struct proc *curp;
 | |
| @@ -71,7 +72,7 @@
 | |
|  	int i;
 | |
|  	int xlen;
 | |
|  	int error;
 | |
| -	char psbuf[256];		/* XXX - conservative */
 | |
| +	char psbuf[256];	/* XXX - conservative */
 | |
|  
 | |
|  	if (uio->uio_rw != UIO_READ)
 | |
|  		return (EOPNOTSUPP);
 | |
| @@ -85,62 +86,85 @@
 | |
|  /* comm pid ppid pgid sid maj,min ctty,sldr start ut st wmsg 
 | |
|                                  euid ruid rgid,egid,groups[1 .. NGROUPS]
 | |
|  */
 | |
| +	KASSERT(sizeof(psbuf) > MAXCOMLEN,
 | |
| +			("Too short buffer for new MAXCOMLEN"));
 | |
| +
 | |
|  	ps = psbuf;
 | |
|  	bcopy(p->p_comm, ps, MAXCOMLEN);
 | |
|  	ps[MAXCOMLEN] = '\0';
 | |
|  	ps += strlen(ps);
 | |
| -	ps += sprintf(ps, " %d %d %d %d ", pid, ppid, pgid, sid);
 | |
| -
 | |
| +	DOCHECK();
 | |
| +	ps += snprintf(ps, psbuf + sizeof(psbuf) - ps,
 | |
| +	    " %d %d %d %d ", pid, ppid, pgid, sid);
 | |
| +	DOCHECK();
 | |
|  	if ((p->p_flag&P_CONTROLT) && (tp = sess->s_ttyp))
 | |
| -		ps += sprintf(ps, "%d,%d ", major(tp->t_dev), minor(tp->t_dev));
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps,
 | |
| +		    "%d,%d ", major(tp->t_dev), minor(tp->t_dev));
 | |
|  	else
 | |
| -		ps += sprintf(ps, "%d,%d ", -1, -1);
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps,
 | |
| +		    "%d,%d ", -1, -1);
 | |
| +	DOCHECK();
 | |
|  
 | |
|  	sep = "";
 | |
|  	if (sess->s_ttyvp) {
 | |
| -		ps += sprintf(ps, "%sctty", sep);
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps, "%sctty", sep);
 | |
|  		sep = ",";
 | |
| +		DOCHECK();
 | |
|  	}
 | |
|  	if (SESS_LEADER(p)) {
 | |
| -		ps += sprintf(ps, "%ssldr", sep);
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps, "%ssldr", sep);
 | |
|  		sep = ",";
 | |
| +		DOCHECK();
 | |
| +	}
 | |
| +	if (*sep != ',') {
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps, "noflags");
 | |
| +		DOCHECK();
 | |
|  	}
 | |
| -	if (*sep != ',')
 | |
| -		ps += sprintf(ps, "noflags");
 | |
|  
 | |
|  	if (p->p_flag & P_INMEM) {
 | |
|  		struct timeval ut, st;
 | |
|  
 | |
|  		calcru(p, &ut, &st, (struct timeval *) NULL);
 | |
| -		ps += sprintf(ps, " %ld,%ld %ld,%ld %ld,%ld",
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps,
 | |
| +		    " %ld,%ld %ld,%ld %ld,%ld",
 | |
|  		    p->p_stats->p_start.tv_sec,
 | |
|  		    p->p_stats->p_start.tv_usec,
 | |
|  		    ut.tv_sec, ut.tv_usec,
 | |
|  		    st.tv_sec, st.tv_usec);
 | |
|  	} else
 | |
| -		ps += sprintf(ps, " -1,-1 -1,-1 -1,-1");
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps,
 | |
| +		    " -1,-1 -1,-1 -1,-1");
 | |
| +	DOCHECK();
 | |
|  
 | |
| -	ps += sprintf(ps, " %s",
 | |
| +	ps += snprintf(ps, psbuf + sizeof(psbuf) - ps, " %s",
 | |
|  		(p->p_wchan && p->p_wmesg) ? p->p_wmesg : "nochan");
 | |
| +	DOCHECK();
 | |
|  
 | |
|  	cr = p->p_ucred;
 | |
|  
 | |
| -	ps += sprintf(ps, " %lu %lu %lu", 
 | |
| +	ps += snprintf(ps, psbuf + sizeof(psbuf) - ps, " %lu %lu %lu", 
 | |
|  		(u_long)cr->cr_uid,
 | |
|  		(u_long)p->p_cred->p_ruid,
 | |
|  		(u_long)p->p_cred->p_rgid);
 | |
| +	DOCHECK();
 | |
|  
 | |
|  	/* egid (p->p_cred->p_svgid) is equal to cr_ngroups[0] 
 | |
|  	   see also getegid(2) in /sys/kern/kern_prot.c */
 | |
|  
 | |
| -	for (i = 0; i < cr->cr_ngroups; i++)
 | |
| -		ps += sprintf(ps, ",%lu", (u_long)cr->cr_groups[i]);
 | |
| +	for (i = 0; i < cr->cr_ngroups; i++) {
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps,
 | |
| +		    ",%lu", (u_long)cr->cr_groups[i]);
 | |
| +		DOCHECK();
 | |
| +	}
 | |
|  
 | |
|  	if (p->p_prison)
 | |
| -		ps += sprintf(ps, " %s", p->p_prison->pr_host);
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps,
 | |
| +		    " %s", p->p_prison->pr_host);
 | |
|  	else
 | |
| -		ps += sprintf(ps, " -");
 | |
| -	ps += sprintf(ps, "\n");
 | |
| +		ps += snprintf(ps, psbuf + sizeof(psbuf) - ps, " -");
 | |
| +	DOCHECK();
 | |
| +	ps += snprintf(ps, psbuf + sizeof(psbuf) - ps, "\n");
 | |
| +	DOCHECK();
 | |
|  
 | |
|  	xlen = ps - psbuf;
 | |
|  	xlen -= uio->uio_offset;
 | |
| @@ -152,6 +176,9 @@
 | |
|  		error = uiomove(ps, xlen, uio);
 | |
|  
 | |
|  	return (error);
 | |
| +
 | |
| +bailout:
 | |
| +	return (ENOMEM);
 | |
|  }
 | |
|  
 | |
|  int
 | |
| @@ -183,7 +210,8 @@
 | |
|  	 * Linux behaviour is to return zero-length in this case.
 | |
|  	 */
 | |
|  
 | |
| -	if (p->p_args && (ps_argsopen ||!p_trespass(curp, p))) {
 | |
| +	if (p->p_args &&
 | |
| +	    (ps_argsopen || (CHECKIO(curp, p) && !p_trespass(curp, p)))) {
 | |
|  		bp = p->p_args->ar_args;
 | |
|  		buflen = p->p_args->ar_length;
 | |
|  		buf = 0;
 | |
| Index: miscfs/procfs/procfs_vnops.c
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/sys/miscfs/procfs/procfs_vnops.c,v
 | |
| retrieving revision 1.76.2.1
 | |
| retrieving revision 1.76.2.3
 | |
| diff -u -r1.76.2.1 -r1.76.2.3
 | |
| --- miscfs/procfs/procfs_vnops.c	2000/06/21 09:33:43	1.76.2.1
 | |
| +++ miscfs/procfs/procfs_vnops.c	2000/11/07 23:40:07	1.76.2.3
 | |
| @@ -148,7 +148,7 @@
 | |
|  			return (EBUSY);
 | |
|  
 | |
|  		p1 = ap->a_p;
 | |
| -		if (p_trespass(p1, p2) &&
 | |
| +		if ((!CHECKIO(p1, p2) || p_trespass(p1, p2)) &&
 | |
|  		    !procfs_kmemaccess(p1))
 | |
|  			return (EPERM);
 | |
|  
 | |
| @@ -240,7 +240,7 @@
 | |
|  		return ENOTTY;
 | |
|  	}
 | |
|  
 | |
| -	if (p_trespass(p, procp))
 | |
| +	if (!CHECKIO(p, procp) || p_trespass(p, procp))
 | |
|  		return EPERM;
 | |
|  
 | |
|  	switch (ap->a_command) {
 | |
| @@ -901,7 +901,7 @@
 | |
|  				dp->d_fileno = PROCFS_FILENO(p->p_pid, Pproc);
 | |
|  				dp->d_namlen = sprintf(dp->d_name, "%ld",
 | |
|  				    (long)p->p_pid);
 | |
| -				dp->d_type = DT_REG;
 | |
| +				dp->d_type = DT_DIR;
 | |
|  				p = p->p_list.le_next;
 | |
|  				break;
 | |
|  			}
 | |
| Index: i386/i386/pmap.c
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/sys/i386/i386/pmap.c,v
 | |
| retrieving revision 1.250.2.6
 | |
| retrieving revision 1.250.2.7
 | |
| diff -u -r1.250.2.6 -r1.250.2.7
 | |
| --- i386/i386/pmap.c	2000/09/30 02:49:32	1.250.2.6
 | |
| +++ i386/i386/pmap.c	2000/11/07 18:32:15	1.250.2.7
 | |
| @@ -2322,8 +2322,11 @@
 | |
|  		return;
 | |
|  	}
 | |
|  
 | |
| -	if (psize + pindex > object->size)
 | |
| +	if (psize + pindex > object->size) {
 | |
| +		if (object->size < pindex)
 | |
| +			return;		  
 | |
|  		psize = object->size - pindex;
 | |
| +	}
 | |
|  
 | |
|  	mpte = NULL;
 | |
|  	/*
 |