diff options
author | Werner Koch <[email protected]> | 2017-12-13 09:52:34 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2017-12-13 09:52:34 +0000 |
commit | cd26c5482b10bee7658959ae913f2ddb83190587 (patch) | |
tree | f57eb9c03f12f92eb15fd41485e04c5dc680993b | |
parent | gpg: Remove some xmallocs. (diff) | |
download | gnupg-cd26c5482b10bee7658959ae913f2ddb83190587.tar.gz gnupg-cd26c5482b10bee7658959ae913f2ddb83190587.zip |
gpg: Return an error from hexfingerprint on malloc error.
* g10/keyid.c (hexfingerprint): Return NULL on malloc failure. Chnage
all callers.
Signed-off-by: Werner Koch <[email protected]>
-rw-r--r-- | g10/export.c | 5 | ||||
-rw-r--r-- | g10/keygen.c | 5 | ||||
-rw-r--r-- | g10/keyid.c | 18 | ||||
-rw-r--r-- | g10/revoke.c | 15 | ||||
-rw-r--r-- | g10/tofu.c | 82 |
5 files changed, 92 insertions, 33 deletions
diff --git a/g10/export.c b/g10/export.c index 8f6371b30..c538dc1f1 100644 --- a/g10/export.c +++ b/g10/export.c @@ -1430,6 +1430,11 @@ print_pka_or_dane_records (iobuf_t out, kbnode_t keyblock, PKT_public_key *pk, char *hexfpr; hexfpr = hexfingerprint (pk, NULL, 0); + if (!hexfpr) + { + err = gpg_error_from_syserror (); + goto leave; + } hexdata = bin2hex (data, datalen, NULL); if (!hexdata) { diff --git a/g10/keygen.c b/g10/keygen.c index 7ef3cac1d..b42afa858 100644 --- a/g10/keygen.c +++ b/g10/keygen.c @@ -4484,6 +4484,11 @@ card_write_key_to_backup_file (PKT_public_key *sk, const char *backup_dir) log_info (_("Note: backup of card key saved to '%s'\n"), fname); fprbuf = hexfingerprint (sk, NULL, 0); + if (!fprbuf) + { + err = gpg_error_from_syserror (); + goto leave; + } write_status_text_and_buffer (STATUS_BACKUP_KEY_CREATED, fprbuf, fname, strlen (fname), 0); xfree (fprbuf); diff --git a/g10/keyid.c b/g10/keyid.c index d733156f8..ba35ec21f 100644 --- a/g10/keyid.c +++ b/g10/keyid.c @@ -790,12 +790,12 @@ fingerprint_from_pk (PKT_public_key *pk, byte *array, size_t *ret_len) /* Return an allocated buffer with the fingerprint of PK formatted as - a plain hexstring. If BUFFER is NULL the result is a malloc'd - string. If BUFFER is not NULL the result will be copied into this - buffer. In the latter case BUFLEN describes the length of the - buffer; if this is too short the function terminates the process. - Returns a malloc'ed string or BUFFER. A suitable length for BUFFER - is (2*MAX_FINGERPRINT_LEN + 1). */ + * a plain hexstring. If BUFFER is NULL the result is a malloc'd + * string. If BUFFER is not NULL the result will be copied into this + * buffer. In the latter case BUFLEN describes the length of the + * buffer; if this is too short the function terminates the process. + * Returns a malloc'ed string or BUFFER. A suitable length for BUFFER + * is (2*MAX_FINGERPRINT_LEN + 1). */ char * hexfingerprint (PKT_public_key *pk, char *buffer, size_t buflen) { @@ -804,7 +804,11 @@ hexfingerprint (PKT_public_key *pk, char *buffer, size_t buflen) fingerprint_from_pk (pk, fpr, &len); if (!buffer) - buffer = xmalloc (2 * len + 1); + { + buffer = xtrymalloc (2 * len + 1); + if (!buffer) + return NULL; + } else if (buflen < 2*len+1) log_fatal ("%s: buffer too short (%zu)\n", __func__, buflen); bin2hex (fpr, len, buffer); diff --git a/g10/revoke.c b/g10/revoke.c index 457870082..846523295 100644 --- a/g10/revoke.c +++ b/g10/revoke.c @@ -536,7 +536,20 @@ gen_standard_revoke (ctrl_t ctrl, PKT_public_key *psk, const char *cache_nonce) dir = get_openpgp_revocdir (gnupg_homedir ()); tmpstr = hexfingerprint (psk, NULL, 0); - fname = xstrconcat (dir, DIRSEP_S, tmpstr, NULL); + if (!tmpstr) + { + rc = gpg_error_from_syserror (); + xfree (dir); + return rc; + } + fname = strconcat (dir, DIRSEP_S, tmpstr, NULL); + if (!fname) + { + rc = gpg_error_from_syserror (); + xfree (tmpstr); + xfree (dir); + return rc; + } xfree (tmpstr); xfree (dir); diff --git a/g10/tofu.c b/g10/tofu.c index c183fc665..091d5b0d0 100644 --- a/g10/tofu.c +++ b/g10/tofu.c @@ -3332,8 +3332,8 @@ tofu_register_signature (ctrl_t ctrl, char *fingerprint = NULL; strlist_t user_id; char *email = NULL; - char *err = NULL; - char *sig_digest; + char *sqlerr = NULL; + char *sig_digest = NULL; unsigned long c; dbs = opendbs (ctrl); @@ -3354,11 +3354,20 @@ tofu_register_signature (ctrl_t ctrl, log_assert (pk_is_primary (pk)); sig_digest = make_radix64_string (sig_digest_bin, sig_digest_bin_len); + if (!sig_digest) + { + rc = gpg_error_from_syserror (); + goto leave; + } fingerprint = hexfingerprint (pk, NULL, 0); + if (!fingerprint) + { + rc = gpg_error_from_syserror (); + goto leave; + } if (! origin) - /* The default origin is simply "unknown". */ - origin = "unknown"; + origin = "unknown"; /* The default origin is simply "unknown". */ for (user_id = user_id_list; user_id; user_id = user_id->next) { @@ -3384,7 +3393,7 @@ tofu_register_signature (ctrl_t ctrl, it again. */ rc = gpgsql_stepx (dbs->db, &dbs->s.register_already_seen, - get_single_unsigned_long_cb2, &c, &err, + get_single_unsigned_long_cb2, &c, &sqlerr, "select count (*)\n" " from signatures left join bindings\n" " on signatures.binding = bindings.oid\n" @@ -3396,9 +3405,9 @@ tofu_register_signature (ctrl_t ctrl, GPGSQL_ARG_END); if (rc) { - log_error (_("error reading TOFU database: %s\n"), err); + log_error (_("error reading TOFU database: %s\n"), sqlerr); print_further_info ("checking existence"); - sqlite3_free (err); + sqlite3_free (sqlerr); rc = gpg_error (GPG_ERR_GENERAL); } else if (c > 1) @@ -3436,7 +3445,7 @@ tofu_register_signature (ctrl_t ctrl, log_assert (c == 0); rc = gpgsql_stepx - (dbs->db, &dbs->s.register_signature, NULL, NULL, &err, + (dbs->db, &dbs->s.register_signature, NULL, NULL, &sqlerr, "insert into signatures\n" " (binding, sig_digest, origin, sig_time, time)\n" " values\n" @@ -3450,9 +3459,9 @@ tofu_register_signature (ctrl_t ctrl, GPGSQL_ARG_END); if (rc) { - log_error (_("error updating TOFU database: %s\n"), err); + log_error (_("error updating TOFU database: %s\n"), sqlerr); print_further_info ("insert signatures"); - sqlite3_free (err); + sqlite3_free (sqlerr); rc = gpg_error (GPG_ERR_GENERAL); } } @@ -3463,6 +3472,7 @@ tofu_register_signature (ctrl_t ctrl, break; } + leave: if (rc) rollback_transaction (ctrl); else @@ -3486,7 +3496,8 @@ tofu_register_encryption (ctrl_t ctrl, int free_user_id_list = 0; char *fingerprint = NULL; strlist_t user_id; - char *err = NULL; + char *sqlerr = NULL; + int in_batch = 0; dbs = opendbs (ctrl); if (! dbs) @@ -3531,8 +3542,14 @@ tofu_register_encryption (ctrl_t ctrl, } fingerprint = hexfingerprint (pk, NULL, 0); + if (!fingerprint) + { + rc = gpg_error_from_syserror (); + goto leave; + } tofu_begin_batch_update (ctrl); + in_batch = 1; tofu_resume_batch_transaction (ctrl); for (user_id = user_id_list; user_id; user_id = user_id->next) @@ -3550,7 +3567,7 @@ tofu_register_encryption (ctrl_t ctrl, /* An error. */ rc = gpg_error (GPG_ERR_GENERAL); xfree (email); - goto die; + goto leave; } @@ -3576,7 +3593,7 @@ tofu_register_encryption (ctrl_t ctrl, free_strlist (conflict_set); rc = gpgsql_stepx - (dbs->db, &dbs->s.register_encryption, NULL, NULL, &err, + (dbs->db, &dbs->s.register_encryption, NULL, NULL, &sqlerr, "insert into encryptions\n" " (binding, time)\n" " values\n" @@ -3588,24 +3605,22 @@ tofu_register_encryption (ctrl_t ctrl, GPGSQL_ARG_END); if (rc) { - log_error (_("error updating TOFU database: %s\n"), err); + log_error (_("error updating TOFU database: %s\n"), sqlerr); print_further_info ("insert encryption"); - sqlite3_free (err); + sqlite3_free (sqlerr); rc = gpg_error (GPG_ERR_GENERAL); } xfree (email); } - die: - tofu_end_batch_update (ctrl); - - if (kb) - release_kbnode (kb); + leave: + if (in_batch) + tofu_end_batch_update (ctrl); + release_kbnode (kb); if (free_user_id_list) free_strlist (user_id_list); - xfree (fingerprint); return rc; @@ -3681,10 +3696,10 @@ tofu_write_tfs_record (ctrl_t ctrl, estream_t fp, PKT_public_key *pk, const char *user_id) { time_t now = gnupg_get_time (); - gpg_error_t err; + gpg_error_t err = 0; tofu_dbs_t dbs; char *fingerprint; - char *email; + char *email = NULL; enum tofu_policy policy; if (!*user_id) @@ -3699,14 +3714,20 @@ tofu_write_tfs_record (ctrl_t ctrl, estream_t fp, } fingerprint = hexfingerprint (pk, NULL, 0); + if (!fingerprint) + { + err = gpg_error_from_syserror (); + goto leave; + } email = email_from_user_id (user_id); policy = get_policy (ctrl, dbs, pk, fingerprint, user_id, email, NULL, now); show_statistics (dbs, fingerprint, email, policy, fp, 0, now); + leave: xfree (email); xfree (fingerprint); - return 0; + return err; } @@ -3720,7 +3741,10 @@ tofu_write_tfs_record (ctrl_t ctrl, estream_t fp, will be prompted to choose a policy. If MAY_ASK is 0 and the policy is TOFU_POLICY_ASK, then TRUST_UNKNOWN is returned. - Returns TRUST_UNDEFINED if an error occurs. */ + Returns TRUST_UNDEFINED if an error occurs. + + Fixme: eturn an error code + */ int tofu_get_validity (ctrl_t ctrl, PKT_public_key *pk, strlist_t user_id_list, int may_ask) @@ -3744,6 +3768,8 @@ tofu_get_validity (ctrl_t ctrl, PKT_public_key *pk, strlist_t user_id_list, } fingerprint = hexfingerprint (pk, NULL, 0); + if (!fingerprint) + log_fatal ("%s: malloc failed\n", __func__); tofu_begin_batch_update (ctrl); /* Start the batch transaction now. */ @@ -3889,6 +3915,8 @@ tofu_set_policy (ctrl_t ctrl, kbnode_t kb, enum tofu_policy policy) log_bug ("%s: Passed a subkey, but expecting a primary key.\n", __func__); fingerprint = hexfingerprint (pk, NULL, 0); + if (!fingerprint) + return gpg_error_from_syserror (); begin_transaction (ctrl, 0); @@ -3958,6 +3986,8 @@ tofu_get_policy (ctrl_t ctrl, PKT_public_key *pk, PKT_user_id *user_id, } fingerprint = hexfingerprint (pk, NULL, 0); + if (!fingerprint) + return gpg_error_from_syserror (); email = email_from_user_id (user_id->name); @@ -3994,6 +4024,8 @@ tofu_notice_key_changed (ctrl_t ctrl, kbnode_t kb) } fingerprint = hexfingerprint (pk, NULL, 0); + if (!fingerprint) + return gpg_error_from_syserror (); rc = gpgsql_stepx (dbs->db, NULL, NULL, NULL, &sqlerr, "update bindings set effective_policy = ?" |