stdlib: Implement introsort for qsort (BZ 19305)
[glibc.git] / resolv / ns_rr_cursor_init.c
blobc30b5cf6915aa836c7405ad63b96835653af5311
1 /* Initialize a simple DNS packet parser.
2 Copyright (C) 2022-2023 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
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.
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.
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/>. */
19 #include <arpa/nameser.h>
20 #include <errno.h>
21 #include <stdbool.h>
22 #include <string.h>
24 bool
25 __ns_rr_cursor_init (struct ns_rr_cursor *c,
26 const unsigned char *buf, size_t len)
28 c->begin = buf;
29 c->end = buf + len;
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)
34 __set_errno (EMSGSIZE);
35 c->current = c->end;
36 return false;
38 c->current = buf + 12;
40 int consumed = __ns_name_length_uncompressed (c->current, c->end);
41 if (consumed < 0)
43 __set_errno (EMSGSIZE);
44 c->current = c->end;
45 c->first_rr = NULL;
46 return false;
48 c->current += consumed;
50 /* Ensure there is room for question type and class. */
51 if (c->end - c->current < 4)
53 __set_errno (EMSGSIZE);
54 c->current = c->end;
55 c->first_rr = NULL;
56 return false;
58 c->current += 4;
59 c->first_rr = c->current;
61 return true;