summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Karl Ramm <kcr@mit.edu>2009-03-23 13:50:35 +0000
committerGravatar Karl Ramm <kcr@mit.edu>2009-03-23 13:50:35 +0000
commitcf8bf8391cffc4cd35e634a8b9a3adf954260b88 (patch)
tree42b9dd823d930f8c78e0f0be7140773c64b95335
parent7bf9b4390e877a960a2dbcc35e848b11dd989544 (diff)
Brain dumps used to stash the address of the client for which metadata
was being sent in an extra header field. This worked about as well as you might expect. Fortunately we happened to be putting an address in header field 18 anyway, so backwards compatibility should be relatively painless. I don't know which approach is a more egregious hack, but this change at least nets us four less lines of code, which is obviously good, right? Oh, and while we're at it, if the sa_family isn't set on the sender address, just cringe and set it to AF_INET.
-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) {