upstream commit

revise sshkey_load_public(): remove ssh1 related
comments, remove extra open()/close() on keyfile, prevent leak of 'pub' if
'keyp' is NULL, replace strlcpy+cat with asprintf; ok djm@

Upstream-ID: 6175e47cab5b4794dcd99c1175549a483ec673ca
This commit is contained in:
markus@openbsd.org 2017-05-30 08:49:32 +00:00 committed by Damien Miller
parent 813f55336a
commit afbfa68fa1
1 changed files with 22 additions and 24 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: authfile.c,v 1.124 2017/04/30 23:10:43 djm Exp $ */ /* $OpenBSD: authfile.c,v 1.125 2017/05/30 08:49:32 markus Exp $ */
/* /*
* Copyright (c) 2000, 2013 Markus Friedl. All rights reserved. * Copyright (c) 2000, 2013 Markus Friedl. All rights reserved.
* *
@ -316,50 +316,48 @@ sshkey_try_load_public(struct sshkey *k, const char *filename, char **commentp)
return SSH_ERR_INVALID_FORMAT; return SSH_ERR_INVALID_FORMAT;
} }
/* load public key from ssh v1 private or any pubkey file */ /* load public key from any pubkey file */
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; struct sshkey *pub = NULL;
char file[PATH_MAX]; char *file = NULL;
int r, fd; int r;
if (keyp != NULL) if (keyp != NULL)
*keyp = NULL; *keyp = NULL;
if (commentp != NULL) if (commentp != NULL)
*commentp = NULL; *commentp = NULL;
/* XXX should load file once and attempt to parse each format */
if ((fd = open(filename, O_RDONLY)) < 0)
goto skip;
close(fd);
/* try ssh2 public key */
if ((pub = sshkey_new(KEY_UNSPEC)) == NULL) if ((pub = sshkey_new(KEY_UNSPEC)) == NULL)
return SSH_ERR_ALLOC_FAIL; return SSH_ERR_ALLOC_FAIL;
if ((r = sshkey_try_load_public(pub, filename, commentp)) == 0) { if ((r = sshkey_try_load_public(pub, filename, commentp)) == 0) {
if (keyp != NULL) if (keyp != NULL) {
*keyp = pub; *keyp = pub;
return 0; pub = NULL;
}
r = 0;
goto out;
} }
sshkey_free(pub); sshkey_free(pub);
skip:
/* try .pub suffix */ /* try .pub suffix */
if ((pub = sshkey_new(KEY_UNSPEC)) == NULL) if (asprintf(&file, "%s.pub", filename) == -1)
return SSH_ERR_ALLOC_FAIL; return SSH_ERR_ALLOC_FAIL;
r = SSH_ERR_ALLOC_FAIL; /* in case strlcpy or strlcat fail */ if ((pub = sshkey_new(KEY_UNSPEC)) == NULL) {
if ((strlcpy(file, filename, sizeof file) < sizeof(file)) && r = SSH_ERR_ALLOC_FAIL;
(strlcat(file, ".pub", sizeof file) < sizeof(file)) && goto out;
(r = sshkey_try_load_public(pub, file, commentp)) == 0) {
if (keyp != NULL)
*keyp = pub;
return 0;
} }
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); sshkey_free(pub);
return r; return r;
} }