shithub: riscv

Download patch

ref: 490ebc54bb9b46a5719f059da6aef5b8b381eecf
parent: a2ab8fbc59a37a887569127f8cc6338b000d37e2
author: Ori Bernstein <ori@eigenstate.org>
date: Sun Feb 9 18:27:28 EST 2025

libc/idn: clean up reliance on questionable corners of seprint behavior

--- a/sys/src/libc/9sys/idn.c
+++ b/sys/src/libc/9sys/idn.c
@@ -211,12 +211,11 @@
 		if(cistrncmp(cp, "xn--", 4) == 0)
 			if((nr = punydecode(nc-4, cp+4, nelem(rb), rb)) < 0)
 				return -1;
-		if((dp = seprint(dp, de, "%.*S", nr, rb)) == nil)
-			return -1;
-		if(dp >= de)
-			return -1;
+		dp = seprint(dp, de, "%.*S", nr, rb);
 		if(cp[nc] == 0)
 			break;
+		if(dp + 1 == de)
+			return -1;
 		*dp++ = '.';
 		cp += nc+1;
 	}
@@ -256,9 +255,9 @@
 			if((dp = seprint(dp, de, "%.*s", nc, cp)) == nil)
 				return -1;
 		}else{
-			if((dp = seprint(dp, de, "xn--")) == nil)
-				return -1;
-			if((n = punyencode(nr, rb, de - dp, dp)) < 0)
+			dp = seprint(dp, de, "xn--");
+			n = punyencode(nr, rb, de - dp, dp);
+			if(n < 0 || dp+n == de)
 				return -1;
 			dp += n;
 		}
--