upstream: simplify sshkey_try_load_public()

ok markus@

OpenBSD-Commit-ID: 05a5d46562aafcd70736c792208b1856064f40ad
This commit is contained in:
djm@openbsd.org 2020-04-08 00:09:24 +00:00 committed by Damien Miller
parent f290ab0833
commit d01f39304e

@ -1,4 +1,4 @@
/* $OpenBSD: authfile.c,v 1.137 2020/01/25 23:02:13 djm Exp $ */ /* $OpenBSD: authfile.c,v 1.138 2020/04/08 00:09:24 djm Exp $ */
/* /*
* Copyright (c) 2000, 2013 Markus Friedl. All rights reserved. * Copyright (c) 2000, 2013 Markus Friedl. All rights reserved.
* *
@ -195,17 +195,24 @@ sshkey_load_private(const char *filename, const char *passphrase,
} }
static int static int
sshkey_try_load_public(struct sshkey *k, const char *filename, char **commentp) sshkey_try_load_public(struct sshkey **kp, const char *filename,
char **commentp)
{ {
FILE *f; FILE *f;
char *line = NULL, *cp; char *line = NULL, *cp;
size_t linesize = 0; size_t linesize = 0;
int r; int r;
struct sshkey *k = NULL;
*kp = NULL;
if (commentp != NULL) if (commentp != NULL)
*commentp = NULL; *commentp = NULL;
if ((f = fopen(filename, "r")) == NULL) if ((f = fopen(filename, "r")) == NULL)
return SSH_ERR_SYSTEM_ERROR; return SSH_ERR_SYSTEM_ERROR;
if ((k = sshkey_new(KEY_UNSPEC)) == NULL) {
fclose(f);
return SSH_ERR_ALLOC_FAIL;
}
while (getline(&line, &linesize, f) != -1) { while (getline(&line, &linesize, f) != -1) {
cp = line; cp = line;
switch (*cp) { switch (*cp) {
@ -230,12 +237,15 @@ sshkey_try_load_public(struct sshkey *k, const char *filename, char **commentp)
if (*commentp == NULL) if (*commentp == NULL)
r = SSH_ERR_ALLOC_FAIL; r = SSH_ERR_ALLOC_FAIL;
} }
/* success */
*kp = k;
free(line); free(line);
fclose(f); fclose(f);
return r; return r;
} }
} }
} }
free(k);
free(line); free(line);
fclose(f); fclose(f);
return SSH_ERR_INVALID_FORMAT; return SSH_ERR_INVALID_FORMAT;
@ -245,8 +255,7 @@ sshkey_try_load_public(struct sshkey *k, const char *filename, char **commentp)
int int
sshkey_load_public(const char *filename, struct sshkey **keyp, char **commentp) sshkey_load_public(const char *filename, struct sshkey **keyp, char **commentp)
{ {
struct sshkey *pub = NULL; char *pubfile = NULL;
char *file = NULL;
int r; int r;
if (keyp != NULL) if (keyp != NULL)
@ -254,35 +263,17 @@ sshkey_load_public(const char *filename, struct sshkey **keyp, char **commentp)
if (commentp != NULL) if (commentp != NULL)
*commentp = NULL; *commentp = NULL;
if ((pub = sshkey_new(KEY_UNSPEC)) == NULL) if ((r = sshkey_try_load_public(keyp, filename, commentp)) == 0)
return SSH_ERR_ALLOC_FAIL;
if ((r = sshkey_try_load_public(pub, filename, commentp)) == 0) {
if (keyp != NULL) {
*keyp = pub;
pub = NULL;
}
r = 0;
goto out; goto out;
}
sshkey_free(pub);
/* try .pub suffix */ /* try .pub suffix */
if (asprintf(&file, "%s.pub", filename) == -1) if (asprintf(&pubfile, "%s.pub", filename) == -1)
return SSH_ERR_ALLOC_FAIL; return SSH_ERR_ALLOC_FAIL;
if ((pub = sshkey_new(KEY_UNSPEC)) == NULL) { if ((r = sshkey_try_load_public(keyp, pubfile, commentp)) == 0)
r = SSH_ERR_ALLOC_FAIL;
goto out; goto out;
}
if ((r = sshkey_try_load_public(pub, file, commentp)) == 0) {
if (keyp != NULL) {
*keyp = pub;
pub = NULL;
}
r = 0;
}
out: out:
free(file); free(pubfile);
sshkey_free(pub);
return r; return r;
} }
@ -300,18 +291,7 @@ sshkey_load_cert(const char *filename, struct sshkey **keyp)
if (asprintf(&file, "%s-cert.pub", filename) == -1) if (asprintf(&file, "%s-cert.pub", filename) == -1)
return SSH_ERR_ALLOC_FAIL; return SSH_ERR_ALLOC_FAIL;
if ((pub = sshkey_new(KEY_UNSPEC)) == NULL) { r = sshkey_try_load_public(keyp, file, NULL);
goto out;
}
if ((r = sshkey_try_load_public(pub, file, NULL)) != 0)
goto out;
/* success */
if (keyp != NULL) {
*keyp = pub;
pub = NULL;
}
r = 0;
out:
free(file); free(file);
sshkey_free(pub); sshkey_free(pub);
return r; return r;