aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2015-10-01 15:59:03 +0000
committerWerner Koch <[email protected]>2015-10-01 15:59:22 +0000
commit2acceba5cc299796c7b5b1851a9baeb75d9f32a1 (patch)
treeb33ee9a297a5e858abc0691a25d8e3f36855cf84
parentgpg: Print more info with "check selfsig". (diff)
downloadgnupg-2acceba5cc299796c7b5b1851a9baeb75d9f32a1.tar.gz
gnupg-2acceba5cc299796c7b5b1851a9baeb75d9f32a1.zip
gpg: Fix a practical hang after use of --faked-system-time.
* g10/sign.c (update_keysig_packet): Bail out if we would need to long for a new timestamp. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to '')
-rw-r--r--g10/packet.h2
-rw-r--r--g10/sign.c23
2 files changed, 17 insertions, 8 deletions
diff --git a/g10/packet.h b/g10/packet.h
index 1906ec590..eb7da7520 100644
--- a/g10/packet.h
+++ b/g10/packet.h
@@ -663,7 +663,7 @@ int make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk,
int (*mksubpkt)(PKT_signature *, void *),
void *opaque,
const char *cache_nonce);
-int update_keysig_packet( PKT_signature **ret_sig,
+gpg_error_t update_keysig_packet (PKT_signature **ret_sig,
PKT_signature *orig_sig,
PKT_public_key *pk,
PKT_user_id *uid,
diff --git a/g10/sign.c b/g10/sign.c
index 4a30f1e16..782b9fcfa 100644
--- a/g10/sign.c
+++ b/g10/sign.c
@@ -1477,7 +1477,7 @@ make_keysig_packet (PKT_signature **ret_sig, PKT_public_key *pk,
*
* TODO: Merge this with make_keysig_packet.
*/
-int
+gpg_error_t
update_keysig_packet( PKT_signature **ret_sig,
PKT_signature *orig_sig,
PKT_public_key *pk,
@@ -1488,7 +1488,7 @@ update_keysig_packet( PKT_signature **ret_sig,
void *opaque)
{
PKT_signature *sig;
- int rc = 0;
+ gpg_error_t rc = 0;
int digest_algo;
gcry_md_hd_t md;
@@ -1524,11 +1524,19 @@ update_keysig_packet( PKT_signature **ret_sig,
/* ... but we won't make a timestamp earlier than the existing
one. */
- while(sig->timestamp<=orig_sig->timestamp)
- {
- gnupg_sleep (1);
- sig->timestamp=make_timestamp();
- }
+ {
+ int tmout = 0;
+ while(sig->timestamp<=orig_sig->timestamp)
+ {
+ if (++tmout > 5 && !opt.ignore_time_conflict)
+ {
+ rc = gpg_error (GPG_ERR_TIME_CONFLICT);
+ goto leave;
+ }
+ gnupg_sleep (1);
+ sig->timestamp=make_timestamp();
+ }
+ }
/* Note that already expired sigs will remain expired (with a
duration of 1) since build-packet.c:build_sig_subpkt_from_sig
@@ -1550,6 +1558,7 @@ update_keysig_packet( PKT_signature **ret_sig,
rc = complete_sig (sig, pksk, md, NULL);
}
+ leave:
gcry_md_close (md);
if( rc )
free_seckey_enc (sig);