svn commit: r217543 - in head/sys: amd64/amd64 i386/i386

John Baldwin jhb at FreeBSD.org
Tue Jan 18 16:43:02 UTC 2011


Author: jhb
Date: Tue Jan 18 16:43:01 2011
New Revision: 217543
URL: http://svn.freebsd.org/changeset/base/217543

Log:
  - Remove some always-true checks (checking for unsigned < 0).
  - Only check largs->num against max_ldt_segment on amd64 for I386_SET_LDT
    when descriptors are provided.  Specifically, allow the 'start == 0'
    and 'num == 0' special case used to free all LDT entries that previously
    failed with EINVAL.
  
  Submitted by:	clang via rdivacky (some of 1)
  Reviewed by:	kib

Modified:
  head/sys/amd64/amd64/sys_machdep.c
  head/sys/i386/i386/sys_machdep.c

Modified: head/sys/amd64/amd64/sys_machdep.c
==============================================================================
--- head/sys/amd64/amd64/sys_machdep.c	Tue Jan 18 16:27:40 2011	(r217542)
+++ head/sys/amd64/amd64/sys_machdep.c	Tue Jan 18 16:43:01 2011	(r217543)
@@ -95,14 +95,14 @@ sysarch_ldt(struct thread *td, struct sy
 		largs = &la;
 	} else
 		largs = (struct i386_ldt_args *)uap->parms;
-	if (largs->num > max_ldt_segment || largs->num <= 0)
-		return (EINVAL);
 
 	switch (uap->op) {
 	case I386_GET_LDT:
 		error = amd64_get_ldt(td, largs);
 		break;
 	case I386_SET_LDT:
+		if (largs->descs != NULL && largs->num > max_ldt_segment)
+			return (EINVAL);
 		set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
 		if (largs->descs != NULL) {
 			lp = (struct user_segment_descriptor *)
@@ -539,7 +539,7 @@ amd64_set_ldt(td, uap, descs)
 		/* Free descriptors */
 		if (uap->start == 0 && uap->num == 0)
 			uap->num = max_ldt_segment;
-		if (uap->num <= 0)
+		if (uap->num == 0)
 			return (EINVAL);
 		if ((pldt = mdp->md_ldt) == NULL ||
 		    uap->start >= max_ldt_segment)
@@ -559,7 +559,7 @@ amd64_set_ldt(td, uap, descs)
 		/* verify range of descriptors to modify */
 		largest_ld = uap->start + uap->num;
 		if (uap->start >= max_ldt_segment ||
-		    uap->num < 0 || largest_ld > max_ldt_segment)
+		    largest_ld > max_ldt_segment)
 			return (EINVAL);
 	}
 

Modified: head/sys/i386/i386/sys_machdep.c
==============================================================================
--- head/sys/i386/i386/sys_machdep.c	Tue Jan 18 16:27:40 2011	(r217542)
+++ head/sys/i386/i386/sys_machdep.c	Tue Jan 18 16:43:01 2011	(r217543)
@@ -623,7 +623,7 @@ i386_set_ldt(td, uap, descs)
 			uap->start = NLDT;
 			uap->num = MAX_LD - NLDT;
 		}
-		if (uap->num <= 0)
+		if (uap->num == 0)
 			return (EINVAL);
 		mtx_lock_spin(&dt_lock);
 		if ((pldt = mdp->md_ldt) == NULL ||
@@ -644,8 +644,7 @@ i386_set_ldt(td, uap, descs)
 	if (!(uap->start == LDT_AUTO_ALLOC && uap->num == 1)) {
 		/* verify range of descriptors to modify */
 		largest_ld = uap->start + uap->num;
-		if (uap->start >= MAX_LD ||
-		    uap->num < 0 || largest_ld > MAX_LD) {
+		if (uap->start >= MAX_LD || largest_ld > MAX_LD) {
 			return (EINVAL);
 		}
 	}


More information about the svn-src-all mailing list