svn commit: r287596 - head/sys/arm64/arm64

Andrew Turner andrew at FreeBSD.org
Wed Sep 9 11:51:15 UTC 2015


Author: andrew
Date: Wed Sep  9 11:51:14 2015
New Revision: 287596
URL: https://svnweb.freebsd.org/changeset/base/287596

Log:
  Rework copyinstr to:
   * Fail when the length passed in is 0
   * Remove an unneeded increment of the count on success
   * Return ENAMETOOLONG when the input pointer is too long
  
  Sponsored by:	ABT Systems Ltd

Modified:
  head/sys/arm64/arm64/copyinout.S

Modified: head/sys/arm64/arm64/copyinout.S
==============================================================================
--- head/sys/arm64/arm64/copyinout.S	Wed Sep  9 09:19:07 2015	(r287595)
+++ head/sys/arm64/arm64/copyinout.S	Wed Sep  9 11:51:14 2015	(r287596)
@@ -95,6 +95,7 @@ END(copyin)
  */
 ENTRY(copyinstr)
 	mov	x5, xzr		/* count = 0 */
+	mov	w4, #1		/* If zero return faulure */
 	cbz	x2, 3f		/* If len == 0 then skip loop */
 
 	adr	x6, copyio_fault /* Get the handler address */
@@ -102,17 +103,18 @@ ENTRY(copyinstr)
 
 1:	ldrb	w4, [x0], #1	/* Load from uaddr */
 	strb	w4, [x1], #1	/* Store in kaddr */
-	cbz	w4, 2f		/* If == 0 then break */
-	sub	x2, x2, #1	/* len-- */
 	add	x5, x5, #1	/* count++ */
+	cbz	w4, 2f		/* Break when NUL-terminated */
+	sub	x2, x2, #1	/* len-- */
 	cbnz	x2, 1b
 
 2:	SET_FAULT_HANDLER(xzr, x7) /* Clear the handler */
 
 3:	cbz	x3, 4f		/* Check if done != NULL */
-	add	x5, x5, #1	/* count++ */
 	str	x5, [x3]	/* done = count */
 
-4:	mov	x0, xzr		/* return 0 */
+4:	mov	w1, #ENAMETOOLONG /* Load ENAMETOOLONG to return if failed */
+	cmp	w4, #0		/* Check if we saved the NUL-terminator */
+	csel	w0, wzr, w1, eq	/* If so return success, else failure */
 	ret
 END(copyinstr)


More information about the svn-src-all mailing list