mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-02 03:23:12 +00:00
[BUG] str2net() must not change the const char *
str2net needs to put \0 in a const char *. Use strdup() for that.
This commit is contained in:
parent
c8d7c96b26
commit
8aeae4af23
@ -134,24 +134,30 @@ struct sockaddr_in *str2sa(char *str)
|
|||||||
*/
|
*/
|
||||||
int str2net(const char *str, struct in_addr *addr, struct in_addr *mask)
|
int str2net(const char *str, struct in_addr *addr, struct in_addr *mask)
|
||||||
{
|
{
|
||||||
char *c;
|
__label__ out_free, out_err;
|
||||||
|
char *c, *s;
|
||||||
|
int ret_val;
|
||||||
unsigned long len;
|
unsigned long len;
|
||||||
|
|
||||||
|
s = strdup(str);
|
||||||
|
if (!s)
|
||||||
|
return 0;
|
||||||
|
|
||||||
memset(mask, 0, sizeof(*mask));
|
memset(mask, 0, sizeof(*mask));
|
||||||
memset(addr, 0, sizeof(*addr));
|
memset(addr, 0, sizeof(*addr));
|
||||||
|
|
||||||
if ((c = strrchr(str, '/')) != NULL) {
|
if ((c = strrchr(s, '/')) != NULL) {
|
||||||
*c++ = '\0';
|
*c++ = '\0';
|
||||||
/* c points to the mask */
|
/* c points to the mask */
|
||||||
if (strchr(c, '.') != NULL) { /* dotted notation */
|
if (strchr(c, '.') != NULL) { /* dotted notation */
|
||||||
if (!inet_pton(AF_INET, c, mask))
|
if (!inet_pton(AF_INET, c, mask))
|
||||||
return 0;
|
goto out_err;
|
||||||
}
|
}
|
||||||
else { /* mask length */
|
else { /* mask length */
|
||||||
char *err;
|
char *err;
|
||||||
len = strtol(c, &err, 10);
|
len = strtol(c, &err, 10);
|
||||||
if (!*c || (err && *err) || (unsigned)len > 32)
|
if (!*c || (err && *err) || (unsigned)len > 32)
|
||||||
return 0;
|
goto out_err;
|
||||||
if (len)
|
if (len)
|
||||||
mask->s_addr = htonl(~0UL << (32 - len));
|
mask->s_addr = htonl(~0UL << (32 - len));
|
||||||
else
|
else
|
||||||
@ -161,16 +167,23 @@ int str2net(const char *str, struct in_addr *addr, struct in_addr *mask)
|
|||||||
else {
|
else {
|
||||||
mask->s_addr = ~0U;
|
mask->s_addr = ~0U;
|
||||||
}
|
}
|
||||||
if (!inet_pton(AF_INET, str, addr)) {
|
if (!inet_pton(AF_INET, s, addr)) {
|
||||||
struct hostent *he;
|
struct hostent *he;
|
||||||
|
|
||||||
if ((he = gethostbyname(str)) == NULL) {
|
if ((he = gethostbyname(s)) == NULL) {
|
||||||
return 0;
|
goto out_err;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*addr = *(struct in_addr *) *(he->h_addr_list);
|
*addr = *(struct in_addr *) *(he->h_addr_list);
|
||||||
}
|
}
|
||||||
return 1;
|
|
||||||
|
ret_val = 1;
|
||||||
|
out_free:
|
||||||
|
free(s);
|
||||||
|
return ret_val;
|
||||||
|
out_err:
|
||||||
|
ret_val = 0;
|
||||||
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* will try to encode the string <string> replacing all characters tagged in
|
/* will try to encode the string <string> replacing all characters tagged in
|
||||||
|
Loading…
Reference in New Issue
Block a user