version 1.279, 2017/09/21 19:16:53 |
version 1.280, 2017/10/21 23:06:24 |
|
|
return result; |
return result; |
} |
} |
|
|
/* Check and prepare a domain name: removes trailing '.' and lowercases */ |
|
static void |
|
valid_domain(char *name, const char *filename, int linenum) |
|
{ |
|
size_t i, l = strlen(name); |
|
u_char c, last = '\0'; |
|
|
|
if (l == 0) |
|
fatal("%s line %d: empty hostname suffix", filename, linenum); |
|
if (!isalpha((u_char)name[0]) && !isdigit((u_char)name[0])) |
|
fatal("%s line %d: hostname suffix \"%.100s\" " |
|
"starts with invalid character", filename, linenum, name); |
|
for (i = 0; i < l; i++) { |
|
c = tolower((u_char)name[i]); |
|
name[i] = (char)c; |
|
if (last == '.' && c == '.') |
|
fatal("%s line %d: hostname suffix \"%.100s\" contains " |
|
"consecutive separators", filename, linenum, name); |
|
if (c != '.' && c != '-' && !isalnum(c) && |
|
c != '_') /* technically invalid, but common */ |
|
fatal("%s line %d: hostname suffix \"%.100s\" contains " |
|
"invalid characters", filename, linenum, name); |
|
last = c; |
|
} |
|
if (name[l - 1] == '.') |
|
name[l - 1] = '\0'; |
|
} |
|
|
|
/* |
/* |
* Returns the number of the token pointed to by cp or oBadOption. |
* Returns the number of the token pointed to by cp or oBadOption. |
*/ |
*/ |
|
|
case oCanonicalDomains: |
case oCanonicalDomains: |
value = options->num_canonical_domains != 0; |
value = options->num_canonical_domains != 0; |
while ((arg = strdelim(&s)) != NULL && *arg != '\0') { |
while ((arg = strdelim(&s)) != NULL && *arg != '\0') { |
valid_domain(arg, filename, linenum); |
const char *errstr; |
|
if (!valid_domain(arg, 1, &errstr)) { |
|
fatal("%s line %d: %s", filename, linenum, |
|
errstr); |
|
} |
if (!*activep || value) |
if (!*activep || value) |
continue; |
continue; |
if (options->num_canonical_domains >= MAX_CANON_DOMAINS) |
if (options->num_canonical_domains >= MAX_CANON_DOMAINS) |
|
|
|
|
if (first) { |
if (first) { |
/* First argument and configuration is active */ |
/* First argument and configuration is active */ |
if (parse_user_host_port(cp, &user, &host, &port) != 0) |
if (parse_ssh_uri(cp, &user, &host, &port) == -1 || |
|
parse_user_host_port(cp, &user, &host, &port) != 0) |
goto out; |
goto out; |
} else { |
} else { |
/* Subsequent argument or inactive configuration */ |
/* Subsequent argument or inactive configuration */ |
if (parse_user_host_port(cp, NULL, NULL, NULL) != 0) |
if (parse_ssh_uri(cp, NULL, NULL, NULL) == -1 || |
|
parse_user_host_port(cp, NULL, NULL, NULL) != 0) |
goto out; |
goto out; |
} |
} |
first = 0; /* only check syntax for subsequent hosts */ |
first = 0; /* only check syntax for subsequent hosts */ |
|
|
free(user); |
free(user); |
free(host); |
free(host); |
return ret; |
return ret; |
|
} |
|
|
|
int |
|
parse_ssh_uri(const char *uri, char **userp, char **hostp, int *portp) |
|
{ |
|
char *path; |
|
int r; |
|
|
|
r = parse_uri("ssh", uri, userp, hostp, portp, &path); |
|
if (r == 0 && path != NULL) |
|
r = -1; /* path not allowed */ |
|
return r; |
} |
} |
|
|
/* XXX the following is a near-vebatim copy from servconf.c; refactor */ |
/* XXX the following is a near-vebatim copy from servconf.c; refactor */ |