mirror of
https://github.com/PowerShell/openssh-portable.git
synced 2025-06-03 05:20:39 +02:00
upstream: simplify sshkey_try_load_public()
ok markus@ OpenBSD-Commit-ID: 05a5d46562aafcd70736c792208b1856064f40ad
This commit is contained in:
parent
f290ab0833
commit
d01f39304e
58
authfile.c
58
authfile.c
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user