mirror of
git://git.gnupg.org/gnupg.git
synced 2024-11-12 21:58:50 +01:00
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 <wk@gnupg.org>
This commit is contained in:
parent
29119a6492
commit
cd26c5482b
@ -1430,6 +1430,11 @@ print_pka_or_dane_records (iobuf_t out, kbnode_t keyblock, PKT_public_key *pk,
|
|||||||
char *hexfpr;
|
char *hexfpr;
|
||||||
|
|
||||||
hexfpr = hexfingerprint (pk, NULL, 0);
|
hexfpr = hexfingerprint (pk, NULL, 0);
|
||||||
|
if (!hexfpr)
|
||||||
|
{
|
||||||
|
err = gpg_error_from_syserror ();
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
hexdata = bin2hex (data, datalen, NULL);
|
hexdata = bin2hex (data, datalen, NULL);
|
||||||
if (!hexdata)
|
if (!hexdata)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
log_info (_("Note: backup of card key saved to '%s'\n"), fname);
|
||||||
|
|
||||||
fprbuf = hexfingerprint (sk, NULL, 0);
|
fprbuf = hexfingerprint (sk, NULL, 0);
|
||||||
|
if (!fprbuf)
|
||||||
|
{
|
||||||
|
err = gpg_error_from_syserror ();
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
write_status_text_and_buffer (STATUS_BACKUP_KEY_CREATED, fprbuf,
|
write_status_text_and_buffer (STATUS_BACKUP_KEY_CREATED, fprbuf,
|
||||||
fname, strlen (fname), 0);
|
fname, strlen (fname), 0);
|
||||||
xfree (fprbuf);
|
xfree (fprbuf);
|
||||||
|
18
g10/keyid.c
18
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
|
/* Return an allocated buffer with the fingerprint of PK formatted as
|
||||||
a plain hexstring. If BUFFER is NULL the result is a malloc'd
|
* 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
|
* 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. In the latter case BUFLEN describes the length of the
|
||||||
buffer; if this is too short the function terminates the process.
|
* buffer; if this is too short the function terminates the process.
|
||||||
Returns a malloc'ed string or BUFFER. A suitable length for BUFFER
|
* Returns a malloc'ed string or BUFFER. A suitable length for BUFFER
|
||||||
is (2*MAX_FINGERPRINT_LEN + 1). */
|
* is (2*MAX_FINGERPRINT_LEN + 1). */
|
||||||
char *
|
char *
|
||||||
hexfingerprint (PKT_public_key *pk, char *buffer, size_t buflen)
|
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);
|
fingerprint_from_pk (pk, fpr, &len);
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
buffer = xmalloc (2 * len + 1);
|
{
|
||||||
|
buffer = xtrymalloc (2 * len + 1);
|
||||||
|
if (!buffer)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
else if (buflen < 2*len+1)
|
else if (buflen < 2*len+1)
|
||||||
log_fatal ("%s: buffer too short (%zu)\n", __func__, buflen);
|
log_fatal ("%s: buffer too short (%zu)\n", __func__, buflen);
|
||||||
bin2hex (fpr, len, buffer);
|
bin2hex (fpr, len, buffer);
|
||||||
|
15
g10/revoke.c
15
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 ());
|
dir = get_openpgp_revocdir (gnupg_homedir ());
|
||||||
tmpstr = hexfingerprint (psk, NULL, 0);
|
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 (tmpstr);
|
||||||
xfree (dir);
|
xfree (dir);
|
||||||
|
|
||||||
|
78
g10/tofu.c
78
g10/tofu.c
@ -3332,8 +3332,8 @@ tofu_register_signature (ctrl_t ctrl,
|
|||||||
char *fingerprint = NULL;
|
char *fingerprint = NULL;
|
||||||
strlist_t user_id;
|
strlist_t user_id;
|
||||||
char *email = NULL;
|
char *email = NULL;
|
||||||
char *err = NULL;
|
char *sqlerr = NULL;
|
||||||
char *sig_digest;
|
char *sig_digest = NULL;
|
||||||
unsigned long c;
|
unsigned long c;
|
||||||
|
|
||||||
dbs = opendbs (ctrl);
|
dbs = opendbs (ctrl);
|
||||||
@ -3354,11 +3354,20 @@ tofu_register_signature (ctrl_t ctrl,
|
|||||||
log_assert (pk_is_primary (pk));
|
log_assert (pk_is_primary (pk));
|
||||||
|
|
||||||
sig_digest = make_radix64_string (sig_digest_bin, sig_digest_bin_len);
|
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);
|
fingerprint = hexfingerprint (pk, NULL, 0);
|
||||||
|
if (!fingerprint)
|
||||||
|
{
|
||||||
|
rc = gpg_error_from_syserror ();
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
|
||||||
if (! origin)
|
if (! origin)
|
||||||
/* The default origin is simply "unknown". */
|
origin = "unknown"; /* The default origin is simply "unknown". */
|
||||||
origin = "unknown";
|
|
||||||
|
|
||||||
for (user_id = user_id_list; user_id; user_id = user_id->next)
|
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. */
|
it again. */
|
||||||
rc = gpgsql_stepx
|
rc = gpgsql_stepx
|
||||||
(dbs->db, &dbs->s.register_already_seen,
|
(dbs->db, &dbs->s.register_already_seen,
|
||||||
get_single_unsigned_long_cb2, &c, &err,
|
get_single_unsigned_long_cb2, &c, &sqlerr,
|
||||||
"select count (*)\n"
|
"select count (*)\n"
|
||||||
" from signatures left join bindings\n"
|
" from signatures left join bindings\n"
|
||||||
" on signatures.binding = bindings.oid\n"
|
" on signatures.binding = bindings.oid\n"
|
||||||
@ -3396,9 +3405,9 @@ tofu_register_signature (ctrl_t ctrl,
|
|||||||
GPGSQL_ARG_END);
|
GPGSQL_ARG_END);
|
||||||
if (rc)
|
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");
|
print_further_info ("checking existence");
|
||||||
sqlite3_free (err);
|
sqlite3_free (sqlerr);
|
||||||
rc = gpg_error (GPG_ERR_GENERAL);
|
rc = gpg_error (GPG_ERR_GENERAL);
|
||||||
}
|
}
|
||||||
else if (c > 1)
|
else if (c > 1)
|
||||||
@ -3436,7 +3445,7 @@ tofu_register_signature (ctrl_t ctrl,
|
|||||||
log_assert (c == 0);
|
log_assert (c == 0);
|
||||||
|
|
||||||
rc = gpgsql_stepx
|
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"
|
"insert into signatures\n"
|
||||||
" (binding, sig_digest, origin, sig_time, time)\n"
|
" (binding, sig_digest, origin, sig_time, time)\n"
|
||||||
" values\n"
|
" values\n"
|
||||||
@ -3450,9 +3459,9 @@ tofu_register_signature (ctrl_t ctrl,
|
|||||||
GPGSQL_ARG_END);
|
GPGSQL_ARG_END);
|
||||||
if (rc)
|
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");
|
print_further_info ("insert signatures");
|
||||||
sqlite3_free (err);
|
sqlite3_free (sqlerr);
|
||||||
rc = gpg_error (GPG_ERR_GENERAL);
|
rc = gpg_error (GPG_ERR_GENERAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3463,6 +3472,7 @@ tofu_register_signature (ctrl_t ctrl,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
leave:
|
||||||
if (rc)
|
if (rc)
|
||||||
rollback_transaction (ctrl);
|
rollback_transaction (ctrl);
|
||||||
else
|
else
|
||||||
@ -3486,7 +3496,8 @@ tofu_register_encryption (ctrl_t ctrl,
|
|||||||
int free_user_id_list = 0;
|
int free_user_id_list = 0;
|
||||||
char *fingerprint = NULL;
|
char *fingerprint = NULL;
|
||||||
strlist_t user_id;
|
strlist_t user_id;
|
||||||
char *err = NULL;
|
char *sqlerr = NULL;
|
||||||
|
int in_batch = 0;
|
||||||
|
|
||||||
dbs = opendbs (ctrl);
|
dbs = opendbs (ctrl);
|
||||||
if (! dbs)
|
if (! dbs)
|
||||||
@ -3531,8 +3542,14 @@ tofu_register_encryption (ctrl_t ctrl,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fingerprint = hexfingerprint (pk, NULL, 0);
|
fingerprint = hexfingerprint (pk, NULL, 0);
|
||||||
|
if (!fingerprint)
|
||||||
|
{
|
||||||
|
rc = gpg_error_from_syserror ();
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
|
||||||
tofu_begin_batch_update (ctrl);
|
tofu_begin_batch_update (ctrl);
|
||||||
|
in_batch = 1;
|
||||||
tofu_resume_batch_transaction (ctrl);
|
tofu_resume_batch_transaction (ctrl);
|
||||||
|
|
||||||
for (user_id = user_id_list; user_id; user_id = user_id->next)
|
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. */
|
/* An error. */
|
||||||
rc = gpg_error (GPG_ERR_GENERAL);
|
rc = gpg_error (GPG_ERR_GENERAL);
|
||||||
xfree (email);
|
xfree (email);
|
||||||
goto die;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3576,7 +3593,7 @@ tofu_register_encryption (ctrl_t ctrl,
|
|||||||
free_strlist (conflict_set);
|
free_strlist (conflict_set);
|
||||||
|
|
||||||
rc = gpgsql_stepx
|
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"
|
"insert into encryptions\n"
|
||||||
" (binding, time)\n"
|
" (binding, time)\n"
|
||||||
" values\n"
|
" values\n"
|
||||||
@ -3588,24 +3605,22 @@ tofu_register_encryption (ctrl_t ctrl,
|
|||||||
GPGSQL_ARG_END);
|
GPGSQL_ARG_END);
|
||||||
if (rc)
|
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");
|
print_further_info ("insert encryption");
|
||||||
sqlite3_free (err);
|
sqlite3_free (sqlerr);
|
||||||
rc = gpg_error (GPG_ERR_GENERAL);
|
rc = gpg_error (GPG_ERR_GENERAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
xfree (email);
|
xfree (email);
|
||||||
}
|
}
|
||||||
|
|
||||||
die:
|
leave:
|
||||||
|
if (in_batch)
|
||||||
tofu_end_batch_update (ctrl);
|
tofu_end_batch_update (ctrl);
|
||||||
|
|
||||||
if (kb)
|
|
||||||
release_kbnode (kb);
|
release_kbnode (kb);
|
||||||
|
|
||||||
if (free_user_id_list)
|
if (free_user_id_list)
|
||||||
free_strlist (user_id_list);
|
free_strlist (user_id_list);
|
||||||
|
|
||||||
xfree (fingerprint);
|
xfree (fingerprint);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@ -3681,10 +3696,10 @@ tofu_write_tfs_record (ctrl_t ctrl, estream_t fp,
|
|||||||
PKT_public_key *pk, const char *user_id)
|
PKT_public_key *pk, const char *user_id)
|
||||||
{
|
{
|
||||||
time_t now = gnupg_get_time ();
|
time_t now = gnupg_get_time ();
|
||||||
gpg_error_t err;
|
gpg_error_t err = 0;
|
||||||
tofu_dbs_t dbs;
|
tofu_dbs_t dbs;
|
||||||
char *fingerprint;
|
char *fingerprint;
|
||||||
char *email;
|
char *email = NULL;
|
||||||
enum tofu_policy policy;
|
enum tofu_policy policy;
|
||||||
|
|
||||||
if (!*user_id)
|
if (!*user_id)
|
||||||
@ -3699,14 +3714,20 @@ tofu_write_tfs_record (ctrl_t ctrl, estream_t fp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fingerprint = hexfingerprint (pk, NULL, 0);
|
fingerprint = hexfingerprint (pk, NULL, 0);
|
||||||
|
if (!fingerprint)
|
||||||
|
{
|
||||||
|
err = gpg_error_from_syserror ();
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
email = email_from_user_id (user_id);
|
email = email_from_user_id (user_id);
|
||||||
policy = get_policy (ctrl, dbs, pk, fingerprint, user_id, email, NULL, now);
|
policy = get_policy (ctrl, dbs, pk, fingerprint, user_id, email, NULL, now);
|
||||||
|
|
||||||
show_statistics (dbs, fingerprint, email, policy, fp, 0, now);
|
show_statistics (dbs, fingerprint, email, policy, fp, 0, now);
|
||||||
|
|
||||||
|
leave:
|
||||||
xfree (email);
|
xfree (email);
|
||||||
xfree (fingerprint);
|
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
|
will be prompted to choose a policy. If MAY_ASK is 0 and the
|
||||||
policy is TOFU_POLICY_ASK, then TRUST_UNKNOWN is returned.
|
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
|
int
|
||||||
tofu_get_validity (ctrl_t ctrl, PKT_public_key *pk, strlist_t user_id_list,
|
tofu_get_validity (ctrl_t ctrl, PKT_public_key *pk, strlist_t user_id_list,
|
||||||
int may_ask)
|
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);
|
fingerprint = hexfingerprint (pk, NULL, 0);
|
||||||
|
if (!fingerprint)
|
||||||
|
log_fatal ("%s: malloc failed\n", __func__);
|
||||||
|
|
||||||
tofu_begin_batch_update (ctrl);
|
tofu_begin_batch_update (ctrl);
|
||||||
/* Start the batch transaction now. */
|
/* 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__);
|
log_bug ("%s: Passed a subkey, but expecting a primary key.\n", __func__);
|
||||||
|
|
||||||
fingerprint = hexfingerprint (pk, NULL, 0);
|
fingerprint = hexfingerprint (pk, NULL, 0);
|
||||||
|
if (!fingerprint)
|
||||||
|
return gpg_error_from_syserror ();
|
||||||
|
|
||||||
begin_transaction (ctrl, 0);
|
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);
|
fingerprint = hexfingerprint (pk, NULL, 0);
|
||||||
|
if (!fingerprint)
|
||||||
|
return gpg_error_from_syserror ();
|
||||||
|
|
||||||
email = email_from_user_id (user_id->name);
|
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);
|
fingerprint = hexfingerprint (pk, NULL, 0);
|
||||||
|
if (!fingerprint)
|
||||||
|
return gpg_error_from_syserror ();
|
||||||
|
|
||||||
rc = gpgsql_stepx (dbs->db, NULL, NULL, NULL, &sqlerr,
|
rc = gpgsql_stepx (dbs->db, NULL, NULL, NULL, &sqlerr,
|
||||||
"update bindings set effective_policy = ?"
|
"update bindings set effective_policy = ?"
|
||||||
|
Loading…
Reference in New Issue
Block a user