summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ZParseNot.c15
-rw-r--r--lib/Zinternal.c19
-rw-r--r--server/bdump.c26
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(&notice->z_sender_sockaddr, 0, sizeof notice->z_sender_sockaddr);
+ 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;
}
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(&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));
+ if (notice->z_sender_sockaddr.ip4.sin_family == 0) {
+ (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;
@@ -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 *)&notice->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 *)&notice->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 (&notice, 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(&notice, 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) {