[PATCH] Multiple call ngx_parse_url cause index out of bounds bug

Attenuation ouyangjun1999 at gmail.com
Sun Dec 27 13:26:44 UTC 2020


Hello, I found an array index out of bounds bug in ngx_inet_add_addr()
function.
In my case, I want to use ngx_parse_url(cf->pool, u) twice to update my
address.
Consider this situation, my twice function call argument u:  u->url.data is
string
of ip address,  and then, call trace is

ngx_inet_add_addr (src/core/ngx_inet.c#L1274)
ngx_parse_inet_url (src/core/ngx_inet.c#L968)
ngx_parse_url (src/core/ngx_inet.c#L700)

In first ngx_parse_url() call, u->url.data ip address will successfully add
to u->addrs array,
and u->naddrs will  be increased to 1. And then  the second
call ngx_parse_url(),
u->url.data ip address add to u->addrs array, Because of in first call
n->naddrs was
increased to 1, so this time our update ip address will add to
u->addrs[1],  but u->addrs
array were allocated 1 * sizeof(ngx_addr_t).

src/core/ngx_inet.c#L1275  u->addrs = ngx_palloc(pool, total * nports *
sizeof(ngx_addr_t));

So the second time I call this function will cause memory error, and it may
even make the program crashes.

In order to avoid this bug, We need to check index of u->addrs.
Could you help me check where there is a problem? Thanks!

# HG changeset patch
# User Jun Ouyang <ouyangjun1999 at gmail.com>
# Date 1609070041 -28800
#      Sun Dec 27 19:54:01 2020 +0800
# Node ID 978ff553691d3fec538586cfa88e1e2b9858d4b5
# Parent  82228f955153527fba12211f52bf102c90f38dfb
Multiple call ngx_parse_url add addr to addrs array cause index out of
bounds bug

diff -r 82228f955153 -r 978ff553691d src/core/ngx_inet.c
--- a/src/core/ngx_inet.c       Tue Dec 15 17:41:39 2020 +0300
+++ b/src/core/ngx_inet.c       Sun Dec 27 19:54:01 2020 +0800
@@ -1278,6 +1278,10 @@
        }
    }

+    if (u->naddrs == nports * total) {
+        u->naddrs = 0;
+    }
+
    for (i = 0; i < nports; i++) {
        sa = ngx_pcalloc(pool, socklen);
        if (sa == NULL) {

-- 
*GPG public key: 4A6D297E6F74638E4D5F8E99152AC7B5F7608B26*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20201227/275eb8e5/attachment.htm>


More information about the nginx-devel mailing list