summaryrefslogtreecommitdiff
path: root/signkey.c
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2017-05-21 18:53:09 +0800
committerMatt Johnston <matt@ucc.asn.au>2017-05-21 18:53:09 +0800
commit56107d8464861b50830e22a478eb3a5aa1656c36 (patch)
tree74ce151c758493a076df5ede32cc9dbe76fad498 /signkey.c
parent7bcb122089cdee564bbf78031f3b5cc54d8e0c20 (diff)
downloaddropbear-56107d8464861b50830e22a478eb3a5aa1656c36.tar.gz
Fix null pointer dereference found by libfuzzer
Diffstat (limited to 'signkey.c')
-rw-r--r--signkey.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/signkey.c b/signkey.c
index 2c29431..192ba18 100644
--- a/signkey.c
+++ b/signkey.c
@@ -102,7 +102,8 @@ enum signkey_type signkey_type_from_name(const char* name, unsigned int namelen)
return DROPBEAR_SIGNKEY_NONE;
}
-/* Returns a pointer to the key part specific to "type" */
+/* Returns a pointer to the key part specific to "type".
+Be sure to check both (ret != NULL) and (*ret != NULL) */
void **
signkey_key_ptr(sign_key *key, enum signkey_type type) {
switch (type) {
@@ -294,7 +295,7 @@ void buf_put_pub_key(buffer* buf, sign_key *key, enum signkey_type type) {
#if DROPBEAR_ECDSA
if (signkey_is_ecdsa(type)) {
ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
- if (eck) {
+ if (eck && *eck) {
buf_put_ecdsa_pub_key(pubkeys, *eck);
}
}
@@ -331,7 +332,7 @@ void buf_put_priv_key(buffer* buf, sign_key *key, enum signkey_type type) {
#if DROPBEAR_ECDSA
if (signkey_is_ecdsa(type)) {
ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
- if (eck) {
+ if (eck && *eck) {
buf_put_ecdsa_priv_key(buf, *eck);
TRACE(("leave buf_put_priv_key: ecdsa done"))
return;
@@ -495,7 +496,7 @@ void buf_put_sign(buffer* buf, sign_key *key, enum signkey_type type,
#if DROPBEAR_ECDSA
if (signkey_is_ecdsa(type)) {
ecc_key **eck = (ecc_key**)signkey_key_ptr(key, type);
- if (eck) {
+ if (eck && *eck) {
buf_put_ecdsa_sign(sigblob, *eck, data_buf);
}
}