summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jeffrey Hutzelman <jhutz@cmu.edu>2013-02-17 17:25:38 -0500
committerGravatar Karl Ramm <kcr@1ts.org>2013-02-17 18:09:40 -0500
commit1076f98863a6a5c740dc9f6554c11fc9c75b0899 (patch)
tree7a2178344cc6aa6b363905df9953ccf51b63ae6f
parent8e8cb752c09715f43231859169a505aa05ae3f8e (diff)
Send IPv4 addresses ASCII-encoded in v4 bdumps
This fixes #94
-rw-r--r--h/internal.h1
-rw-r--r--lib/Zinternal.c40
-rw-r--r--server/bdump.c10
3 files changed, 42 insertions, 9 deletions
diff --git a/h/internal.h b/h/internal.h
index 5cf2128..8aa7ffd 100644
--- a/h/internal.h
+++ b/h/internal.h
@@ -110,6 +110,7 @@ Code_t Z_XmitFragment (ZNotice_t*, char *,int,int);
void Z_RemQueue (struct _Z_InputQ *);
Code_t Z_AddNoticeToEntry (struct _Z_InputQ*, ZNotice_t*, int);
Code_t Z_FormatAuthHeader (ZNotice_t *, char *, int, int *, Z_AuthProc);
+Code_t Z_FormatAuthHeaderWithASCIIAddress (ZNotice_t *, char *, int, int *);
Code_t Z_FormatHeader (ZNotice_t *, char *, int, int *, Z_AuthProc);
Code_t Z_FormatRawHeader (ZNotice_t *, char*, int,
int*, char **, char **);
diff --git a/lib/Zinternal.c b/lib/Zinternal.c
index 0f692f3..8e902c3 100644
--- a/lib/Zinternal.c
+++ b/lib/Zinternal.c
@@ -111,7 +111,8 @@ void *__Z_debug_print_closure;
static int Z_AddField(char **ptr, char *field, char *end);
static int find_or_insert_uid(ZUnique_Id_t *uid, ZNotice_Kind_t kind);
static Code_t Z_ZcodeFormatRawHeader(ZNotice_t *, char *, int, int *, char **,
- int *, char **, char **, int cksumtype);
+ int *, char **, char **, int cksumstyle,
+ int addrstyle);
/* Find or insert uid in the old uids buffer. The buffer is a sorted
* circular queue. We make the assumption that most packets arrive in
@@ -748,6 +749,24 @@ Z_NewFormatHeader(ZNotice_t *notice,
}
Code_t
+Z_FormatAuthHeaderWithASCIIAddress(ZNotice_t *notice,
+ char *buffer,
+ int buffer_len,
+ int *len)
+{
+ notice->z_auth = 0;
+ notice->z_authent_len = 0;
+ notice->z_ascii_authent = "";
+ notice->z_checksum = 0;
+ if (!(notice->z_sender_sockaddr.sa.sa_family == AF_INET ||
+ notice->z_sender_sockaddr.sa.sa_family == AF_INET6))
+ notice->z_sender_sockaddr.sa.sa_family = AF_INET; /* \/\/hatever *//*XXX*/
+
+ return Z_ZcodeFormatRawHeader(notice, buffer, buffer_len, len,
+ NULL, NULL, NULL, NULL, 0, 1);
+}
+
+Code_t
Z_FormatAuthHeader(ZNotice_t *notice,
char *buffer,
int buffer_len,
@@ -796,7 +815,7 @@ Z_NewFormatRawHeader(ZNotice_t *notice,
char **cend)
{
return(Z_ZcodeFormatRawHeader(notice, buffer, buffer_len, hdr_len,
- cksum_start, cksum_len, cstart, cend, 0));
+ cksum_start, cksum_len, cstart, cend, 0, 0));
}
Code_t
@@ -810,7 +829,7 @@ Z_AsciiFormatRawHeader(ZNotice_t *notice,
char **cend)
{
return(Z_ZcodeFormatRawHeader(notice, buffer, buffer_len, hdr_len,
- cksum_start, cksum_len, cstart, cend, 1));
+ cksum_start, cksum_len, cstart, cend, 1, 0));
}
static Code_t
@@ -822,7 +841,8 @@ Z_ZcodeFormatRawHeader(ZNotice_t *notice,
int *cksum_len,
char **cstart,
char **cend,
- int cksumstyle)
+ int cksumstyle,
+ int addrstyle)
{
static char version_nogalaxy[BUFSIZ]; /* default init should be all \0 */
char newrecip[BUFSIZ];
@@ -952,8 +972,13 @@ Z_ZcodeFormatRawHeader(ZNotice_t *notice,
addraddr = (unsigned char *)&notice->z_sender_sockaddr.ip6.sin6_addr;
}
- if (ZMakeZcode(ptr, end-ptr, addraddr, addrlen) == ZERR_FIELDLEN)
- return ZERR_HEADERLEN;
+ if (notice->z_sender_sockaddr.sa.sa_family == AF_INET && addrstyle) {
+ if (ZMakeAscii(ptr, end-ptr, addraddr, addrlen) == ZERR_FIELDLEN)
+ return ZERR_HEADERLEN;
+ } else {
+ if (ZMakeZcode(ptr, end-ptr, addraddr, addrlen) == ZERR_FIELDLEN)
+ return ZERR_HEADERLEN;
+ }
ptr += strlen(ptr) + 1;
}
@@ -988,7 +1013,8 @@ Z_FormatRawHeader(ZNotice_t *notice,
notice->z_sender_sockaddr.sa.sa_family == AF_INET6))
notice->z_sender_sockaddr.sa.sa_family = AF_INET; /* \/\/hatever *//*XXX*/
- return Z_NewFormatRawHeader(notice, buffer, buffer_len, len, NULL, NULL, cstart, cend);
+ return Z_ZcodeFormatRawHeader(notice, buffer, buffer_len, len,
+ NULL, NULL, cstart, cend, 0, 0);
}
static int
diff --git a/server/bdump.c b/server/bdump.c
index 5e7b604..505e582 100644
--- a/server/bdump.c
+++ b/server/bdump.c
@@ -101,6 +101,7 @@ static struct sockaddr_in bdump_sin;
#ifdef HAVE_KRB5
static krb5_auth_context bdump_ac;
#endif
+static Z_AuthProc bdump_auth_proc;
int bdumping;
int bdump_concurrent;
@@ -286,6 +287,7 @@ bdump_send(void)
bdumping = 1;
server->dumping = 1;
+ bdump_auth_proc = ZNOAUTH;
if (bdump_socket >= 0) {
/* shut down the listening socket and the timer. */
@@ -406,6 +408,7 @@ bdump_send(void)
#endif /* HAVE_KRB5 */
#ifdef HAVE_KRB4
case 4:
+ bdump_auth_proc = Z_FormatAuthHeaderWithASCIIAddress;
/* here to krb_rd_req from GetKerberosData candidate for refactoring
back into kstuff.c */
(void) strcpy(instance, "*"); /* let Kerberos fill it in */
@@ -528,6 +531,7 @@ bdump_get_v12 (ZNotice_t *notice,
bdumping = 1;
server->dumping = 1;
+ bdump_auth_proc = ZNOAUTH;
#ifdef _POSIX_VERSION
action.sa_flags = 0;
@@ -709,6 +713,7 @@ bdump_get_v12 (ZNotice_t *notice,
#endif
#ifdef HAVE_KRB4
case 4:
+ bdump_auth_proc = Z_FormatAuthHeaderWithASCIIAddress;
/* send an authenticator */
retval = SendKerberosData(live_socket, &ticket, SERVER_SERVICE,
SERVER_INSTANCE);
@@ -920,7 +925,8 @@ bdump_send_list_tcp(ZNotice_Kind_t kind,
if (addr)
notice.z_sender_sockaddr.ip4 = *addr; /*XXX*/
- retval = ZFormatNoticeList(&notice, lyst, num, &pack, &packlen, ZNOAUTH);
+ retval = ZFormatNoticeList(&notice, lyst, num, &pack, &packlen,
+ bdump_auth_proc);
if (retval != ZERR_NONE) {
syslog(LOG_ERR, "bdump_send_list_tcp: ZFormatNotice: %s", error_message(retval));
return retval;
@@ -1512,7 +1518,7 @@ send_normal_tcp(ZNotice_Kind_t kind,
notice.z_message_len = len;
notice.z_num_other_fields = 0;
- retval = ZFormatNotice(&notice, &pack, &packlen, ZNOAUTH);
+ retval = ZFormatNotice(&notice, &pack, &packlen, bdump_auth_proc);
if (retval != ZERR_NONE) {
syslog(LOG_WARNING, "send_normal_tcp: ZFormatNotice: %s", error_message(retval));
return retval;