* or later
*/
-#define NETDISSECT_REWORKED
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "interface.h"
+#include "netdissect.h"
#include "extract.h"
#include "smb.h"
{
uint32_t dos_date = 0;
- dos_date = EXTRACT_LE_32BITS(date_ptr);
+ dos_date = EXTRACT_LE_U_4(date_ptr);
return int_unix_date(dos_date);
}
{
uint32_t x, x2;
- x = EXTRACT_LE_32BITS(date_ptr);
+ x = EXTRACT_LE_U_4(date_ptr);
x2 = ((x & 0xFFFF) << 16) | ((x & 0xFFFF0000) >> 16);
return int_unix_date(x2);
}
time_t ret;
/* this gives us seconds since jan 1st 1601 (approx) */
- d = (EXTRACT_LE_32BITS(p + 4) * 256.0 + p[3]) * (1.0e-7 * (1 << 24));
+ d = (EXTRACT_LE_U_4(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;
if (in >= maxbuf)
return(-1); /* name goes past the end of the buffer */
- ND_TCHECK2(*in, 1);
- len = (*in++) / 2;
+ ND_TCHECK_1(in);
+ len = EXTRACT_U_1(in) / 2;
+ in++;
*out=0;
return(0);
while (len--) {
- ND_TCHECK2(*in, 2);
+ ND_TCHECK_2(in);
if (in + 1 >= maxbuf)
return(-1); /* name goes past the end of the buffer */
if (in[0] < 'A' || in[0] > 'P' || in[1] < 'A' || in[1] > 'P') {
p = buf + ofs;
if (p >= maxbuf)
return(NULL); /* name goes past the end of the buffer */
- ND_TCHECK2(*p, 1);
+ ND_TCHECK_1(p);
c = *p;
if ((c & 0xC0) == 0xC0) {
uint16_t l;
- ND_TCHECK2(*p, 2);
+ ND_TCHECK_2(p);
if ((p + 1) >= maxbuf)
return(NULL); /* name goes past the end of the buffer */
- l = EXTRACT_16BITS(p) & 0x3FFF;
+ l = EXTRACT_BE_U_2(p) & 0x3FFF;
if (l == 0) {
/* We have a pointer that points to itself. */
return(NULL);
p = buf + l;
if (p >= maxbuf)
return(NULL); /* name goes past the end of the buffer */
- ND_TCHECK2(*p, 1);
+ ND_TCHECK_1(p);
}
return(p);
if (s >= maxbuf)
return(-1); /* name goes past the end of the buffer */
- ND_TCHECK2(*s, 1);
+ ND_TCHECK_1(s);
c = *s;
if ((c & 0xC0) == 0xC0)
return(2);
while (*s) {
if (s >= maxbuf)
return(-1); /* name goes past the end of the buffer */
- ND_TCHECK2(*s, 1);
+ ND_TCHECK_1(s);
s += (*s) + 1;
+ ND_TCHECK_1(s);
}
return(PTR_DIFF(s, s0) + 1);
}
void
-print_data(netdissect_options *ndo,
- const unsigned char *buf, int len)
+smb_print_data(netdissect_options *ndo, const unsigned char *buf, int len)
{
int i = 0;
strsize = *len - 1;
} else {
for (;;) {
- ND_TCHECK2(sp[0], 2);
+ ND_TCHECK_2(sp);
*len += 2;
if (sp[0] == 0 && sp[1] == 0)
break;
}
} else {
while (strsize != 0) {
- ND_TCHECK2(s[0], 2);
+ ND_TCHECK_2(s);
if (l >= MAX_UNISTR_SIZE)
break;
if (s[1] == 0 && ND_ISPRINT(s[0])) {
break;
case 'A':
- ND_TCHECK2(buf[0], 2);
- write_bits(ndo, EXTRACT_LE_16BITS(buf), attrib_fmt);
+ ND_TCHECK_2(buf);
+ write_bits(ndo, EXTRACT_LE_U_2(buf), attrib_fmt);
buf += 2;
fmt++;
break;
case 'd':
{
unsigned int x;
- ND_TCHECK2(buf[0], 2);
- x = reverse ? EXTRACT_16BITS(buf) :
- EXTRACT_LE_16BITS(buf);
+ ND_TCHECK_2(buf);
+ x = reverse ? EXTRACT_BE_U_2(buf) :
+ EXTRACT_LE_U_2(buf);
ND_PRINT((ndo, "%d (0x%x)", x, x));
buf += 2;
fmt++;
case 'D':
{
unsigned int x;
- ND_TCHECK2(buf[0], 4);
- x = reverse ? EXTRACT_32BITS(buf) :
- EXTRACT_LE_32BITS(buf);
+ ND_TCHECK_4(buf);
+ x = reverse ? EXTRACT_BE_U_4(buf) :
+ EXTRACT_LE_U_4(buf);
ND_PRINT((ndo, "%d (0x%x)", x, x));
buf += 4;
fmt++;
case 'L':
{
uint64_t x;
- ND_TCHECK2(buf[0], 8);
- x = reverse ? EXTRACT_64BITS(buf) :
- EXTRACT_LE_64BITS(buf);
+ ND_TCHECK_8(buf);
+ x = reverse ? EXTRACT_BE_U_8(buf) :
+ EXTRACT_LE_U_8(buf);
ND_PRINT((ndo, "%" PRIu64 " (0x%" PRIx64 ")", x, x));
buf += 8;
fmt++;
/* Weird mixed-endian length values in 64-bit locks */
uint32_t x1, x2;
uint64_t x;
- ND_TCHECK2(buf[0], 8);
- x1 = reverse ? EXTRACT_32BITS(buf) :
- EXTRACT_LE_32BITS(buf);
- x2 = reverse ? EXTRACT_32BITS(buf + 4) :
- EXTRACT_LE_32BITS(buf + 4);
+ ND_TCHECK_8(buf);
+ x1 = reverse ? EXTRACT_BE_U_4(buf) :
+ EXTRACT_LE_U_4(buf);
+ x2 = reverse ? EXTRACT_BE_U_4(buf + 4) :
+ EXTRACT_LE_U_4(buf + 4);
x = (((uint64_t)x1) << 32) | x2;
ND_PRINT((ndo, "%" PRIu64 " (0x%" PRIx64 ")", x, x));
buf += 8;
case 'w':
{
unsigned int x;
- ND_TCHECK2(buf[0], 2);
- x = reverse ? EXTRACT_16BITS(buf) :
- EXTRACT_LE_16BITS(buf);
+ ND_TCHECK_2(buf);
+ x = reverse ? EXTRACT_BE_U_2(buf) :
+ EXTRACT_LE_U_2(buf);
ND_PRINT((ndo, "0x%X", x));
buf += 2;
fmt++;
case 'W':
{
unsigned int x;
- ND_TCHECK2(buf[0], 4);
- x = reverse ? EXTRACT_32BITS(buf) :
- EXTRACT_LE_32BITS(buf);
+ ND_TCHECK_4(buf);
+ x = reverse ? EXTRACT_BE_U_4(buf) :
+ EXTRACT_LE_U_4(buf);
ND_PRINT((ndo, "0x%X", x));
buf += 4;
fmt++;
break;
case 'd':
- ND_TCHECK2(buf[0], 2);
- stringlen = reverse ? EXTRACT_16BITS(buf) :
- EXTRACT_LE_16BITS(buf);
+ ND_TCHECK_2(buf);
+ stringlen = reverse ? EXTRACT_BE_U_2(buf) :
+ EXTRACT_LE_U_2(buf);
ND_PRINT((ndo, "%u", stringlen));
buf += 2;
break;
case 'D':
- ND_TCHECK2(buf[0], 4);
- stringlen = reverse ? EXTRACT_32BITS(buf) :
- EXTRACT_LE_32BITS(buf);
+ ND_TCHECK_4(buf);
+ stringlen = reverse ? EXTRACT_BE_U_4(buf) :
+ EXTRACT_LE_U_4(buf);
ND_PRINT((ndo, "%u", stringlen));
buf += 4;
break;
ND_TCHECK(*buf);
if (*buf != 4 && *buf != 2) {
- ND_PRINT((ndo, "Error! ASCIIZ buffer of type %u", *buf));
+ ND_PRINT((ndo, "Error! ASCIIZ buffer of type %u", EXTRACT_U_1(buf)));
return maxbuf; /* give up */
}
len = 0;
{
int l = atoi(fmt + 1);
ND_TCHECK2(*buf, l);
- while (l--)
- ND_PRINT((ndo, "%02x", *buf++));
+ while (l--) {
+ ND_PRINT((ndo, "%02x", EXTRACT_U_1(buf)));
+ buf++;
+ }
fmt++;
while (isdigit((unsigned char)*fmt))
fmt++;
switch (atoi(fmt + 1)) {
case 1:
- ND_TCHECK2(buf[0], 4);
- x = EXTRACT_LE_32BITS(buf);
+ ND_TCHECK_4(buf);
+ x = EXTRACT_LE_U_4(buf);
if (x == 0 || x == 0xFFFFFFFF)
t = 0;
else
buf += 4;
break;
case 2:
- ND_TCHECK2(buf[0], 4);
- x = EXTRACT_LE_32BITS(buf);
+ ND_TCHECK_4(buf);
+ x = EXTRACT_LE_U_4(buf);
if (x == 0 || x == 0xFFFFFFFF)
t = 0;
else
buf += 4;
break;
case 3:
- ND_TCHECK2(buf[0], 8);
+ ND_TCHECK_8(buf);
t = interpret_long_date(buf);
buf += 8;
break;
if (!depth && buf < maxbuf) {
size_t len = PTR_DIFF(maxbuf, buf);
ND_PRINT((ndo, "Data: (%lu bytes)\n", (unsigned long)len));
- print_data(ndo, buf, len);
+ smb_print_data(ndo, buf, len);
return(buf + len);
}
return(buf);