summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGravatar Karl Ramm <kcr@mit.edu>2009-03-02 07:29:54 +0000
committerGravatar Karl Ramm <kcr@mit.edu>2009-03-02 07:29:54 +0000
commitacc0a0992fa27f2e0cf893577eba6c3db4afd5df (patch)
treeaf0c565008ac0d60238ae189d3d9f7f8075d4534 /lib
parent2e7ac9926a7acb502c3887a4a01f9b17ff1f857d (diff)
19 fields zephyrgrams
Diffstat (limited to 'lib')
-rw-r--r--lib/ZParseNot.c41
-rw-r--r--lib/Zinternal.c51
2 files changed, 88 insertions, 4 deletions
diff --git a/lib/ZParseNot.c b/lib/ZParseNot.c
index 48fc29e..a897fd0 100644
--- a/lib/ZParseNot.c
+++ b/lib/ZParseNot.c
@@ -117,9 +117,6 @@ ZParseNotice(char *buffer,
BAD_PACKET;
notice->z_time.tv_sec = ntohl((u_long) notice->z_uid.tv.tv_sec);
notice->z_time.tv_usec = ntohl((u_long) notice->z_uid.tv.tv_usec);
- memset(&notice->z_sender_sockaddr, 0, sizeof notice->z_sender_sockaddr);
- notice->z_sender_sockaddr.ip4.sin_family = AF_INET;
- notice->z_sender_sockaddr.ip4.sin_addr = notice->z_uid.zuid_addr;
numfields--;
ptr = next_field(ptr, end);
}
@@ -250,6 +247,44 @@ ZParseNotice(char *buffer,
else
notice->z_multiuid = notice->z_uid;
+ if (numfields && ptr < end) {
+ /* we will take it on faith that ipv6 addresses are longer than ipv4
+ addresses */
+ unsigned char addrbuf[sizeof(notice->z_sender_sockaddr.ip6.sin6_addr)];
+ int len;
+
+ /* because we're paranoid about naughtily misformated packets */
+ if (memchr(ptr, '\0', end - ptr))
+ BAD_PACKET;
+
+ if (ZReadZcode((unsigned char *)ptr, addrbuf, sizeof(addrbuf), &len) == ZERR_BADFIELD)
+ BAD_PACKET;
+
+ if (len == sizeof(notice->z_sender_sockaddr.ip6.sin6_addr))
+ memcpy(&notice->z_sender_sockaddr.ip6.sin6_addr, addrbuf, len);
+ else if (len == sizeof(notice->z_sender_sockaddr.ip4.sin_addr))
+ memcpy(&notice->z_sender_sockaddr.ip4.sin_addr, addrbuf, len);
+ else
+ BAD_PACKET;
+
+ numfields--;
+ ptr = next_field(ptr, end);
+ } else {
+ memset(&notice->z_sender_sockaddr, 0, sizeof notice->z_sender_sockaddr);
+ notice->z_sender_sockaddr.ip4.sin_family = AF_INET;
+ notice->z_sender_sockaddr.ip4.sin_addr = notice->z_uid.zuid_addr;
+ }
+
+ if (numfields && ptr < end) {
+ if (ZReadAscii16(ptr, end-ptr, &notice->z_charset) == ZERR_BADFIELD)
+ BAD_PACKET;
+ notice->z_charset = htons(notice->z_charset);
+
+ numfields--;
+ ptr = next_field(ptr, end);
+ } else
+ notice->z_charset = ZCHARSET_UNKNOWN;
+
for (i=0;ptr < end && i<Z_MAXOTHERFIELDS && numfields;i++,numfields--) {
notice->z_other_fields[i] = ptr;
ptr = next_field(ptr, end);
diff --git a/lib/Zinternal.c b/lib/Zinternal.c
index 504a9a8..ff01db1 100644
--- a/lib/Zinternal.c
+++ b/lib/Zinternal.c
@@ -683,6 +683,11 @@ Z_FormatHeader(ZNotice_t *notice,
(void) memcpy(&notice->z_uid.zuid_addr, &__My_addr, sizeof(__My_addr));
+ (void) memset(&notice->z_sender_sockaddr, 0, sizeof(notice->z_sender_sockaddr));
+ notice->z_sender_sockaddr.ip4.sin_family = AF_INET; /*XXX*/
+ notice->z_sender_sockaddr.ip4.sin_port = notice->z_port;
+ (void) memcpy(&notice->z_sender_sockaddr.ip4.sin_addr, &__My_addr, sizeof(__My_addr));
+
notice->z_multiuid = notice->z_uid;
if (!version[0])
@@ -820,6 +825,12 @@ Z_ZcodeFormatRawHeader(ZNotice_t *notice,
char newrecip[BUFSIZ];
char *ptr, *end;
int i;
+ int addrlen = 0;
+ unsigned char *addraddr = NULL;
+
+ if (!(notice->z_sender_sockaddr.sa.sa_family == AF_INET ||
+ notice->z_sender_sockaddr.sa.sa_family == AF_INET6))
+ return ZERR_ILLVAL;
if (!notice->z_class)
notice->z_class = "";
@@ -929,6 +940,22 @@ Z_ZcodeFormatRawHeader(ZNotice_t *notice,
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 (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))
return (ZERR_HEADERLEN);
@@ -952,6 +979,12 @@ Z_FormatRawHeader(ZNotice_t *notice,
char newrecip[BUFSIZ];
char *ptr, *end;
int i;
+ int addrlen = 0;
+ unsigned char *addraddr = NULL;
+
+ if (!(notice->z_sender_sockaddr.sa.sa_family == AF_INET ||
+ notice->z_sender_sockaddr.sa.sa_family == AF_INET6))
+ return ZERR_ILLVAL;
if (!notice->z_class)
notice->z_class = "";
@@ -992,7 +1025,7 @@ Z_FormatRawHeader(ZNotice_t *notice,
ptr += strlen(ptr)+1;
if (ZMakeAscii16(ptr, end-ptr, ntohs(notice->z_port)) == ZERR_FIELDLEN)
- return (ZERR_HEADERLEN);
+ return (ZERR_HEADERLEN);
ptr += strlen(ptr)+1;
if (ZMakeAscii32(ptr, end-ptr, notice->z_auth) == ZERR_FIELDLEN)
@@ -1044,6 +1077,22 @@ Z_FormatRawHeader(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 (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))