Coverage Report

Created: 2023-06-07 06:09

/src/varnish-cache/lib/libvarnish/vct.c
Line
Count
Source (jump to first uncovered line)
1
/*-
2
 * Copyright (c) 2006-2010 Varnish Software AS
3
 * All rights reserved.
4
 *
5
 * Author: Poul-Henning Kamp <phk@phk.freebsd.dk>
6
 *
7
 * SPDX-License-Identifier: BSD-2-Clause
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
 *
18
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21
 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
22
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28
 * SUCH DAMAGE.
29
 *
30
 * ctype(3) like functions, according to RFC2616
31
 */
32
33
#include "config.h"
34
35
#include <sys/types.h>
36
37
#include <stdlib.h>
38
#include <stdint.h>
39
#include <string.h>
40
41
#include "vdef.h"
42
43
#include "vas.h"
44
#include "vct.h"
45
46
/* NB: VCT always operate in ASCII, don't replace 0x0d with \r etc. */
47
48
#define VCT_UPALPHA (VCT_ALPHA | VCT_UPPER | VCT_BASE64)
49
#define VCT_LOALPHA (VCT_ALPHA | VCT_LOWER | VCT_BASE64)
50
51
const uint16_t vct_typtab[256] = {
52
  [0x00]  = VCT_CTL,
53
  [0x01]  = VCT_CTL,
54
  [0x02]  = VCT_CTL,
55
  [0x03]  = VCT_CTL,
56
  [0x04]  = VCT_CTL,
57
  [0x05]  = VCT_CTL,
58
  [0x06]  = VCT_CTL,
59
  [0x07]  = VCT_CTL,
60
  [0x08]  = VCT_CTL,
61
  [0x09]  = VCT_CTL | VCT_OWS,
62
  [0x0a]  = VCT_CTL | VCT_CRLF,
63
  [0x0b]  = VCT_CTL | VCT_VT,
64
  [0x0c]  = VCT_CTL,
65
  [0x0d]  = VCT_CTL | VCT_CRLF,
66
  [0x0e]  = VCT_CTL,
67
  [0x0f]  = VCT_CTL,
68
  [0x10]  = VCT_CTL,
69
  [0x11]  = VCT_CTL,
70
  [0x12]  = VCT_CTL,
71
  [0x13]  = VCT_CTL,
72
  [0x14]  = VCT_CTL,
73
  [0x15]  = VCT_CTL,
74
  [0x16]  = VCT_CTL,
75
  [0x17]  = VCT_CTL,
76
  [0x18]  = VCT_CTL,
77
  [0x19]  = VCT_CTL,
78
  [0x1a]  = VCT_CTL,
79
  [0x1b]  = VCT_CTL,
80
  [0x1c]  = VCT_CTL,
81
  [0x1d]  = VCT_CTL,
82
  [0x1e]  = VCT_CTL,
83
  [0x1f]  = VCT_CTL,
84
  [0x20]  = VCT_OWS,
85
  [0x21]  = VCT_TCHAR,
86
  [0x22]  = VCT_SEPARATOR,
87
  [0x23]  = VCT_TCHAR,
88
  [0x24]  = VCT_TCHAR,
89
  [0x25]  = VCT_TCHAR,
90
  [0x26]  = VCT_TCHAR,
91
  [0x27]  = VCT_TCHAR,
92
  [0x28]  = VCT_SEPARATOR,
93
  [0x29]  = VCT_SEPARATOR,
94
  [0x2a]  = VCT_TCHAR,
95
  [0x2b]  = VCT_TCHAR | VCT_BASE64,
96
  [0x2c]  = VCT_SEPARATOR,
97
  [0x2d]  = VCT_XMLNAME | VCT_TCHAR | VCT_ID,
98
  [0x2e]  = VCT_XMLNAME | VCT_TCHAR,
99
  [0x2f]  = VCT_SEPARATOR | VCT_BASE64,
100
  [0x30]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
101
  [0x31]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
102
  [0x32]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
103
  [0x33]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
104
  [0x34]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
105
  [0x35]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
106
  [0x36]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
107
  [0x37]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
108
  [0x38]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
109
  [0x39]  = VCT_DIGIT | VCT_HEX | VCT_XMLNAME | VCT_BASE64,
110
  [0x3a]  = VCT_SEPARATOR | VCT_XMLNAMESTART,
111
  [0x3b]  = VCT_SEPARATOR,
112
  [0x3c]  = VCT_SEPARATOR,
113
  [0x3d]  = VCT_SEPARATOR | VCT_BASE64,
114
  [0x3e]  = VCT_SEPARATOR,
115
  [0x3f]  = VCT_SEPARATOR,
116
  [0x40]  = VCT_SEPARATOR,
117
  [0x41]  = VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
118
  [0x42]  = VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
119
  [0x43]  = VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
120
  [0x44]  = VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
121
  [0x45]  = VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
122
  [0x46]  = VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
123
  [0x47]  = VCT_UPALPHA | VCT_XMLNAMESTART,
124
  [0x48]  = VCT_UPALPHA | VCT_XMLNAMESTART,
125
  [0x49]  = VCT_UPALPHA | VCT_XMLNAMESTART,
126
  [0x4a]  = VCT_UPALPHA | VCT_XMLNAMESTART,
127
  [0x4b]  = VCT_UPALPHA | VCT_XMLNAMESTART,
128
  [0x4c]  = VCT_UPALPHA | VCT_XMLNAMESTART,
129
  [0x4d]  = VCT_UPALPHA | VCT_XMLNAMESTART,
130
  [0x4e]  = VCT_UPALPHA | VCT_XMLNAMESTART,
131
  [0x4f]  = VCT_UPALPHA | VCT_XMLNAMESTART,
132
  [0x50]  = VCT_UPALPHA | VCT_XMLNAMESTART,
133
  [0x51]  = VCT_UPALPHA | VCT_XMLNAMESTART,
134
  [0x52]  = VCT_UPALPHA | VCT_XMLNAMESTART,
135
  [0x53]  = VCT_UPALPHA | VCT_XMLNAMESTART,
136
  [0x54]  = VCT_UPALPHA | VCT_XMLNAMESTART,
137
  [0x55]  = VCT_UPALPHA | VCT_XMLNAMESTART,
138
  [0x56]  = VCT_UPALPHA | VCT_XMLNAMESTART,
139
  [0x57]  = VCT_UPALPHA | VCT_XMLNAMESTART,
140
  [0x58]  = VCT_UPALPHA | VCT_XMLNAMESTART,
141
  [0x59]  = VCT_UPALPHA | VCT_XMLNAMESTART,
142
  [0x5a]  = VCT_UPALPHA | VCT_XMLNAMESTART,
143
  [0x5b]  = VCT_SEPARATOR,
144
  [0x5c]  = VCT_SEPARATOR,
145
  [0x5d]  = VCT_SEPARATOR,
146
  [0x5e]  = VCT_TCHAR,
147
  [0x5f]  = VCT_XMLNAMESTART | VCT_TCHAR | VCT_ID,
148
  [0x60]  = VCT_TCHAR,
149
  [0x61]  = VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
150
  [0x62]  = VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
151
  [0x63]  = VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
152
  [0x64]  = VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
153
  [0x65]  = VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
154
  [0x66]  = VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
155
  [0x67]  = VCT_LOALPHA | VCT_XMLNAMESTART,
156
  [0x68]  = VCT_LOALPHA | VCT_XMLNAMESTART,
157
  [0x69]  = VCT_LOALPHA | VCT_XMLNAMESTART,
158
  [0x6a]  = VCT_LOALPHA | VCT_XMLNAMESTART,
159
  [0x6b]  = VCT_LOALPHA | VCT_XMLNAMESTART,
160
  [0x6c]  = VCT_LOALPHA | VCT_XMLNAMESTART,
161
  [0x6d]  = VCT_LOALPHA | VCT_XMLNAMESTART,
162
  [0x6e]  = VCT_LOALPHA | VCT_XMLNAMESTART,
163
  [0x6f]  = VCT_LOALPHA | VCT_XMLNAMESTART,
164
  [0x70]  = VCT_LOALPHA | VCT_XMLNAMESTART,
165
  [0x71]  = VCT_LOALPHA | VCT_XMLNAMESTART,
166
  [0x72]  = VCT_LOALPHA | VCT_XMLNAMESTART,
167
  [0x73]  = VCT_LOALPHA | VCT_XMLNAMESTART,
168
  [0x74]  = VCT_LOALPHA | VCT_XMLNAMESTART,
169
  [0x75]  = VCT_LOALPHA | VCT_XMLNAMESTART,
170
  [0x76]  = VCT_LOALPHA | VCT_XMLNAMESTART,
171
  [0x77]  = VCT_LOALPHA | VCT_XMLNAMESTART,
172
  [0x78]  = VCT_LOALPHA | VCT_XMLNAMESTART,
173
  [0x79]  = VCT_LOALPHA | VCT_XMLNAMESTART,
174
  [0x7a]  = VCT_LOALPHA | VCT_XMLNAMESTART,
175
  [0x7b]  = VCT_SEPARATOR,
176
  [0x7c]  = VCT_TCHAR,
177
  [0x7d]  = VCT_SEPARATOR,
178
  [0x7e]  = VCT_TCHAR,
179
  [0x7f]  = VCT_CTL,
180
  [0xb7]  = VCT_XMLNAME,
181
  [0xc0]  = VCT_XMLNAMESTART,
182
  [0xc1]  = VCT_XMLNAMESTART,
183
  [0xc2]  = VCT_XMLNAMESTART,
184
  [0xc3]  = VCT_XMLNAMESTART,
185
  [0xc4]  = VCT_XMLNAMESTART,
186
  [0xc5]  = VCT_XMLNAMESTART,
187
  [0xc6]  = VCT_XMLNAMESTART,
188
  [0xc7]  = VCT_XMLNAMESTART,
189
  [0xc8]  = VCT_XMLNAMESTART,
190
  [0xc9]  = VCT_XMLNAMESTART,
191
  [0xca]  = VCT_XMLNAMESTART,
192
  [0xcb]  = VCT_XMLNAMESTART,
193
  [0xcc]  = VCT_XMLNAMESTART,
194
  [0xcd]  = VCT_XMLNAMESTART,
195
  [0xce]  = VCT_XMLNAMESTART,
196
  [0xcf]  = VCT_XMLNAMESTART,
197
  [0xd0]  = VCT_XMLNAMESTART,
198
  [0xd1]  = VCT_XMLNAMESTART,
199
  [0xd2]  = VCT_XMLNAMESTART,
200
  [0xd3]  = VCT_XMLNAMESTART,
201
  [0xd4]  = VCT_XMLNAMESTART,
202
  [0xd5]  = VCT_XMLNAMESTART,
203
  [0xd6]  = VCT_XMLNAMESTART,
204
  [0xd8]  = VCT_XMLNAMESTART,
205
  [0xd9]  = VCT_XMLNAMESTART,
206
  [0xda]  = VCT_XMLNAMESTART,
207
  [0xdb]  = VCT_XMLNAMESTART,
208
  [0xdc]  = VCT_XMLNAMESTART,
209
  [0xdd]  = VCT_XMLNAMESTART,
210
  [0xde]  = VCT_XMLNAMESTART,
211
  [0xdf]  = VCT_XMLNAMESTART,
212
  [0xe0]  = VCT_XMLNAMESTART,
213
  [0xe1]  = VCT_XMLNAMESTART,
214
  [0xe2]  = VCT_XMLNAMESTART,
215
  [0xe3]  = VCT_XMLNAMESTART,
216
  [0xe4]  = VCT_XMLNAMESTART,
217
  [0xe5]  = VCT_XMLNAMESTART,
218
  [0xe6]  = VCT_XMLNAMESTART,
219
  [0xe7]  = VCT_XMLNAMESTART,
220
  [0xe8]  = VCT_XMLNAMESTART,
221
  [0xe9]  = VCT_XMLNAMESTART,
222
  [0xea]  = VCT_XMLNAMESTART,
223
  [0xeb]  = VCT_XMLNAMESTART,
224
  [0xec]  = VCT_XMLNAMESTART,
225
  [0xed]  = VCT_XMLNAMESTART,
226
  [0xee]  = VCT_XMLNAMESTART,
227
  [0xef]  = VCT_XMLNAMESTART,
228
  [0xf0]  = VCT_XMLNAMESTART,
229
  [0xf1]  = VCT_XMLNAMESTART,
230
  [0xf2]  = VCT_XMLNAMESTART,
231
  [0xf3]  = VCT_XMLNAMESTART,
232
  [0xf4]  = VCT_XMLNAMESTART,
233
  [0xf5]  = VCT_XMLNAMESTART,
234
  [0xf6]  = VCT_XMLNAMESTART,
235
  [0xf8]  = VCT_XMLNAMESTART,
236
  [0xf9]  = VCT_XMLNAMESTART,
237
  [0xfa]  = VCT_XMLNAMESTART,
238
  [0xfb]  = VCT_XMLNAMESTART,
239
  [0xfc]  = VCT_XMLNAMESTART,
240
  [0xfd]  = VCT_XMLNAMESTART,
241
  [0xfe]  = VCT_XMLNAMESTART,
242
  [0xff]  = VCT_XMLNAMESTART,
243
};
244
245
const uint8_t vct_lowertab[256] = {
246
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 0x00
247
  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, // 0x08
248
  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 0x10
249
  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, // 0x18
250
  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, // 0x20
251
  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, // 0x28
252
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, // 0x30
253
  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, // 0x38
254
  0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, // 0x40
255
  0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, // 0x48
256
  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, // 0x50
257
  0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, // 0x58
258
  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, // 0x60
259
  0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, // 0x68
260
  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, // 0x70
261
  0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, // 0x78
262
  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, // 0x80
263
  0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, // 0x88
264
  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, // 0x90
265
  0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, // 0x98
266
  0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, // 0xa0
267
  0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, // 0xa8
268
  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, // 0xb0
269
  0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, // 0xb8
270
  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, // 0xc0
271
  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, // 0xc8
272
  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, // 0xd0
273
  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, // 0xd8
274
  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, // 0xe0
275
  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, // 0xe8
276
  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, // 0xf0
277
  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, // 0xf8
278
};
279
280
const char *
281
VCT_invalid_name(const char *b, const char *e)
282
0
{
283
284
0
  AN(b);
285
0
  if (e == NULL)
286
0
    e = strchr(b, '\0');
287
0
  assert(b < e);
288
289
0
  if (!vct_isident1(*b))
290
0
    return (b);
291
292
0
  for (; b < e; b++)
293
0
    if (!vct_isident(*b))
294
0
      return (b);
295
296
0
  return (NULL);
297
0
}
298
299
#ifdef TEST_DRIVER
300
301
#include <ctype.h>
302
#include <locale.h>
303
304
int
305
main(int argc, char **argv)
306
{
307
  int i;
308
  const char *p;
309
310
  (void)argc;
311
  (void)argv;
312
313
  AN(setlocale(LC_ALL, "C"));
314
315
  p = "";
316
  assert(vct_iscrlf(p, p) == 0);
317
318
  for (i = 0x20; i < 0x7f; i++)
319
    assert(vct_lowertab[i] == tolower(i));
320
321
  assert(vct_casecmp("AZaz", "azAZ") == 0);
322
  assert(vct_casecmp("AZaz", "azAY") > 0);
323
  assert(vct_casecmp("AZay", "azAZ") < 0);
324
  assert(vct_casecmp("AZaz_", "azAZ") > 0);
325
  assert(vct_casecmp("AZaz", "azAZ_") < 0);
326
  assert(vct_casecmp("", "") == 0);
327
328
  assert(vct_caselencmp("AZaz_", "azAZ", 4) == 0);
329
  assert(vct_caselencmp("AZaz", "azAZ_", 4) == 0);
330
331
  assert(vct_caselencmp("AZaz1", "azAZ1", 4) == 0);
332
  assert(vct_caselencmp("AZaz1", "azAY1", 4) > 0);
333
  assert(vct_caselencmp("AZay1", "azAZ1", 4) < 0);
334
335
  assert(vct_caselencmp("AZaz", "azAZ", 5) == 0);
336
  assert(vct_caselencmp("AZaz ", "azAY", 5) > 0);
337
  assert(vct_caselencmp("AZay ", "azAZ", 5) < 0);
338
339
  assert(vct_caselencmp("AZaz", "azAZ1", 5) < 0);
340
  assert(vct_caselencmp("AZaz1", "azAZ", 5) > 0);
341
342
343
  assert(vct_caselencmp("A", "B", 0) == 0);
344
345
  return (0);
346
}
347
348
#endif /* TEST_DRIVER */