make agnostic, add defensive programming to bgetrune. Reference: /n/sources/patch/applied/rune4-bio Date: Thu Apr 25 00:55:34 CES 2013 Signed-off-by: geoff@plan9.bell-labs.com --- /sys/src/libbio/bgetrune.c Thu Apr 25 00:55:17 2013 +++ /sys/src/libbio/bgetrune.c Thu Apr 25 00:55:17 2013 @@ -7,7 +7,7 @@ { int c, i; Rune rune; - char str[4]; + char str[UTFmax]; c = Bgetc(bp); if(c < Runeself) { /* one char */ @@ -15,19 +15,25 @@ return c; } str[0] = c; + bp->runesize = 0; for(i=1;;) { c = Bgetc(bp); if(c < 0) return c; + if (i >= sizeof str) + return Runeerror; str[i++] = c; if(fullrune(str, i)) { + /* utf is long enough to be a rune, but could be bad. */ bp->runesize = chartorune(&rune, str); - while(i > bp->runesize) { - Bungetc(bp); - i--; - } + if (rune == Runeerror) + bp->runesize = 0; /* push back nothing */ + else + /* push back bytes unconsumed by chartorune */ + for(; i > bp->runesize; i--) + Bungetc(bp); return rune; } } --- /sys/src/libbio/bputrune.c Thu Apr 25 00:55:17 2013 +++ /sys/src/libbio/bputrune.c Thu Apr 25 00:55:17 2013 @@ -6,7 +6,7 @@ Bputrune(Biobufhdr *bp, long c) { Rune rune; - char str[4]; + char str[UTFmax]; int n; rune = c;