From 1076f98863a6a5c740dc9f6554c11fc9c75b0899 Mon Sep 17 00:00:00 2001 From: Jeffrey Hutzelman Date: Sun, 17 Feb 2013 17:25:38 -0500 Subject: Send IPv4 addresses ASCII-encoded in v4 bdumps This fixes #94 --- h/internal.h | 1 + lib/Zinternal.c | 40 +++++++++++++++++++++++++++++++++------- server/bdump.c | 10 ++++++++-- 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 @@ -747,6 +748,24 @@ Z_NewFormatHeader(ZNotice_t *notice, return Z_NewFormatAuthHeader(notice, buffer, buffer_len, len, cert_routine); } +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, @@ -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 *)¬ice->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(¬ice, lyst, num, &pack, &packlen, ZNOAUTH); + retval = ZFormatNoticeList(¬ice, 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(¬ice, &pack, &packlen, ZNOAUTH); + retval = ZFormatNotice(¬ice, &pack, &packlen, bdump_auth_proc); if (retval != ZERR_NONE) { syslog(LOG_WARNING, "send_normal_tcp: ZFormatNotice: %s", error_message(retval)); return retval; -- cgit v1.2.3