[hackers] [libutf] reject bad runes in runelen, runetochar || Connor Lane Smith

From: <hg_AT_suckless.org>
Date: Mon, 21 May 2012 20:02:21 +0200 (CEST)

changeset: 15:bcf6cc6b9f2d
user: Connor Lane Smith <cls_AT_lubutu.com>
date: Mon May 21 17:57:46 2012 +0100
files: rune.c utf.h
description:
reject bad runes in runelen, runetochar


diff -r 1d508c1d1549 -r bcf6cc6b9f2d rune.c
--- a/rune.c Mon May 21 15:29:42 2012 +0100
+++ b/rune.c Mon May 21 17:57:46 2012 +0100
_AT_@ -4,14 +4,19 @@
 
 #define MIN(x,y) ((x) < (y) ? (x) : (y))
 
-#define UTFSEQ(x) ((((x) & 0x80) == 0x00) ? 1 /* 0xxxxxxx */ \
- : (((x) & 0xC0) == 0x80) ? 0 /* 10xxxxxx */ \
- : (((x) & 0xE0) == 0xC0) ? 2 /* 110xxxxx */ \
- : (((x) & 0xF0) == 0xE0) ? 3 /* 1110xxxx */ \
- : (((x) & 0xF8) == 0xF0) ? 4 /* 11110xxx */ \
- : (((x) & 0xFC) == 0xF8) ? 5 /* 111110xx */ \
- : (((x) & 0xFE) == 0xFC) ? 6 /* 1111110x */ \
- : 0 )
+#define UTFSEQ(x) ((((x) & 0x80) == 0x00) ? 1 /* 0xxxxxxx */ \
+ : (((x) & 0xC0) == 0x80) ? 0 /* 10xxxxxx */ \
+ : (((x) & 0xE0) == 0xC0) ? 2 /* 110xxxxx */ \
+ : (((x) & 0xF0) == 0xE0) ? 3 /* 1110xxxx */ \
+ : (((x) & 0xF8) == 0xF0) ? 4 /* 11110xxx */ \
+ : (((x) & 0xFC) == 0xF8) ? 5 /* 111110xx */ \
+ : (((x) & 0xFE) == 0xFC) ? 6 /* 1111110x */ \
+ : 0 )
+
+#define BADRUNE(x) ((x) > Runemax \
+ || ((x) & 0xFFFE) == 0xFFFE \
+ || ((x) >= 0xD800 && (x) <= 0xDFFF) \
+ || ((x) >= 0xFDD0 && (x) <= 0xFDEF))
 
 /*
  * runetochar copies one rune at p to at most UTFmax bytes starting at s and
_AT_@ -21,7 +26,7 @@
  * If the rune is illegal, runetochar will return 0.
  */
 int
-runetochar(char *s, Rune *p)
+runetochar(char *s, const Rune *p)
 {
         Rune r = *p;
 
_AT_@ -104,8 +109,7 @@
                 return 0;
 
         /* reject invalid runes and overlong sequences */
- if(n > UTFmax || r > 0x10FFFF || runelen(r) < (int)n || (r & 0xFFFE) == 0xFFFE
- || (r >= 0xD800 && r <= 0xDFFF) || (r >= 0xFDD0 && r <= 0xFDEF))
+ if(n > UTFmax || runelen(r) < (int)n || BADRUNE(r))
                 r = Runeerror;
 
         *p = r;
_AT_@ -119,16 +123,16 @@
 int
 runelen(Rune r)
 {
- if(r <= 0x7F)
+ if(BADRUNE(r))
+ return 0; /* error */
+ else if(r <= 0x7F)
                 return 1;
         else if(r <= 0x07FF)
                 return 2;
         else if(r <= 0xFFFF)
                 return 3;
- else if(r <= Runemax)
+ else
                 return 4;
- else
- return 0; /* error */
 }
 
 /*
_AT_@ -136,7 +140,7 @@
  * length len pointed to by p into UTF-8.
  */
 size_t
-runenlen(Rune *p, size_t len)
+runenlen(const Rune *p, size_t len)
 {
         size_t i, n = 0;
 
diff -r 1d508c1d1549 -r bcf6cc6b9f2d utf.h
--- a/utf.h Mon May 21 15:29:42 2012 +0100
+++ b/utf.h Mon May 21 17:57:46 2012 +0100
_AT_@ -13,10 +13,11 @@
         Runemax = 0x10FFFF /* maximum rune value */
 };
 
-int runetochar(char *, Rune *);
+int runetochar(char *, const Rune *);
 int chartorune(Rune *, const char *);
 int charntorune(Rune *, const char *, size_t);
-int runelen(Rune);
+int runelen(const Rune);
+size_t runenlen(const Rune *, size_t);
 int fullrune(const char *, size_t);
 char *utfecpy(char *, char *, const char *);
 size_t utflen(const char *);
Received on Mon May 21 2012 - 20:02:21 CEST

This archive was generated by hypermail 2.3.0 : Mon May 21 2012 - 20:12:07 CEST