Port dsniff to -ng
[openwrt/svn-archive/archive.git] / net / dsniff / patches / dns.patch
1 diff -Nur dsniff-2.3/dns.c dsniff-2.3.patched/dns.c
2 --- dsniff-2.3/dns.c 1970-01-01 01:00:00.000000000 +0100
3 +++ dsniff-2.3.patched/dns.c 2005-06-09 14:06:36.000000000 +0200
4 @@ -0,0 +1,677 @@
5 +/*
6 + * Copyright (c) 1985, 1993
7 + * The Regents of the University of California. All rights reserved.
8 + *
9 + * Redistribution and use in source and binary forms, with or without
10 + * modification, are permitted provided that the following conditions
11 + * are met:
12 + * 1. Redistributions of source code must retain the above copyright
13 + * notice, this list of conditions and the following disclaimer.
14 + * 2. Redistributions in binary form must reproduce the above copyright
15 + * notice, this list of conditions and the following disclaimer in the
16 + * documentation and/or other materials provided with the distribution.
17 + * 4. Neither the name of the University nor the names of its contributors
18 + * may be used to endorse or promote products derived from this software
19 + * without specific prior written permission.
20 + *
21 + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 + * SUCH DAMAGE.
32 + */
33 +
34 +/*
35 + * Portions Copyright (c) 1993 by Digital Equipment Corporation.
36 + *
37 + * Permission to use, copy, modify, and distribute this software for any
38 + * purpose with or without fee is hereby granted, provided that the above
39 + * copyright notice and this permission notice appear in all copies, and that
40 + * the name of Digital Equipment Corporation not be used in advertising or
41 + * publicity pertaining to distribution of the document or software without
42 + * specific, written prior permission.
43 + *
44 + * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
45 + * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
46 + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
47 + * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
48 + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
49 + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
50 + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
51 + * SOFTWARE.
52 + */
53 +
54 +/*
55 + * Portions Copyright (c) 1996-1999 by Internet Software Consortium.
56 + *
57 + * Permission to use, copy, modify, and distribute this software for any
58 + * purpose with or without fee is hereby granted, provided that the above
59 + * copyright notice and this permission notice appear in all copies.
60 + *
61 + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
62 + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
63 + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
64 + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
65 + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
66 + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
67 + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
68 + * SOFTWARE.
69 + */
70 +
71 +/*
72 + * Copyright (c) 1996,1999 by Internet Software Consortium.
73 + *
74 + * Permission to use, copy, modify, and distribute this software for any
75 + * purpose with or without fee is hereby granted, provided that the above
76 + * copyright notice and this permission notice appear in all copies.
77 + *
78 + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
79 + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
80 + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
81 + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
82 + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
83 + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
84 + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
85 + * SOFTWARE.
86 + */
87 +
88 +/*
89 + *
90 + * DNS helper functions not implemented in uclibc
91 + *
92 + */
93 +
94 +
95 +#include <sys/types.h>
96 +#include <sys/param.h>
97 +#include <netinet/in.h>
98 +#include <arpa/nameser.h>
99 +#include <ctype.h>
100 +#include <resolv.h>
101 +#include <stdio.h>
102 +#include <string.h>
103 +#include <unistd.h>
104 +
105 +static const char digits[] = "0123456789";
106 +
107 +/* Forward. */
108 +
109 +static int special(int);
110 +static int printable(int);
111 +static int dn_find(const u_char *, const u_char *,
112 + const u_char * const *,
113 + const u_char * const *);
114 +
115 +
116 +/*
117 + * ns_name_ntop(src, dst, dstsiz)
118 + * Convert an encoded domain name to printable ascii as per RFC1035.
119 + * return:
120 + * Number of bytes written to buffer, or -1 (with errno set)
121 + * notes:
122 + * The root is returned as "."
123 + * All other domains are returned in non absolute form
124 + */
125 +int
126 +ns_name_ntop(const u_char *src, char *dst, size_t dstsiz) {
127 + const u_char *cp;
128 + char *dn, *eom;
129 + u_char c;
130 + u_int n;
131 +
132 + cp = src;
133 + dn = dst;
134 + eom = dst + dstsiz;
135 +
136 + while ((n = *cp++) != 0) {
137 + if ((n & NS_CMPRSFLGS) != 0) {
138 + /* Some kind of compression pointer. */
139 + return (-1);
140 + }
141 + if (dn != dst) {
142 + if (dn >= eom) {
143 + return (-1);
144 + }
145 + *dn++ = '.';
146 + }
147 + if (dn + n >= eom) {
148 + return (-1);
149 + }
150 + for ((void)NULL; n > 0; n--) {
151 + c = *cp++;
152 + if (special(c)) {
153 + if (dn + 1 >= eom) {
154 + return (-1);
155 + }
156 + *dn++ = '\\';
157 + *dn++ = (char)c;
158 + } else if (!printable(c)) {
159 + if (dn + 3 >= eom) {
160 + return (-1);
161 + }
162 + *dn++ = '\\';
163 + *dn++ = digits[c / 100];
164 + *dn++ = digits[(c % 100) / 10];
165 + *dn++ = digits[c % 10];
166 + } else {
167 + if (dn >= eom) {
168 + return (-1);
169 + }
170 + *dn++ = (char)c;
171 + }
172 + }
173 + }
174 + if (dn == dst) {
175 + if (dn >= eom) {
176 + return (-1);
177 + }
178 + *dn++ = '.';
179 + }
180 + if (dn >= eom) {
181 + return (-1);
182 + }
183 + *dn++ = '\0';
184 + return (dn - dst);
185 +}
186 +
187 +/*
188 + * ns_name_pton(src, dst, dstsiz)
189 + * Convert a ascii string into an encoded domain name as per RFC1035.
190 + * return:
191 + * -1 if it fails
192 + * 1 if string was fully qualified
193 + * 0 is string was not fully qualified
194 + * notes:
195 + * Enforces label and domain length limits.
196 + */
197 +
198 +int
199 +ns_name_pton(const char *src, u_char *dst, size_t dstsiz) {
200 + u_char *label, *bp, *eom;
201 + int c, n, escaped;
202 + char *cp;
203 +
204 + escaped = 0;
205 + bp = dst;
206 + eom = dst + dstsiz;
207 + label = bp++;
208 +
209 + while ((c = *src++) != 0) {
210 + if (escaped) {
211 + if ((cp = strchr(digits, c)) != NULL) {
212 + n = (cp - digits) * 100;
213 + if ((c = *src++) == 0 ||
214 + (cp = strchr(digits, c)) == NULL) {
215 + return (-1);
216 + }
217 + n += (cp - digits) * 10;
218 + if ((c = *src++) == 0 ||
219 + (cp = strchr(digits, c)) == NULL) {
220 + return (-1);
221 + }
222 + n += (cp - digits);
223 + if (n > 255) {
224 + return (-1);
225 + }
226 + c = n;
227 + }
228 + escaped = 0;
229 + } else if (c == '\\') {
230 + escaped = 1;
231 + continue;
232 + } else if (c == '.') {
233 + c = (bp - label - 1);
234 + if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */
235 + return (-1);
236 + }
237 + if (label >= eom) {
238 + return (-1);
239 + }
240 + *label = c;
241 + /* Fully qualified ? */
242 + if (*src == '\0') {
243 + if (c != 0) {
244 + if (bp >= eom) {
245 + return (-1);
246 + }
247 + *bp++ = '\0';
248 + }
249 + if ((bp - dst) > MAXCDNAME) {
250 + return (-1);
251 + }
252 + return (1);
253 + }
254 + if (c == 0 || *src == '.') {
255 + return (-1);
256 + }
257 + label = bp++;
258 + continue;
259 + }
260 + if (bp >= eom) {
261 + return (-1);
262 + }
263 + *bp++ = (u_char)c;
264 + }
265 + c = (bp - label - 1);
266 + if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */
267 + return (-1);
268 + }
269 + if (label >= eom) {
270 + return (-1);
271 + }
272 + *label = c;
273 + if (c != 0) {
274 + if (bp >= eom) {
275 + return (-1);
276 + }
277 + *bp++ = 0;
278 + }
279 + if ((bp - dst) > MAXCDNAME) { /* src too big */
280 + return (-1);
281 + }
282 + return (0);
283 +}
284 +
285 +/*
286 + * ns_name_ntol(src, dst, dstsiz)
287 + * Convert a network strings labels into all lowercase.
288 + * return:
289 + * Number of bytes written to buffer, or -1 (with errno set)
290 + * notes:
291 + * Enforces label and domain length limits.
292 + */
293 +
294 +int
295 +ns_name_ntol(const u_char *src, u_char *dst, size_t dstsiz) {
296 + const u_char *cp;
297 + u_char *dn, *eom;
298 + u_char c;
299 + u_int n;
300 +
301 + cp = src;
302 + dn = dst;
303 + eom = dst + dstsiz;
304 +
305 + while ((n = *cp++) != 0) {
306 + if ((n & NS_CMPRSFLGS) != 0) {
307 + /* Some kind of compression pointer. */
308 + return (-1);
309 + }
310 + *dn++ = n;
311 + if (dn + n >= eom) {
312 + return (-1);
313 + }
314 + for ((void)NULL; n > 0; n--) {
315 + c = *cp++;
316 + if (isupper(c))
317 + *dn++ = tolower(c);
318 + else
319 + *dn++ = c;
320 + }
321 + }
322 + *dn++ = '\0';
323 + return (dn - dst);
324 +}
325 +
326 +/*
327 + * ns_name_unpack(msg, eom, src, dst, dstsiz)
328 + * Unpack a domain name from a message, source may be compressed.
329 + * return:
330 + * -1 if it fails, or consumed octets if it succeeds.
331 + */
332 +int
333 +ns_name_unpack(const u_char *msg, const u_char *eom, const u_char *src,
334 + u_char *dst, size_t dstsiz)
335 +{
336 + const u_char *srcp, *dstlim;
337 + u_char *dstp;
338 + int n, len, checked;
339 +
340 + len = -1;
341 + checked = 0;
342 + dstp = dst;
343 + srcp = src;
344 + dstlim = dst + dstsiz;
345 + if (srcp < msg || srcp >= eom) {
346 + return (-1);
347 + }
348 + /* Fetch next label in domain name. */
349 + while ((n = *srcp++) != 0) {
350 + /* Check for indirection. */
351 + switch (n & NS_CMPRSFLGS) {
352 + case 0:
353 + /* Limit checks. */
354 + if (dstp + n + 1 >= dstlim || srcp + n >= eom) {
355 + return (-1);
356 + }
357 + checked += n + 1;
358 + *dstp++ = n;
359 + memcpy(dstp, srcp, n);
360 + dstp += n;
361 + srcp += n;
362 + break;
363 +
364 + case NS_CMPRSFLGS:
365 + if (srcp >= eom) {
366 + return (-1);
367 + }
368 + if (len < 0)
369 + len = srcp - src + 1;
370 + srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff));
371 + if (srcp < msg || srcp >= eom) { /* Out of range. */
372 + return (-1);
373 + }
374 + checked += 2;
375 + /*
376 + * Check for loops in the compressed name;
377 + * if we've looked at the whole message,
378 + * there must be a loop.
379 + */
380 + if (checked >= eom - msg) {
381 + return (-1);
382 + }
383 + break;
384 +
385 + default:
386 + return (-1); /* flag error */
387 + }
388 + }
389 + *dstp = '\0';
390 + if (len < 0)
391 + len = srcp - src;
392 + return (len);
393 +}
394 +
395 +/*
396 + * ns_name_pack(src, dst, dstsiz, dnptrs, lastdnptr)
397 + * Pack domain name 'domain' into 'comp_dn'.
398 + * return:
399 + * Size of the compressed name, or -1.
400 + * notes:
401 + * 'dnptrs' is an array of pointers to previous compressed names.
402 + * dnptrs[0] is a pointer to the beginning of the message. The array
403 + * ends with NULL.
404 + * 'lastdnptr' is a pointer to the end of the array pointed to
405 + * by 'dnptrs'.
406 + * Side effects:
407 + * The list of pointers in dnptrs is updated for labels inserted into
408 + * the message as we compress the name. If 'dnptr' is NULL, we don't
409 + * try to compress names. If 'lastdnptr' is NULL, we don't update the
410 + * list.
411 + */
412 +int
413 +ns_name_pack(const u_char *src, u_char *dst, int dstsiz,
414 + const u_char **dnptrs, const u_char **lastdnptr)
415 +{
416 + u_char *dstp;
417 + const u_char **cpp, **lpp, *eob, *msg;
418 + const u_char *srcp;
419 + int n, l, first = 1;
420 +
421 + srcp = src;
422 + dstp = dst;
423 + eob = dstp + dstsiz;
424 + lpp = cpp = NULL;
425 + if (dnptrs != NULL) {
426 + if ((msg = *dnptrs++) != NULL) {
427 + for (cpp = dnptrs; *cpp != NULL; cpp++)
428 + (void)NULL;
429 + lpp = cpp; /* end of list to search */
430 + }
431 + } else
432 + msg = NULL;
433 +
434 + /* make sure the domain we are about to add is legal */
435 + l = 0;
436 + do {
437 + n = *srcp;
438 + if ((n & NS_CMPRSFLGS) != 0) {
439 + return (-1);
440 + }
441 + l += n + 1;
442 + if (l > MAXCDNAME) {
443 + return (-1);
444 + }
445 + srcp += n + 1;
446 + } while (n != 0);
447 +
448 + /* from here on we need to reset compression pointer array on error */
449 + srcp = src;
450 + do {
451 + /* Look to see if we can use pointers. */
452 + n = *srcp;
453 + if (n != 0 && msg != NULL) {
454 + l = dn_find(srcp, msg, (const u_char * const *)dnptrs,
455 + (const u_char * const *)lpp);
456 + if (l >= 0) {
457 + if (dstp + 1 >= eob) {
458 + goto cleanup;
459 + }
460 + *dstp++ = (l >> 8) | NS_CMPRSFLGS;
461 + *dstp++ = l % 256;
462 + return (dstp - dst);
463 + }
464 + /* Not found, save it. */
465 + if (lastdnptr != NULL && cpp < lastdnptr - 1 &&
466 + (dstp - msg) < 0x4000 && first) {
467 + *cpp++ = dstp;
468 + *cpp = NULL;
469 + first = 0;
470 + }
471 + }
472 + /* copy label to buffer */
473 + if (n & NS_CMPRSFLGS) { /* Should not happen. */
474 + goto cleanup;
475 + }
476 + if (dstp + 1 + n >= eob) {
477 + goto cleanup;
478 + }
479 + memcpy(dstp, srcp, n + 1);
480 + srcp += n + 1;
481 + dstp += n + 1;
482 + } while (n != 0);
483 +
484 + if (dstp > eob) {
485 +cleanup:
486 + if (msg != NULL)
487 + *lpp = NULL;
488 + return (-1);
489 + }
490 + return (dstp - dst);
491 +}
492 +
493 +/*
494 + * ns_name_uncompress(msg, eom, src, dst, dstsiz)
495 + * Expand compressed domain name to presentation format.
496 + * return:
497 + * Number of bytes read out of `src', or -1 (with errno set).
498 + * note:
499 + * Root domain returns as "." not "".
500 + */
501 +int
502 +ns_name_uncompress(const u_char *msg, const u_char *eom, const u_char *src,
503 + char *dst, size_t dstsiz)
504 +{
505 + u_char tmp[NS_MAXCDNAME];
506 + int n;
507 +
508 + if ((n = ns_name_unpack(msg, eom, src, tmp, sizeof tmp)) == -1)
509 + return (-1);
510 + if (ns_name_ntop(tmp, dst, dstsiz) == -1)
511 + return (-1);
512 + return (n);
513 +}
514 +
515 +/*
516 + * ns_name_compress(src, dst, dstsiz, dnptrs, lastdnptr)
517 + * Compress a domain name into wire format, using compression pointers.
518 + * return:
519 + * Number of bytes consumed in `dst' or -1 (with errno set).
520 + * notes:
521 + * 'dnptrs' is an array of pointers to previous compressed names.
522 + * dnptrs[0] is a pointer to the beginning of the message.
523 + * The list ends with NULL. 'lastdnptr' is a pointer to the end of the
524 + * array pointed to by 'dnptrs'. Side effect is to update the list of
525 + * pointers for labels inserted into the message as we compress the name.
526 + * If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr'
527 + * is NULL, we don't update the list.
528 + */
529 +int
530 +ns_name_compress(const char *src, u_char *dst, size_t dstsiz,
531 + const u_char **dnptrs, const u_char **lastdnptr)
532 +{
533 + u_char tmp[NS_MAXCDNAME];
534 +
535 + if (ns_name_pton(src, tmp, sizeof tmp) == -1)
536 + return (-1);
537 + return (ns_name_pack(tmp, dst, dstsiz, dnptrs, lastdnptr));
538 +}
539 +
540 +/*
541 + * special(ch)
542 + * Thinking in noninternationalized USASCII (per the DNS spec),
543 + * is this characted special ("in need of quoting") ?
544 + * return:
545 + * boolean.
546 + */
547 +static int
548 +special(int ch) {
549 + switch (ch) {
550 + case 0x22: /* '"' */
551 + case 0x2E: /* '.' */
552 + case 0x3B: /* ';' */
553 + case 0x5C: /* '\\' */
554 + /* Special modifiers in zone files. */
555 + case 0x40: /* '@' */
556 + case 0x24: /* '$' */
557 + return (1);
558 + default:
559 + return (0);
560 + }
561 +}
562 +
563 +/*
564 + * printable(ch)
565 + * Thinking in noninternationalized USASCII (per the DNS spec),
566 + * is this character visible and not a space when printed ?
567 + * return:
568 + * boolean.
569 + */
570 +static int
571 +printable(int ch) {
572 + return (ch > 0x20 && ch < 0x7f);
573 +}
574 +
575 +/*
576 + * Thinking in noninternationalized USASCII (per the DNS spec),
577 + * convert this character to lower case if it's upper case.
578 + */
579 +static int
580 +mklower(int ch) {
581 + if (ch >= 0x41 && ch <= 0x5A)
582 + return (ch + 0x20);
583 + return (ch);
584 +}
585 +
586 +/*
587 + * dn_find(domain, msg, dnptrs, lastdnptr)
588 + * Search for the counted-label name in an array of compressed names.
589 + * return:
590 + * offset from msg if found, or -1.
591 + * notes:
592 + * dnptrs is the pointer to the first name on the list,
593 + * not the pointer to the start of the message.
594 + */
595 +static int
596 +dn_find(const u_char *domain, const u_char *msg,
597 + const u_char * const *dnptrs,
598 + const u_char * const *lastdnptr)
599 +{
600 + const u_char *dn, *cp, *sp;
601 + const u_char * const *cpp;
602 + u_int n;
603 +
604 + for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
605 + sp = *cpp;
606 + /*
607 + * terminate search on:
608 + * root label
609 + * compression pointer
610 + * unusable offset
611 + */
612 + while (*sp != 0 && (*sp & NS_CMPRSFLGS) == 0 &&
613 + (sp - msg) < 0x4000) {
614 + dn = domain;
615 + cp = sp;
616 + while ((n = *cp++) != 0) {
617 + /*
618 + * check for indirection
619 + */
620 + switch (n & NS_CMPRSFLGS) {
621 + case 0: /* normal case, n == len */
622 + if (n != *dn++)
623 + goto next;
624 + for ((void)NULL; n > 0; n--)
625 + if (mklower(*dn++) !=
626 + mklower(*cp++))
627 + goto next;
628 + /* Is next root for both ? */
629 + if (*dn == '\0' && *cp == '\0')
630 + return (sp - msg);
631 + if (*dn)
632 + continue;
633 + goto next;
634 +
635 + case NS_CMPRSFLGS: /* indirection */
636 + cp = msg + (((n & 0x3f) << 8) | *cp);
637 + break;
638 +
639 + default: /* illegal type */
640 + return (-1);
641 + }
642 + }
643 + next:
644 + sp += *sp + 1;
645 + }
646 + }
647 + return (-1);
648 +}
649 +
650 +/*
651 + * Expand compressed domain name 'comp_dn' to full domain name.
652 + * 'msg' is a pointer to the begining of the message,
653 + * 'eomorig' points to the first location after the message,
654 + * 'exp_dn' is a pointer to a buffer of size 'length' for the result.
655 + * Return size of compressed name or -1 if there was an error.
656 + */
657 +int
658 +dn_expand(const u_char *msg, const u_char *eom, const u_char *src,
659 + char *dst, int dstsiz)
660 +{
661 + int n = ns_name_uncompress(msg, eom, src, dst, (size_t)dstsiz);
662 +
663 + if (n > 0 && dst[0] == '.')
664 + dst[0] = '\0';
665 + return (n);
666 +}
667 +
668 +/*
669 + * Pack domain name 'exp_dn' in presentation form into 'comp_dn'.
670 + * Return the size of the compressed name or -1.
671 + * 'length' is the size of the array pointed to by 'comp_dn'.
672 + */
673 +int
674 +dn_comp(const char *src, u_char *dst, int dstsiz,
675 + u_char **dnptrs, u_char **lastdnptr)
676 +{
677 + return (ns_name_compress(src, dst, (size_t)dstsiz,
678 + (const u_char **)dnptrs,
679 + (const u_char **)lastdnptr));
680 +}
681 +
682 diff -Nur dsniff-2.3/Makefile.in dsniff-2.3.patched/Makefile.in
683 --- dsniff-2.3/Makefile.in 2000-12-15 21:03:26.000000000 +0100
684 +++ dsniff-2.3.patched/Makefile.in 2005-06-09 14:03:18.000000000 +0200
685 @@ -51,7 +51,7 @@
686 pathnames.h pcaputil.h record.h rpc.h tcp_raw.h trigger.h \
687 version.h vroot.h
688
689 -SRCS = asn1.c base64.c buf.c hex.c magic.c mount.c pcaputil.c rpc.c \
690 +SRCS = asn1.c base64.c buf.c dns.c hex.c magic.c mount.c pcaputil.c rpc.c \
691 tcp_raw.c trigger.c record.c dsniff.c decode.c decode_aim.c \
692 decode_citrix.c decode_cvs.c decode_ftp.c decode_hex.c \
693 decode_http.c decode_icq.c decode_imap.c decode_irc.c \
694 @@ -99,8 +99,8 @@
695 arpspoof: arpspoof.o arp.o
696 $(CC) $(LDFLAGS) -o $@ arpspoof.o arp.o $(LIBS) $(PCAPLIB) $(LNETLIB)
697
698 -dnsspoof: dnsspoof.o pcaputil.o
699 - $(CC) $(LDFLAGS) -o $@ dnsspoof.o pcaputil.o $(LIBS) $(PCAPLIB) $(LNETLIB)
700 +dnsspoof: dnsspoof.o pcaputil.o dns.o
701 + $(CC) $(LDFLAGS) -o $@ dnsspoof.o pcaputil.o dns.o $(LIBS) $(PCAPLIB) $(LNETLIB)
702
703 filesnarf: nfs_prot.o filesnarf.o pcaputil.o rpc.o
704 $(CC) $(LDFLAGS) -o $@ filesnarf.o nfs_prot.o pcaputil.o rpc.o $(LIBS) $(NIDSLIB) $(PCAPLIB) $(LNETLIB)