diff options
-rw-r--r-- | lib/ZParseNot.c | 15 | ||||
-rw-r--r-- | lib/Zinternal.c | 19 | ||||
-rw-r--r-- | server/bdump.c | 26 |
3 files changed, 28 insertions, 32 deletions
diff --git a/lib/ZParseNot.c b/lib/ZParseNot.c index f5b90cd..97c5225 100644 --- a/lib/ZParseNot.c +++ b/lib/ZParseNot.c @@ -257,8 +257,16 @@ ZParseNotice(char *buffer, if (memchr(ptr, '\0', end - ptr) == NULL) BAD_PACKET; - if (ZReadZcode((unsigned char *)ptr, addrbuf, sizeof(addrbuf), &len) == ZERR_BADFIELD) - BAD_PACKET; + if (*ptr == 'Z') { + if (ZReadZcode((unsigned char *)ptr, addrbuf, + sizeof(addrbuf), &len) == ZERR_BADFIELD) + BAD_PACKET; + } else { + len = sizeof(notice->z_sender_sockaddr.ip4.sin_addr); + if (ZReadAscii(ptr, end - ptr, (unsigned char *)addrbuf, + len) == ZERR_BADFIELD) + BAD_PACKET; + } if (len == sizeof(notice->z_sender_sockaddr.ip6.sin6_addr)) { notice->z_sender_sockaddr.ip6.sin6_family = AF_INET6; @@ -272,7 +280,8 @@ ZParseNotice(char *buffer, numfields--; ptr = next_field(ptr, end); } else { - memset(¬ice->z_sender_sockaddr, 0, sizeof notice->z_sender_sockaddr); + 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; } diff --git a/lib/Zinternal.c b/lib/Zinternal.c index ba742a7..b2cd677 100644 --- a/lib/Zinternal.c +++ b/lib/Zinternal.c @@ -683,10 +683,12 @@ 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)); + if (notice->z_sender_sockaddr.ip4.sin_family == 0) { + (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; @@ -989,7 +991,7 @@ Z_FormatRawHeader(ZNotice_t *notice, if (!(notice->z_sender_sockaddr.sa.sa_family == AF_INET || notice->z_sender_sockaddr.sa.sa_family == AF_INET6)) - return ZERR_ILLVAL; + notice->z_sender_sockaddr.sa.sa_family = AF_INET; /* \/\/hatever *//*XXX*/ if (!notice->z_class) notice->z_class = ""; @@ -1086,13 +1088,14 @@ Z_FormatRawHeader(ZNotice_t *notice, 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; + if (ZMakeAscii(ptr, end - ptr, addraddr, addrlen) == ZERR_FIELDLEN) + return ZERR_HEADERLEN; } 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; } - - 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) diff --git a/server/bdump.c b/server/bdump.c index da67d62..5b04866 100644 --- a/server/bdump.c +++ b/server/bdump.c @@ -865,11 +865,6 @@ bdump_send_list_tcp(ZNotice_Kind_t kind, memset (¬ice, 0, sizeof(notice)); - retval = ZMakeAscii(addrbuf, sizeof(addrbuf), - (unsigned char *) &addr->sin_addr, - sizeof(struct in_addr)); - if (retval != ZERR_NONE) - return retval; notice.z_kind = kind; notice.z_port = addr->sin_port; @@ -879,8 +874,9 @@ bdump_send_list_tcp(ZNotice_Kind_t kind, notice.z_sender = sender; notice.z_recipient = recip; notice.z_default_format = ""; - notice.z_num_other_fields = 1; - notice.z_other_fields[0] = addrbuf; + notice.z_num_other_fields = 0; + if (addr) + notice.z_sender_sockaddr.ip4 = *addr; /*XXX*/ retval = ZFormatNoticeList(¬ice, lyst, num, &pack, &packlen, ZNOAUTH); if (retval != ZERR_NONE) @@ -1230,20 +1226,8 @@ bdump_recv_loop(Server *server) notice.z_recipient); } #endif /* DEBUG */ - if (notice.z_num_other_fields >= 1) { - retval = ZReadAscii(notice.z_other_fields[0], - strlen(notice.z_other_fields[0]), - (unsigned char *) &who.sin_addr, - sizeof(struct in_addr)); - if (retval != ZERR_NONE) { - syslog(LOG_ERR, "brl zreadascii failed: %s", - error_message(retval)); - return retval; - } - } else { - who.sin_addr.s_addr = notice.z_sender_addr.s_addr; - } - who.sin_family = AF_INET; + who.sin_family = AF_INET; /*XXX*/ + who.sin_addr.s_addr = notice.z_sender_sockaddr.ip4.sin_addr.s_addr; who.sin_port = notice.z_port; if (strcmp(notice.z_opcode, ADMIN_DONE) == 0) { |