mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
61 lines
3.3 KiB
C
61 lines
3.3 KiB
C
|
/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│
|
||
|
│ vi: set noet ft=c ts=8 sw=8 fenc=utf-8 :vi │
|
||
|
╚──────────────────────────────────────────────────────────────────────────────╝
|
||
|
│ │
|
||
|
│ Musl Libc │
|
||
|
│ Copyright © 2005-2014 Rich Felker, et al. │
|
||
|
│ │
|
||
|
│ Permission is hereby granted, free of charge, to any person obtaining │
|
||
|
│ a copy of this software and associated documentation files (the │
|
||
|
│ "Software"), to deal in the Software without restriction, including │
|
||
|
│ without limitation the rights to use, copy, modify, merge, publish, │
|
||
|
│ distribute, sublicense, and/or sell copies of the Software, and to │
|
||
|
│ permit persons to whom the Software is furnished to do so, subject to │
|
||
|
│ the following conditions: │
|
||
|
│ │
|
||
|
│ The above copyright notice and this permission notice shall be │
|
||
|
│ included in all copies or substantial portions of the Software. │
|
||
|
│ │
|
||
|
│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │
|
||
|
│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │
|
||
|
│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │
|
||
|
│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │
|
||
|
│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │
|
||
|
│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │
|
||
|
│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
|
||
|
│ │
|
||
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
||
|
#include "third_party/musl/lookup.internal.h"
|
||
|
|
||
|
int __dns_parse(const unsigned char *r, int rlen,
|
||
|
int callback(void *, int, const void *, int, const void *, int),
|
||
|
void *ctx)
|
||
|
{
|
||
|
int qdcount, ancount;
|
||
|
const unsigned char *p;
|
||
|
int len;
|
||
|
|
||
|
if (rlen<12) return -1;
|
||
|
if ((r[3]&15)) return 0;
|
||
|
p = r+12;
|
||
|
qdcount = r[4]*256 + r[5];
|
||
|
ancount = r[6]*256 + r[7];
|
||
|
while (qdcount--) {
|
||
|
while (p-r < rlen && *p-1U < 127) p++;
|
||
|
if (p>r+rlen-6)
|
||
|
return -1;
|
||
|
p += 5 + !!*p;
|
||
|
}
|
||
|
while (ancount--) {
|
||
|
while (p-r < rlen && *p-1U < 127) p++;
|
||
|
if (p>r+rlen-12)
|
||
|
return -1;
|
||
|
p += 1 + !!*p;
|
||
|
len = p[8]*256 + p[9];
|
||
|
if (len+10 > r+rlen-p) return -1;
|
||
|
if (callback(ctx, p[1], p+10, len, r, rlen) < 0) return -1;
|
||
|
p += 10 + len;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|