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;
}
--
⑨