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