diff --git a/src/backend/utils/adt/inet_net_pton.c b/src/backend/utils/adt/inet_net_pton.c
index 5944327402e..92a3de8885c 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))
 	{