X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/c672f002763b3a4fc30ca229e57f50d3b2e6d766..addda66a53aa7be4ff798df2d86fda873f837270:/smbutil.c diff --git a/smbutil.c b/smbutil.c index 69744423..8d2d4170 100644 --- a/smbutil.c +++ b/smbutil.c @@ -12,7 +12,7 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/smbutil.c,v 1.17 2001-09-17 21:58:05 fenner Exp $"; + "@(#) $Header: /tcpdump/master/tcpdump/smbutil.c,v 1.21 2002-04-26 05:12:40 guy Exp $"; #endif #include @@ -26,9 +26,12 @@ static const char rcsid[] = #include #include #include +#ifdef TIME_WITH_SYS_TIME #include +#endif #include "interface.h" +#include "extract.h" #include "smb.h" extern const u_char *startbuf; @@ -55,16 +58,14 @@ interpret_dos_date(u_int32_t date, struct tm *tp) } /* + * common portion: * create a unix date from a dos date */ static time_t -make_unix_date(const u_char *date_ptr) +int_unix_date(u_int32_t dos_date) { - u_int32_t dos_date = 0; struct tm t; - dos_date = IVAL(date_ptr, 0); - if (dos_date == 0) return(0); @@ -78,17 +79,30 @@ make_unix_date(const u_char *date_ptr) /* * create a unix date from a dos date + * in network byte order + */ +static time_t +make_unix_date(const u_char *date_ptr) +{ + u_int32_t dos_date = 0; + + 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; - x = IVAL(date_ptr, 0); + x = EXTRACT_LE_32BITS(date_ptr); x2 = ((x & 0xFFFF) << 16) | ((x & 0xFFFF0000) >> 16); - SIVAL(&x, 0, x2); - - return(make_unix_date((void *)&x)); + return int_unix_date(x2); } /* @@ -96,13 +110,15 @@ make_unix_date2(const u_char *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 +132,8 @@ interpret_long_date(const char *p) ret = (time_t)d; return(ret); +trunc: + return(0); } /* @@ -139,9 +157,9 @@ name_interpret(const u_char *in, const u_char *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); @@ -177,7 +195,7 @@ name_ptr(const u_char *buf, int ofs, const u_char *maxbuf) /* XXX - this should use the same code that the DNS dissector does */ if ((c & 0xC0) == 0xC0) { - u_int16_t 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); @@ -292,7 +310,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; @@ -320,7 +338,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 +354,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; @@ -368,13 +386,13 @@ smb_fdata1(const u_char *buf, const char *fmt, const u_char *maxbuf) while (*fmt && buf