From 345d1482dd3fd46ac4f50d6872fa1910834263a8 Mon Sep 17 00:00:00 2001 From: Karl Ramm Date: Sun, 12 Jul 2009 22:01:12 +0000 Subject: Check that we don't reformat a zephyr that started with fewer fields, so that we don't inadvertantly alter the checksum. --- lib/Zinternal.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) (limited to 'lib') diff --git a/lib/Zinternal.c b/lib/Zinternal.c index b2cd677..ef10ce7 100644 --- a/lib/Zinternal.c +++ b/lib/Zinternal.c @@ -946,22 +946,26 @@ Z_ZcodeFormatRawHeader(ZNotice_t *notice, sizeof(ZUnique_Id_t)) == ZERR_FIELDLEN) return (ZERR_HEADERLEN); ptr += strlen(ptr)+1; - - if (notice->z_sender_sockaddr.sa.sa_family == AF_INET) { - addrlen = sizeof(notice->z_sender_sockaddr.ip4.sin_addr); - addraddr = (unsigned char *)¬ice->z_sender_sockaddr.ip4.sin_addr; - } else if (notice->z_sender_sockaddr.sa.sa_family == AF_INET6) { - addrlen = sizeof(notice->z_sender_sockaddr.ip6.sin6_addr); - addraddr = (unsigned char *)¬ice->z_sender_sockaddr.ip6.sin6_addr; - } - if (ZMakeZcode(ptr, end-ptr, addraddr, addrlen) == ZERR_FIELDLEN) - return ZERR_HEADERLEN; - ptr += strlen(ptr) + 1; + if (!notice->z_num_hdr_fields || notice->z_num_hdr_fields > 17) { + if (notice->z_sender_sockaddr.sa.sa_family == AF_INET) { + addrlen = sizeof(notice->z_sender_sockaddr.ip4.sin_addr); + addraddr = (unsigned char *)¬ice->z_sender_sockaddr.ip4.sin_addr; + } else if (notice->z_sender_sockaddr.sa.sa_family == AF_INET6) { + addrlen = sizeof(notice->z_sender_sockaddr.ip6.sin6_addr); + addraddr = (unsigned char *)¬ice->z_sender_sockaddr.ip6.sin6_addr; + } - if (ZMakeAscii16(ptr, end-ptr, ntohs(notice->z_charset)) == ZERR_FIELDLEN) - return ZERR_HEADERLEN; - ptr += strlen(ptr) + 1; + if (ZMakeZcode(ptr, end-ptr, addraddr, addrlen) == ZERR_FIELDLEN) + return ZERR_HEADERLEN; + ptr += strlen(ptr) + 1; + } + + if (!notice->z_num_hdr_fields || notice->z_num_hdr_fields > 18) { + if (ZMakeAscii16(ptr, end-ptr, ntohs(notice->z_charset)) == ZERR_FIELDLEN) + return ZERR_HEADERLEN; + ptr += strlen(ptr) + 1; + } for (i=0;iz_num_other_fields;i++) if (Z_AddField(&ptr, notice->z_other_fields[i], end)) -- cgit v1.2.3