1/* Initialize a simple DNS packet parser.
2 Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#include <arpa/nameser.h>
20#include <errno.h>
21#include <stdbool.h>
22#include <string.h>
23
24bool
25__ns_rr_cursor_init (struct ns_rr_cursor *c,
26 const unsigned char *buf, size_t len)
27{
28 c->begin = buf;
29 c->end = buf + len;
30
31 /* Check for header size and 16-bit question count value (it must be 1). */
32 if (len < 12 || buf[4] != 0 || buf[5] != 1)
33 {
34 __set_errno (EMSGSIZE);
35 c->current = c->end;
36 return false;
37 }
38 c->current = buf + 12;
39
40 int consumed = __ns_name_length_uncompressed (p: c->current, eom: c->end);
41 if (consumed < 0)
42 {
43 __set_errno (EMSGSIZE);
44 c->current = c->end;
45 c->first_rr = NULL;
46 return false;
47 }
48 c->current += consumed;
49
50 /* Ensure there is room for question type and class. */
51 if (c->end - c->current < 4)
52 {
53 __set_errno (EMSGSIZE);
54 c->current = c->end;
55 c->first_rr = NULL;
56 return false;
57 }
58 c->current += 4;
59 c->first_rr = c->current;
60
61 return true;
62}
63

source code of glibc/resolv/ns_rr_cursor_init.c