diff options
author | Karl Ramm <kcr@mit.edu> | 2009-03-02 07:29:54 +0000 |
---|---|---|
committer | Karl Ramm <kcr@mit.edu> | 2009-03-02 07:29:54 +0000 |
commit | acc0a0992fa27f2e0cf893577eba6c3db4afd5df (patch) | |
tree | af0c565008ac0d60238ae189d3d9f7f8075d4534 /lib | |
parent | 2e7ac9926a7acb502c3887a4a01f9b17ff1f857d (diff) |
19 fields zephyrgrams
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ZParseNot.c | 41 | ||||
-rw-r--r-- | lib/Zinternal.c | 51 |
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(¬ice->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(¬ice->z_sender_sockaddr.ip6.sin6_addr, addrbuf, len); + else if (len == sizeof(notice->z_sender_sockaddr.ip4.sin_addr)) + memcpy(¬ice->z_sender_sockaddr.ip4.sin_addr, addrbuf, len); + else + BAD_PACKET; + + numfields--; + ptr = next_field(ptr, end); + } else { + memset(¬ice->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, ¬ice->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(¬ice->z_uid.zuid_addr, &__My_addr, sizeof(__My_addr)); + (void) memset(¬ice->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(¬ice->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 *)¬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 (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 *)¬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 (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)) |