#include #include #include #include #include "netbios.h" int nbdgramconvM2S(NbDgram *s, uchar *ap, uchar *ep) { uchar *p = ap; int n; ushort length; if (ap + 6 + IPv4addrlen > ep) return 0; s->type = *p++; s->flags = *p++; s->id = nhgets(p); p+= 2; v4tov6(s->srcip, p); p+= IPv4addrlen; s->srcport = nhgets(p); p += 2; switch (s->type) { case NbDgramDirectUnique: case NbDgramDirectGroup: case NbDgramBroadcast: if (p + 4 > ep) return 0; length = nhgets(p); p += 2; s->datagram.offset = nhgets(p); p += 2; if (p + length > ep) return 0; ep = p + length; n = nbnamedecode(p, p, ep, s->datagram.srcname); if (n == 0) return 0; p += n; n = nbnamedecode(p, p, ep, s->datagram.dstname); if (n == 0) return 0; p += n; s->datagram.data = p; s->datagram.length = ep - p; p = ep; break; case NbDgramError: if (p + 1 > ep) return 0; s->error.code = *p++; break; case NbDgramQueryRequest: case NbDgramPositiveQueryResponse: case NbDgramNegativeQueryResponse: n = nbnamedecode(p, p, ep, s->query.dstname); if (n == 0) return 0; p += n; break; default: return 0; } return p - ap; } int nbdgramconvS2M(uchar *ap, uchar *ep, NbDgram *s) { uchar *p = ap; uchar *fixup; int n; if (p + 6 + IPv4addrlen > ep) return 0; *p++ = s->type; *p++ = s->flags; hnputs(p, s->id); p+= 2; v6tov4(p, s->srcip); p += IPv4addrlen; hnputs(p, s->srcport); p+= 2; switch (s->type) { case NbDgramDirectUnique: case NbDgramDirectGroup: case NbDgramBroadcast: if (p + 4 > ep) return 0; fixup = p; hnputs(p, s->datagram.length); p += 2; hnputs(p, s->datagram.offset); p += 2; n = nbnameencode(p, ep, s->datagram.srcname); if (n == 0) return 0; p += n; n = nbnameencode(p, ep, s->datagram.dstname); if (n == 0) return 0; p += n; if (p + s->datagram.length > ep) return 0; memcpy(p, s->datagram.data, s->datagram.length); p += s->datagram.length; hnputs(fixup, p - fixup - 4); break; case NbDgramError: if (p + 1 > ep) return 0; *p++ = s->error.code; break; case NbDgramQueryRequest: case NbDgramPositiveQueryResponse: case NbDgramNegativeQueryResponse: n = nbnameencode(p, ep, s->datagram.dstname); if (n == 0) return 0; p += n; break; default: return 0; } return p - ap; }