[openssh-commits] [openssh] 01/06: upstream: factor SSH_AGENT_CONSTRAIN_EXTENSION parsing into its own
git+noreply at mindrot.org
git+noreply at mindrot.org
Wed Feb 17 15:08:51 AEDT 2021
This is an automated email from the git hooks/post-receive script.
dtucker pushed a commit to branch master
in repository openssh.
commit e04fd6dde16de1cdc5a4d9946397ff60d96568db
Author: djm at openbsd.org <djm at openbsd.org>
Date: Fri Feb 12 03:14:18 2021 +0000
upstream: factor SSH_AGENT_CONSTRAIN_EXTENSION parsing into its own
function and remove an unused variable; ok dtucker@
OpenBSD-Commit-ID: e1a938657fbf7ef0ba5e73b30365734a0cc96559
---
ssh-agent.c | 100 +++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 59 insertions(+), 41 deletions(-)
diff --git a/ssh-agent.c b/ssh-agent.c
index 9bf6b080..58fe6ddf 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-agent.c,v 1.276 2021/02/02 22:35:14 djm Exp $ */
+/* $OpenBSD: ssh-agent.c,v 1.277 2021/02/12 03:14:18 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo at cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo at cs.hut.fi>, Espoo, Finland
@@ -574,6 +574,44 @@ reaper(void)
return (deadline - now);
}
+static int
+parse_key_constraint_extension(struct sshbuf *m, char **sk_providerp)
+{
+ char *ext_name = NULL;
+ int r;
+
+ if ((r = sshbuf_get_cstring(m, &ext_name, NULL)) != 0) {
+ error_fr(r, "parse constraint extension");
+ goto out;
+ }
+ debug_f("constraint ext %s", ext_name);
+ if (strcmp(ext_name, "sk-provider at openssh.com") == 0) {
+ if (sk_providerp == NULL) {
+ error_f("%s not valid here", ext_name);
+ r = SSH_ERR_INVALID_FORMAT;
+ goto out;
+ }
+ if (*sk_providerp != NULL) {
+ error_f("%s already set", ext_name);
+ r = SSH_ERR_INVALID_FORMAT;
+ goto out;
+ }
+ if ((r = sshbuf_get_cstring(m, sk_providerp, NULL)) != 0) {
+ error_fr(r, "parse %s", ext_name);
+ goto out;
+ }
+ } else {
+ error_f("unsupported constraint \"%s\"", ext_name);
+ r = SSH_ERR_FEATURE_UNSUPPORTED;
+ goto out;
+ }
+ /* success */
+ r = 0;
+ out:
+ free(ext_name);
+ return r;
+}
+
static int
parse_key_constraints(struct sshbuf *m, struct sshkey *k, time_t *deathp,
u_int *secondsp, int *confirmp, char **sk_providerp)
@@ -581,23 +619,22 @@ parse_key_constraints(struct sshbuf *m, struct sshkey *k, time_t *deathp,
u_char ctype;
int r;
u_int seconds, maxsign = 0;
- char *ext_name = NULL;
- struct sshbuf *b = NULL;
while (sshbuf_len(m)) {
if ((r = sshbuf_get_u8(m, &ctype)) != 0) {
error_fr(r, "parse constraint type");
- goto err;
+ goto out;
}
switch (ctype) {
case SSH_AGENT_CONSTRAIN_LIFETIME:
if (*deathp != 0) {
error_f("lifetime already set");
- goto err;
+ r = SSH_ERR_INVALID_FORMAT;
+ goto out;
}
if ((r = sshbuf_get_u32(m, &seconds)) != 0) {
error_fr(r, "parse lifetime constraint");
- goto err;
+ goto out;
}
*deathp = monotime() + seconds;
*secondsp = seconds;
@@ -605,65 +642,46 @@ parse_key_constraints(struct sshbuf *m, struct sshkey *k, time_t *deathp,
case SSH_AGENT_CONSTRAIN_CONFIRM:
if (*confirmp != 0) {
error_f("confirm already set");
- goto err;
+ r = SSH_ERR_INVALID_FORMAT;
+ goto out;
}
*confirmp = 1;
break;
case SSH_AGENT_CONSTRAIN_MAXSIGN:
if (k == NULL) {
error_f("maxsign not valid here");
- goto err;
+ r = SSH_ERR_INVALID_FORMAT;
+ goto out;
}
if (maxsign != 0) {
error_f("maxsign already set");
- goto err;
+ r = SSH_ERR_INVALID_FORMAT;
+ goto out;
}
if ((r = sshbuf_get_u32(m, &maxsign)) != 0) {
error_fr(r, "parse maxsign constraint");
- goto err;
+ goto out;
}
if ((r = sshkey_enable_maxsign(k, maxsign)) != 0) {
error_fr(r, "enable maxsign");
- goto err;
+ goto out;
}
break;
case SSH_AGENT_CONSTRAIN_EXTENSION:
- if ((r = sshbuf_get_cstring(m, &ext_name, NULL)) != 0) {
- error_fr(r, "parse constraint extension");
- goto err;
- }
- debug_f("constraint ext %s", ext_name);
- if (strcmp(ext_name, "sk-provider at openssh.com") == 0) {
- if (sk_providerp == NULL) {
- error_f("%s not valid here", ext_name);
- goto err;
- }
- if (*sk_providerp != NULL) {
- error_f("%s already set", ext_name);
- goto err;
- }
- if ((r = sshbuf_get_cstring(m,
- sk_providerp, NULL)) != 0) {
- error_fr(r, "parse %s", ext_name);
- goto err;
- }
- } else {
- error_f("unsupported constraint \"%s\"",
- ext_name);
- goto err;
- }
- free(ext_name);
+ if ((r = parse_key_constraint_extension(m,
+ sk_providerp)) != 0)
+ goto out; /* error already logged */
break;
default:
error_f("Unknown constraint %d", ctype);
- err:
- free(ext_name);
- sshbuf_free(b);
- return -1;
+ r = SSH_ERR_FEATURE_UNSUPPORTED;
+ goto out;
}
}
/* success */
- return 0;
+ r = 0;
+ out:
+ return r;
}
static void
--
To stop receiving notification emails like this one, please contact
djm at mindrot.org.
More information about the openssh-commits
mailing list