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 changed files with 19 additions and 39 deletions

View File

@ -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.
*
@ -195,17 +195,24 @@ sshkey_load_private(const char *filename, const char *passphrase,
}
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;
char *line = NULL, *cp;
size_t linesize = 0;
int r;
struct sshkey *k = NULL;
*kp = NULL;
if (commentp != NULL)
*commentp = NULL;
if ((f = fopen(filename, "r")) == NULL)
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) {
cp = line;
switch (*cp) {
@ -230,12 +237,15 @@ sshkey_try_load_public(struct sshkey *k, const char *filename, char **commentp)
if (*commentp == NULL)
r = SSH_ERR_ALLOC_FAIL;
}
/* success */
*kp = k;
free(line);
fclose(f);
return r;
}
}
}
free(k);
free(line);
fclose(f);
return SSH_ERR_INVALID_FORMAT;
@ -245,8 +255,7 @@ sshkey_try_load_public(struct sshkey *k, const char *filename, char **commentp)
int
sshkey_load_public(const char *filename, struct sshkey **keyp, char **commentp)
{
struct sshkey *pub = NULL;
char *file = NULL;
char *pubfile = NULL;
int r;
if (keyp != NULL)
@ -254,35 +263,17 @@ sshkey_load_public(const char *filename, struct sshkey **keyp, char **commentp)
if (commentp != NULL)
*commentp = NULL;
if ((pub = sshkey_new(KEY_UNSPEC)) == NULL)
return SSH_ERR_ALLOC_FAIL;
if ((r = sshkey_try_load_public(pub, filename, commentp)) == 0) {
if (keyp != NULL) {
*keyp = pub;
pub = NULL;
}
r = 0;
if ((r = sshkey_try_load_public(keyp, filename, commentp)) == 0)
goto out;
}
sshkey_free(pub);
/* try .pub suffix */
if (asprintf(&file, "%s.pub", filename) == -1)
if (asprintf(&pubfile, "%s.pub", filename) == -1)
return SSH_ERR_ALLOC_FAIL;
if ((pub = sshkey_new(KEY_UNSPEC)) == NULL) {
r = SSH_ERR_ALLOC_FAIL;
if ((r = sshkey_try_load_public(keyp, pubfile, commentp)) == 0)
goto out;
}
if ((r = sshkey_try_load_public(pub, file, commentp)) == 0) {
if (keyp != NULL) {
*keyp = pub;
pub = NULL;
}
r = 0;
}
out:
free(file);
sshkey_free(pub);
free(pubfile);
return r;
}
@ -300,18 +291,7 @@ sshkey_load_cert(const char *filename, struct sshkey **keyp)
if (asprintf(&file, "%s-cert.pub", filename) == -1)
return SSH_ERR_ALLOC_FAIL;
if ((pub = sshkey_new(KEY_UNSPEC)) == 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:
r = sshkey_try_load_public(keyp, file, NULL);
free(file);
sshkey_free(pub);
return r;