summaryrefslogtreecommitdiffstats
path: root/g10/build-packet.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2017-03-30 10:35:20 +0200
committerWerner Koch <wk@gnupg.org>2017-03-30 10:35:20 +0200
commit64665404e43051fa50ee030766347e24b7d1e4d5 (patch)
tree984a953531cd86202141b7a48341fbb1defb1a05 /g10/build-packet.c
parentgpg: Revamp reading and writing of ring trust packets. (diff)
downloadgnupg2-64665404e43051fa50ee030766347e24b7d1e4d5.tar.xz
gnupg2-64665404e43051fa50ee030766347e24b7d1e4d5.zip
gpg: Fix export porting of zero length user ID packets.
* g10/build-packet.c (do_user_id): Avoid indeterminate length header. -- We are able to import such user ids but when exporting them the exported data could not be imported again because the parser bails out on invalid keyrings. This is now fixed and should be backported. Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'g10/build-packet.c')
-rw-r--r--g10/build-packet.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/g10/build-packet.c b/g10/build-packet.c
index 60e7d45e8..1ee57e009 100644
--- a/g10/build-packet.c
+++ b/g10/build-packet.c
@@ -415,18 +415,26 @@ static int
do_user_id( IOBUF out, int ctb, PKT_user_id *uid )
{
int rc;
+ int hdrlen;
log_assert (ctb_pkttype (ctb) == PKT_USER_ID
|| ctb_pkttype (ctb) == PKT_ATTRIBUTE);
+ /* We need to take special care that doe user ID with a length of 0:
+ * Without forcing HDRLEN to 2 in this case an indeterminate length
+ * packet would be written which is not allowed. Note that we are
+ * always called with a CTB indicating an old packet header format,
+ * so that forcing a 2 octet header works. */
if (uid->attrib_data)
{
- write_header(out, ctb, uid->attrib_len);
+ hdrlen = uid->attrib_len? 0 : 2;
+ write_header2 (out, ctb, uid->attrib_len, hdrlen);
rc = iobuf_write( out, uid->attrib_data, uid->attrib_len );
}
else
{
- write_header2( out, ctb, uid->len, 0 );
+ hdrlen = uid->len? 0 : 2;
+ write_header2 (out, ctb, uid->len, hdrlen);
rc = iobuf_write( out, uid->name, uid->len );
}
return rc;