Support IPv6 numeric style addresses, example [2001:10:300::1]:88
This commit is contained in:
@@ -186,7 +186,7 @@ static struct krb5_krbhst_info*
|
|||||||
parse_hostspec(krb5_context context, struct krb5_krbhst_data *kd,
|
parse_hostspec(krb5_context context, struct krb5_krbhst_data *kd,
|
||||||
const char *spec, int def_port, int port)
|
const char *spec, int def_port, int port)
|
||||||
{
|
{
|
||||||
const char *p = spec;
|
const char *p = spec, *q;
|
||||||
struct krb5_krbhst_info *hi;
|
struct krb5_krbhst_info *hi;
|
||||||
|
|
||||||
hi = calloc(1, sizeof(*hi) + strlen(spec));
|
hi = calloc(1, sizeof(*hi) + strlen(spec));
|
||||||
@@ -209,7 +209,17 @@ parse_hostspec(krb5_context context, struct krb5_krbhst_data *kd,
|
|||||||
p += 4;
|
p += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strsep_copy(&p, ":", hi->hostname, strlen(spec) + 1) < 0) {
|
if (p[0] == '[' && (q = strchr(p, ']')) != NULL) {
|
||||||
|
/* if address looks like [foo:bar] or [foo:bar]: its a ipv6
|
||||||
|
adress, strip of [] */
|
||||||
|
memcpy(hi->hostname, &p[1], q - p - 1);
|
||||||
|
hi->hostname[q - p - 1] = '\0';
|
||||||
|
p = q + 1;
|
||||||
|
/* get trailing : */
|
||||||
|
if (p[0] == ':')
|
||||||
|
p++;
|
||||||
|
} else if(strsep_copy(&p, ":", hi->hostname, strlen(spec) + 1) < 0) {
|
||||||
|
/* copy everything before : */
|
||||||
free(hi);
|
free(hi);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -218,7 +228,7 @@ parse_hostspec(krb5_context context, struct krb5_krbhst_data *kd,
|
|||||||
strlwr(hi->hostname);
|
strlwr(hi->hostname);
|
||||||
|
|
||||||
hi->port = hi->def_port = def_port;
|
hi->port = hi->def_port = def_port;
|
||||||
if(p != NULL) {
|
if(p != NULL && p[0]) {
|
||||||
char *end;
|
char *end;
|
||||||
hi->port = strtol(p, &end, 0);
|
hi->port = strtol(p, &end, 0);
|
||||||
if(end == p) {
|
if(end == p) {
|
||||||
|
Reference in New Issue
Block a user