Index: globals.h =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/globals.h,v retrieving revision 1.4 diff -u -5 -r1.4 globals.h --- globals.h 1998/07/10 22:01:08 1.4 +++ globals.h 1998/12/08 12:20:51 @@ -10,11 +10,11 @@ /* if you create a modified version of the key server, instead of incrementing this number, append a descriptive string, like "42.17.0-joe", or "42.17.0-magicfeature" */ -#define PKS_VERSION "0.9.3-mwa" +#define PKS_VERSION "0.9.3-mwa-noloop" #ifdef DEBUG extern int debug; #define dabort() if (debug) abort() Index: kd_add.c =================================================================== RCS file: /home/mwa/Admin/cvsroot/home/mwa/src/pks/kd_add.c,v retrieving revision 1.7 diff -u -5 -r1.7 kd_add.c --- kd_add.c 1998/12/07 14:14:18 1.7 +++ kd_add.c 1998/12/08 12:56:56 @@ -1135,10 +1135,11 @@ int kd_add_1(unsigned char *keys, long len, int flags, xbuffer *win_msg, xbuffer *newkeys_xb, error *err) { dkm_state s; int ret; + char debugmsg[1024]; s.ms.new_sigs = 0; s.ms.repl_sigs = 0; s.ms.new_userids = 0; s.ms.changed_primary_userids = 0; @@ -1177,49 +1178,76 @@ xbuffer_free(newkeys_xb); return(0); } if (newkeys_xb && newkeys_xb->len) { - ddesc binary, armored; - - binary.data = newkeys_xb->buf; - binary.size = newkeys_xb->len; - binary.offset = 0; - - armored.size = encode_ascii_size(&binary, "PUBLIC KEY BLOCK"); - if ((armored.data = (unsigned char *) malloc(armored.size)) == NULL) { - xbuffer_free(newkeys_xb); - err->fatal = 1; - err->str = "Allocating memory for ascii armor added key block failed"; - fail(); - } - armored.offset = 0; - - if (!encode_ascii(&binary, "PUBLIC KEY BLOCK", &armored)) { - free(armored.data); - xbuffer_free(newkeys_xb); - err->fatal = 1; - err->str = "Converting added key block to ascii armor failed"; - fail(); + if (!s.ms.new_sigs && + !s.ms.repl_sigs && + !s.ms.new_userids && + !s.ms.new_revocations && + !s.ms.new_pubkeys && + !s.ms.not_changed_revocation_sig) { + /* Nothing new, except probably primary uid changes; + * do not propagate them to avoid loops */ + sprintf(debugmsg, "Not propagating %d lonely primary uid changes", + s.ms.changed_primary_userids); + log_info("kd_add", debugmsg); + xbuffer_free(newkeys_xb); + } else { + ddesc binary, armored; + + binary.data = newkeys_xb->buf; + binary.size = newkeys_xb->len; + binary.offset = 0; + + armored.size = encode_ascii_size(&binary, "PUBLIC KEY BLOCK"); + if ((armored.data = (unsigned char *) malloc(armored.size)) == NULL) { + xbuffer_free(newkeys_xb); + err->fatal = 1; + err->str = "Allocating memory for ascii armor added key block failed"; + fail(); + } + armored.offset = 0; + + if (!encode_ascii(&binary, "PUBLIC KEY BLOCK", &armored)) { + free(armored.data); + xbuffer_free(newkeys_xb); + err->fatal = 1; + err->str = "Converting added key block to ascii armor failed"; + fail(); + } + + xbuffer_free(newkeys_xb); + + /* it saves a copy. sigh. */ + + newkeys_xb->alloclen = armored.offset; + newkeys_xb->len = armored.offset; + newkeys_xb->buf = armored.data; } - - xbuffer_free(newkeys_xb); - - /* it saves a copy. sigh. */ - - newkeys_xb->alloclen = armored.offset; - newkeys_xb->len = armored.offset; - newkeys_xb->buf = armored.data; } + + /* Give statistics */ + sprintf(debugmsg, "pub+%d sig+%d sig=%d uid+%d uid=%d rev+%d rev!%d", + s.ms.new_pubkeys, s.ms.new_sigs, s.ms.repl_sigs, + s.ms.new_userids, s.ms.changed_primary_userids, + s.ms.new_revocations, s.ms.not_changed_revocation_sig); + log_debug("kd_add", debugmsg); if (!s.ms.new_sigs && !s.ms.repl_sigs && !s.ms.new_userids && !s.ms.changed_primary_userids && !s.ms.new_revocations && !s.ms.new_pubkeys && !s.ms.not_changed_revocation_sig) { + if (newkeys_xb && newkeys_xb->len) { + sprintf(debugmsg, "Strange: nothing changed, but newkeys_xb->len=%ld", + newkeys_xb->len); + log_error("kd_add", debugmsg); + } + if (!xbuffer_append_str(win_msg, "Key block in add request contained no new\n" "keys, userid's, or signatures.\n")) { xbuffer_free(newkeys_xb); err->fatal = 1;