fix internal buffer overrun in inet_pton
authorRich Felker <dalias@aerifal.cx>
Mon, 23 Mar 2015 13:44:18 +0000 (09:44 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 23 Mar 2015 13:44:18 +0000 (09:44 -0400)
one stop condition for parsing abbreviated ipv6 addressed was missed,
allowing the internal ip[] buffer to overflow. this patch adds the
missing stop condition and masks the array index so that, in case
there are any remaining stop conditions missing, overflowing the
buffer is not possible.

src/network/inet_pton.c

index 4496b47b6d6ccaa20ae3dd0ec8a363f54694375d..d36c368917da58c1689e42eba8b2e9ecbd22486e 100644 (file)
@@ -39,14 +39,15 @@ int inet_pton(int af, const char *restrict s, void *restrict a0)
        for (i=0; ; i++) {
                if (s[0]==':' && brk<0) {
                        brk=i;
-                       ip[i]=0;
+                       ip[i&7]=0;
                        if (!*++s) break;
+                       if (i==7) return 0;
                        continue;
                }
                for (v=j=0; j<4 && (d=hexval(s[j]))>=0; j++)
                        v=16*v+d;
                if (j==0) return 0;
-               ip[i] = v;
+               ip[i&7] = v;
                if (!s[j] && (brk>=0 || i==7)) break;
                if (i==7) return 0;
                if (s[j]!=':') {