version 1.95, 2021/04/03 06:18:40 |
version 1.96, 2021/07/23 03:57:20 |
|
|
struct sshauthopt *ret = NULL; |
struct sshauthopt *ret = NULL; |
const char *errstr = "unknown error"; |
const char *errstr = "unknown error"; |
uint64_t valid_before; |
uint64_t valid_before; |
|
size_t i, l; |
|
|
if (errstrp != NULL) |
if (errstrp != NULL) |
*errstrp = NULL; |
*errstrp = NULL; |
|
|
valid_before < ret->valid_before) |
valid_before < ret->valid_before) |
ret->valid_before = valid_before; |
ret->valid_before = valid_before; |
} else if (opt_match(&opts, "environment")) { |
} else if (opt_match(&opts, "environment")) { |
if (ret->nenv > INT_MAX) { |
if (ret->nenv > SSH_AUTHOPT_ENV_MAX) { |
errstr = "too many environment strings"; |
errstr = "too many environment strings"; |
goto fail; |
goto fail; |
} |
} |
|
|
} |
} |
if ((cp = strdup(opt)) == NULL) |
if ((cp = strdup(opt)) == NULL) |
goto alloc_fail; |
goto alloc_fail; |
cp[tmp - opt] = '\0'; /* truncate at '=' */ |
l = (size_t)(tmp - opt); |
|
cp[l] = '\0'; /* truncate at '=' */ |
if (!valid_env_name(cp)) { |
if (!valid_env_name(cp)) { |
free(cp); |
free(cp); |
free(opt); |
free(opt); |
errstr = "invalid environment string"; |
errstr = "invalid environment string"; |
goto fail; |
goto fail; |
} |
} |
|
/* Check for duplicates; XXX O(n*log(n)) */ |
|
for (i = 0; i < ret->nenv; i++) { |
|
if (strncmp(ret->env[i], cp, l) == 0 && |
|
ret->env[i][l] == '=') |
|
break; |
|
} |
free(cp); |
free(cp); |
/* Append it. */ |
/* First match wins */ |
oarray = ret->env; |
if (i >= ret->nenv) { |
if ((ret->env = recallocarray(ret->env, ret->nenv, |
/* Append it. */ |
ret->nenv + 1, sizeof(*ret->env))) == NULL) { |
oarray = ret->env; |
free(opt); |
if ((ret->env = recallocarray(ret->env, |
ret->env = oarray; /* put it back for cleanup */ |
ret->nenv, ret->nenv + 1, |
goto alloc_fail; |
sizeof(*ret->env))) == NULL) { |
|
free(opt); |
|
/* put it back for cleanup */ |
|
ret->env = oarray; |
|
goto alloc_fail; |
|
} |
|
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, 0, &ret->permitopen, |
if (handle_permit(&opts, 0, &ret->permitopen, |
&ret->npermitopen, &errstr) != 0) |
&ret->npermitopen, &errstr) != 0) |