diff --git a/src/backend/utils/adt/inet_net_pton.c b/src/backend/utils/adt/inet_net_pton.c index 5944327402..92a3de8885 100644 --- a/src/backend/utils/adt/inet_net_pton.c +++ b/src/backend/utils/adt/inet_net_pton.c @@ -16,7 +16,7 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static const char rcsid[] = "$Id: inet_net_pton.c,v 1.3 1998/10/12 01:30:26 momjian Exp $"; +static const char rcsid[] = "$Id: inet_net_pton.c,v 1.4 1998/10/12 15:56:34 momjian Exp $"; #endif @@ -105,7 +105,8 @@ inet_net_pton_ipv4(const char *src, u_char *dst, size_t size) /* Hexadecimal: Eat nybble string. */ if (size <= 0) goto emsgsize; - *dst = 0, dirty = 0; + tmp = 0; + dirty = 0; src++; /* skip x or X. */ while ((ch = *src++) != '\0' && isascii(ch) && isxdigit(ch)) @@ -114,16 +115,20 @@ inet_net_pton_ipv4(const char *src, u_char *dst, size_t size) ch = tolower(ch); n = strchr(xdigits, ch) - xdigits; assert(n >= 0 && n <= 15); - *dst |= n; - if (!dirty++) - *dst <<= 4; - else if (--size > 0) - *++dst = 0, dirty = 0; - else - goto emsgsize; + tmp = (tmp << 4) | n; + if (++dirty == 2) { + if (size-- <= 0) + goto emsgsize; + *dst++ = (u_char) tmp; + tmp = 0, dirty = 0; + } + } + if (dirty) { + if (size-- <= 0) + goto emsgsize; + tmp <<= 4; + *dst++ = (u_char) tmp; } - if (dirty) - size--; } else if (isascii(ch) && isdigit(ch)) {