version 1.82, 2018/06/07 09:26:42 |
version 1.83, 2018/06/19 02:59:41 |
|
|
* Return 0 on success. Return -1 on failure and sets *errstrp to error reason. |
* Return 0 on success. Return -1 on failure and sets *errstrp to error reason. |
*/ |
*/ |
static int |
static int |
handle_permit(const char **optsp, char ***permitsp, size_t *npermitsp, |
handle_permit(const char **optsp, int allow_bare_port, |
const char **errstrp) |
char ***permitsp, size_t *npermitsp, const char **errstrp) |
{ |
{ |
char *opt, *tmp, *cp, *host, **permits = *permitsp; |
char *opt, *tmp, *cp, *host, **permits = *permitsp; |
size_t npermits = *npermitsp; |
size_t npermits = *npermitsp; |
|
|
if ((opt = opt_dequote(optsp, &errstr)) == NULL) { |
if ((opt = opt_dequote(optsp, &errstr)) == NULL) { |
return -1; |
return -1; |
} |
} |
|
if (allow_bare_port && strchr(opt, ':') == NULL) { |
|
/* |
|
* Allow a bare port number in permitlisten to indicate a |
|
* listen_host wildcard. |
|
*/ |
|
if (asprintf(&tmp, "*:%s", opt) < 0) { |
|
*errstrp = "memory allocation failed"; |
|
return -1; |
|
} |
|
free(opt); |
|
opt = tmp; |
|
} |
if ((tmp = strdup(opt)) == NULL) { |
if ((tmp = strdup(opt)) == NULL) { |
free(opt); |
free(opt); |
*errstrp = "memory allocation failed"; |
*errstrp = "memory allocation failed"; |
|
|
} |
} |
ret->env[ret->nenv++] = opt; |
ret->env[ret->nenv++] = opt; |
} else if (opt_match(&opts, "permitopen")) { |
} else if (opt_match(&opts, "permitopen")) { |
if (handle_permit(&opts, &ret->permitopen, |
if (handle_permit(&opts, 0, &ret->permitopen, |
&ret->npermitopen, &errstr) != 0) |
&ret->npermitopen, &errstr) != 0) |
goto fail; |
goto fail; |
} else if (opt_match(&opts, "permitlisten")) { |
} else if (opt_match(&opts, "permitlisten")) { |
if (handle_permit(&opts, &ret->permitlisten, |
if (handle_permit(&opts, 1, &ret->permitlisten, |
&ret->npermitlisten, &errstr) != 0) |
&ret->npermitlisten, &errstr) != 0) |
goto fail; |
goto fail; |
} else if (opt_match(&opts, "tunnel")) { |
} else if (opt_match(&opts, "tunnel")) { |