summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGravatar Karl Ramm <kcr@1ts.org>2009-07-12 22:01:12 +0000
committerGravatar Karl Ramm <kcr@1ts.org>2009-07-12 22:01:12 +0000
commit345d1482dd3fd46ac4f50d6872fa1910834263a8 (patch)
tree259003235cbad2984a3fca76601d2b77ffeef66a /lib
parent6f0a1fa9fc94ef627c7a54a3f4309d2c4236c28b (diff)
Check that we don't reformat a zephyr that started with fewer fields, so that we don't
inadvertantly alter the checksum.
Diffstat (limited to 'lib')
-rw-r--r--lib/Zinternal.c32
1 files changed, 18 insertions, 14 deletions
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 *)&notice->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 *)&notice->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 *)&notice->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 *)&notice->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;i<notice->z_num_other_fields;i++)
if (Z_AddField(&ptr, notice->z_other_fields[i], end))