X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/f01a14ae44e67d54f6bb89f034ed1b39a5c3f565..8f94d68a09e1103353cc7d1133d6dfdf7d5a920d:/smbutil.c diff --git a/smbutil.c b/smbutil.c index 92ae88ec..e80b6636 100644 --- a/smbutil.c +++ b/smbutil.c @@ -12,34 +12,28 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/smbutil.c,v 1.16 2001-06-25 21:04:01 itojun Exp $"; + "@(#) $Header: /tcpdump/master/tcpdump/smbutil.c,v 1.25 2002-09-05 00:00:25 guy Exp $"; #endif -#include -#include -#include -#include +#include -#include - -#include #include #include #include -#include #include "interface.h" +#include "extract.h" #include "smb.h" -extern const uchar *startbuf; +extern const u_char *startbuf; /* * interpret a 32 bit dos packed date/time to some parameters */ static void -interpret_dos_date(uint32 date, struct tm *tp) +interpret_dos_date(u_int32_t date, struct tm *tp) { - uint32 p0, p1, p2, p3; + u_int32_t p0, p1, p2, p3; p0 = date & 0xFF; p1 = ((date & 0xFF00) >> 8) & 0xFF; @@ -55,16 +49,14 @@ interpret_dos_date(uint32 date, struct tm *tp) } /* + * common portion: * create a unix date from a dos date */ static time_t -make_unix_date(const void *date_ptr) +int_unix_date(u_int32_t dos_date) { - uint32 dos_date = 0; struct tm t; - dos_date = IVAL(date_ptr, 0); - if (dos_date == 0) return(0); @@ -78,17 +70,30 @@ make_unix_date(const void *date_ptr) /* * create a unix date from a dos date + * in network byte order */ static time_t -make_unix_date2(const void *date_ptr) +make_unix_date(const u_char *date_ptr) { - uint32 x, x2; + u_int32_t dos_date = 0; - x = IVAL(date_ptr, 0); - x2 = ((x & 0xFFFF) << 16) | ((x & 0xFFFF0000) >> 16); - SIVAL(&x, 0, x2); + dos_date = EXTRACT_LE_32BITS(date_ptr); + + return int_unix_date(dos_date); +} + +/* + * create a unix date from a dos date + * in halfword-swapped network byte order! + */ +static time_t +make_unix_date2(const u_char *date_ptr) +{ + u_int32_t x, x2; - return(make_unix_date((void *)&x)); + x = EXTRACT_LE_32BITS(date_ptr); + x2 = ((x & 0xFFFF) << 16) | ((x & 0xFFFF0000) >> 16); + return int_unix_date(x2); } /* @@ -96,13 +101,15 @@ make_unix_date2(const void *date_ptr) * It's originally in "100ns units since jan 1st 1601" */ static time_t -interpret_long_date(const char *p) +interpret_long_date(const u_char *p) { double d; time_t ret; + TCHECK2(p[4], 4); + /* this gives us seconds since jan 1st 1601 (approx) */ - d = (IVAL(p, 4) * 256.0 + CVAL(p, 3)) * (1.0e-7 * (1 << 24)); + d = (EXTRACT_LE_32BITS(p + 4) * 256.0 + p[3]) * (1.0e-7 * (1 << 24)); /* now adjust by 369 years to make the secs since 1970 */ d -= 369.0 * 365.25 * 24 * 60 * 60; @@ -116,6 +123,8 @@ interpret_long_date(const char *p) ret = (time_t)d; return(ret); +trunc: + return(0); } /* @@ -123,7 +132,7 @@ interpret_long_date(const char *p) * we run past the end of the buffer */ static int -name_interpret(const uchar *in, const uchar *maxbuf, char *out) +name_interpret(const u_char *in, const u_char *maxbuf, char *out) { int ret; int len; @@ -139,9 +148,9 @@ name_interpret(const uchar *in, const uchar *maxbuf, char *out) return(0); while (len--) { + TCHECK2(*in, 2); if (in + 1 >= maxbuf) return(-1); /* name goes past the end of the buffer */ - TCHECK2(*in, 2); if (in[0] < 'A' || in[0] > 'P' || in[1] < 'A' || in[1] > 'P') { *out = 0; return(0); @@ -162,11 +171,11 @@ trunc: /* * find a pointer to a netbios name */ -static const uchar * -name_ptr(const uchar *buf, int ofs, const uchar *maxbuf) +static const u_char * +name_ptr(const u_char *buf, int ofs, const u_char *maxbuf) { - const uchar *p; - uchar c; + const u_char *p; + u_char c; p = buf + ofs; if (p >= maxbuf) @@ -177,7 +186,7 @@ name_ptr(const uchar *buf, int ofs, const uchar *maxbuf) /* XXX - this should use the same code that the DNS dissector does */ if ((c & 0xC0) == 0xC0) { - uint16 l = RSVAL(buf, ofs) & 0x3FFF; + u_int16_t l = EXTRACT_16BITS(buf + ofs) & 0x3FFF; if (l == 0) { /* We have a pointer that points to itself. */ return(NULL); @@ -198,9 +207,9 @@ trunc: * extract a netbios name from a buf */ static int -name_extract(const uchar *buf, int ofs, const uchar *maxbuf, char *name) +name_extract(const u_char *buf, int ofs, const u_char *maxbuf, char *name) { - const uchar *p = name_ptr(buf, ofs, maxbuf); + const u_char *p = name_ptr(buf, ofs, maxbuf); if (p == NULL) return(-1); /* error (probably name going past end of buffer) */ name[0] = '\0'; @@ -243,10 +252,10 @@ print_asc(const unsigned char *buf, int len) safeputchar(buf[i]); } -static char * +static const char * name_type_str(int name_type) { - char *f = NULL; + const char *f = NULL; switch (name_type) { case 0: f = "Workstation"; break; @@ -292,7 +301,7 @@ print_data(const unsigned char *buf, int len) while (n--) printf(" "); - n = MIN(8, i % 16); + n = SMBMIN(8, i % 16); print_asc(&buf[i - (i % 16)], n); printf(" "); n = (i % 16) - n; @@ -304,9 +313,9 @@ print_data(const unsigned char *buf, int len) static void -write_bits(unsigned int val, char *fmt) +write_bits(unsigned int val, const char *fmt) { - char *p = fmt; + const char *p = fmt; int i = 0; while ((p = strchr(fmt, '|'))) { @@ -320,7 +329,7 @@ write_bits(unsigned int val, char *fmt) /* convert a UCS2 string into iso-8859-1 string */ static const char * -unistr(const char *s, int *len) +unistr(const u_char *s, int *len) { static char buf[1000]; int l=0; @@ -336,8 +345,8 @@ unistr(const char *s, int *len) /* maybe it isn't unicode - a cheap trick */ if (!use_unicode || (s[0] && s[1])) { - *len = strlen(s) + 1; - return s; + *len = strlen((const char *)s) + 1; + return (const char *)s; } *len = 0; @@ -347,7 +356,7 @@ unistr(const char *s, int *len) *len = 1; } - while (l < (sizeof(buf) - 1) && s[0] && s[1] == 0) { + while (l < (int)(sizeof(buf) - 1) && s[0] && s[1] == 0) { buf[l] = s[0]; s += 2; l++; @@ -358,23 +367,23 @@ unistr(const char *s, int *len) return buf; } -static const uchar * -fdata1(const uchar *buf, const char *fmt, const uchar *maxbuf) +static const u_char * +smb_fdata1(const u_char *buf, const char *fmt, const u_char *maxbuf) { int reverse = 0; - char *attrib_fmt = "READONLY|HIDDEN|SYSTEM|VOLUME|DIR|ARCHIVE|"; + const char *attrib_fmt = "READONLY|HIDDEN|SYSTEM|VOLUME|DIR|ARCHIVE|"; int len; while (*fmt && buf sizeof(s)) { + if ((size_t)(p - fmt + 1) > sizeof(s)) { /* overrun */ return(buf); } strncpy(s, fmt, p - fmt); s[p - fmt] = '\0'; fmt = p + 1; - buf = fdata1(buf, s, maxbuf); + buf = smb_fdata1(buf, s, maxbuf); if (buf == NULL) return(NULL); break; @@ -657,9 +704,9 @@ fdata(const uchar *buf, const char *fmt, const uchar *maxbuf) } typedef struct { - char *name; + const char *name; int code; - char *message; + const char *message; } err_code_struct; /* Dos Error Messages */ @@ -755,7 +802,7 @@ err_code_struct hard_msgs[] = { static struct { int code; - char *class; + const char *class; err_code_struct *err_msgs; } err_classes[] = { { 0, "SUCCESS", NULL },