Fix inet_pton by passing in base instead of getting it out (#557)

This commit is contained in:
Vicki Pfau 2021-06-24 13:21:27 -07:00 committed by fincs
parent 3c9a623b24
commit 0aba35b3ed

View File

@ -10,7 +10,7 @@ const struct in6_addr in6addr_any = {0};
const struct in6_addr in6addr_loopback = {.__u6_addr32 = {0, 0, 0, __builtin_bswap32(1)}}; const struct in6_addr in6addr_loopback = {.__u6_addr32 = {0, 0, 0, __builtin_bswap32(1)}};
// Adapted from libctru // Adapted from libctru
static int _inetAtonDetail(int *outBase, size_t *outNumBytes, const char *cp, struct in_addr *inp) { static int _inetAtonDetail(int inBase, size_t *outNumBytes, const char *cp, struct in_addr *inp) {
int base; int base;
uint32_t val; uint32_t val;
int c; int c;
@ -22,14 +22,17 @@ static int _inetAtonDetail(int *outBase, size_t *outNumBytes, const char *cp, st
if(!isdigit(c)) return 0; if(!isdigit(c)) return 0;
val = 0; val = 0;
base = 10; base = inBase;
if(c == '0') { if(!base) {
c = *++cp; base = 10;
if(c == 'x' || c == 'X') { if(c == '0') {
base = 16;
c = *++cp; c = *++cp;
if(c == 'x' || c == 'X') {
base = 16;
c = *++cp;
}
else base = 8;
} }
else base = 8;
} }
for(;;) { for(;;) {
@ -58,7 +61,6 @@ static int _inetAtonDetail(int *outBase, size_t *outNumBytes, const char *cp, st
if(c != 0) { if(c != 0) {
*outNumBytes = num_bytes; *outNumBytes = num_bytes;
*outBase = base;
return 0; return 0;
} }
@ -89,7 +91,6 @@ static int _inetAtonDetail(int *outBase, size_t *outNumBytes, const char *cp, st
inp->s_addr = htonl(val); inp->s_addr = htonl(val);
*outNumBytes = num_bytes; *outNumBytes = num_bytes;
*outBase = base;
return 1; return 1;
} }
@ -127,11 +128,10 @@ static const char *inet_ntop4(const void *src, char *dst, socklen_t size) {
} }
static int inet_pton4(const char *src, void *dst) { static int inet_pton4(const char *src, void *dst) {
int base;
size_t numBytes; size_t numBytes;
int ret = _inetAtonDetail(&base, &numBytes, src, (struct in_addr *)dst); int ret = _inetAtonDetail(10, &numBytes, src, (struct in_addr *)dst);
return (ret == 1 && base == 10 && numBytes == 3) ? 1 : 0; return (ret == 1 && numBytes == 3) ? 1 : 0;
} }
/* Copyright (c) 1996 by Internet Software Consortium. /* Copyright (c) 1996 by Internet Software Consortium.
@ -392,9 +392,8 @@ char *inet_ntoa(struct in_addr in) {
} }
int inet_aton(const char *cp, struct in_addr *inp) { int inet_aton(const char *cp, struct in_addr *inp) {
int base;
size_t numBytes; size_t numBytes;
return _inetAtonDetail(&base, &numBytes, cp, inp); return _inetAtonDetail(0, &numBytes, cp, inp);
} }
in_addr_t inet_addr(const char *cp) { in_addr_t inet_addr(const char *cp) {