Fix bug of n in function of ngx_utf8_length

Maxim Dounin mdounin at mdounin.ru
Fri Apr 12 16:42:53 UTC 2019


Hello!

On Wed, Apr 10, 2019 at 07:56:26PM +0000, liu yunbin wrote:

> # HG changeset patch
> # User Yunbin Liu yunbinliu at outlook.com
> # Date 1554925873 -28800
> #      Thu Apr 11 03:51:13 2019 +0800
> # Node ID 228b945cf5f8c30356fc5760f696e49545075f00
> # Parent  a6e23e343081b79eb924da985a414909310aa7a3
> Fix bug of n in function of ngx_utf8_length
> 
> diff -r a6e23e343081 -r 228b945cf5f8 src/core/ngx_string.c
> --- a/src/core/ngx_string.c Tue Apr 09 16:00:30 2019 +0300
> +++ b/src/core/ngx_string.c Thu Apr 11 03:51:13 2019 +0800
> @@ -1369,6 +1369,7 @@
>  {
>      u_char  c, *last;
>      size_t  len;
> +    u_char *current_point;
> 
>      last = p + n;
> 
> @@ -1378,13 +1379,16 @@
> 
>          if (c < 0x80) {
>              p++;
> +            n--;
>              continue;
>          }
> 
> +        current_point = p;
>          if (ngx_utf8_decode(&p, n) > 0x10ffff) {
>              /* invalid UTF-8 */
>              return n;
>          }
> +        n -= p - current_point;
>      }
> 
>      return len;

Thanks for the report, this looks like a valid bug (though never 
triggered with current code).  A simplier patch should be 
something like this:

# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1555087201 -10800
#      Fri Apr 12 19:40:01 2019 +0300
# Node ID 7c02edae85e317346d5cef2d9d10d6ce23ed432c
# Parent  a6e23e343081b79eb924da985a414909310aa7a3
Fixed incorrect length handling in ngx_utf8_length().

Previously, ngx_utf8_decode() was called from ngx_utf8_length() with
incorrect length, potentially resulting in out-of-bounds read when
handling invalid UTF-8 strings.

In practice out-of-bounds reads are not possible though, as autoindex, the
only user of ngx_utf8_length(), provides null-terminated strings, and
ngx_utf8_decode() anyway returns an errors when it sees a null in the
middle of an UTF-8 sequence.

Reported by Yunbin Liu.

diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -1381,7 +1381,7 @@ ngx_utf8_length(u_char *p, size_t n)
             continue;
         }
 
-        if (ngx_utf8_decode(&p, n) > 0x10ffff) {
+        if (ngx_utf8_decode(&p, last - p) > 0x10ffff) {
             /* invalid UTF-8 */
             return n;
         }


-- 
Maxim Dounin
http://mdounin.ru/


More information about the nginx mailing list