varnish-cache/lib/libvarnish/vct.c
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
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 *
16
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
20
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
 * SUCH DAMAGE.
27
 *
28
 * ctype(3) like functions, according to RFC2616
29
 */
30
31
#include "config.h"
32
33
#include <stdlib.h>
34
#include <stdint.h>
35
#include <string.h>
36
37
#include "vdef.h"
38
39
#include "vas.h"
40
#include "vct.h"
41
42
/* NB: VCT always operate in ASCII, don't replace 0x0d with \r etc. */
43
44
#define VCT_UPALPHA     VCT_ALPHA
45
#define VCT_LOALPHA     VCT_ALPHA
46
47
const uint16_t vct_typtab[256] = {
48
        [0x00]  =       VCT_CTL,
49
        [0x01]  =       VCT_CTL,
50
        [0x02]  =       VCT_CTL,
51
        [0x03]  =       VCT_CTL,
52
        [0x04]  =       VCT_CTL,
53
        [0x05]  =       VCT_CTL,
54
        [0x06]  =       VCT_CTL,
55
        [0x07]  =       VCT_CTL,
56
        [0x08]  =       VCT_CTL,
57
        [0x09]  =       VCT_CTL | VCT_SP | VCT_SEPARATOR,
58
        [0x0a]  =       VCT_CTL | VCT_CRLF,
59
        [0x0b]  =       VCT_CTL | VCT_VT,
60
        [0x0c]  =       VCT_CTL,
61
        [0x0d]  =       VCT_CTL | VCT_CRLF,
62
        [0x0e]  =       VCT_CTL,
63
        [0x0f]  =       VCT_CTL,
64
        [0x10]  =       VCT_CTL,
65
        [0x11]  =       VCT_CTL,
66
        [0x12]  =       VCT_CTL,
67
        [0x13]  =       VCT_CTL,
68
        [0x14]  =       VCT_CTL,
69
        [0x15]  =       VCT_CTL,
70
        [0x16]  =       VCT_CTL,
71
        [0x17]  =       VCT_CTL,
72
        [0x18]  =       VCT_CTL,
73
        [0x19]  =       VCT_CTL,
74
        [0x1a]  =       VCT_CTL,
75
        [0x1b]  =       VCT_CTL,
76
        [0x1c]  =       VCT_CTL,
77
        [0x1d]  =       VCT_CTL,
78
        [0x1e]  =       VCT_CTL,
79
        [0x1f]  =       VCT_CTL,
80
        [0x20]  =       VCT_SP | VCT_SEPARATOR,
81
        [0x21]  =       VCT_TCHAR,
82
        [0x22]  =       VCT_SEPARATOR,
83
        [0x23]  =       VCT_TCHAR,
84
        [0x24]  =       VCT_TCHAR,
85
        [0x25]  =       VCT_TCHAR,
86
        [0x26]  =       VCT_TCHAR,
87
        [0x27]  =       VCT_TCHAR,
88
        [0x28]  =       VCT_SEPARATOR,
89
        [0x29]  =       VCT_SEPARATOR,
90
        [0x2a]  =       VCT_TCHAR,
91
        [0x2b]  =       VCT_TCHAR,
92
        [0x2c]  =       VCT_SEPARATOR,
93
        [0x2d]  =       VCT_XMLNAME | VCT_TCHAR | VCT_ID,
94
        [0x2e]  =       VCT_XMLNAME | VCT_TCHAR | VCT_VAR,
95
        [0x2f]  =       VCT_SEPARATOR,
96
        [0x30]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
97
        [0x31]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
98
        [0x32]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
99
        [0x33]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
100
        [0x34]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
101
        [0x35]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
102
        [0x36]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
103
        [0x37]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
104
        [0x38]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
105
        [0x39]  =       VCT_DIGIT | VCT_HEX | VCT_XMLNAME,
106
        [0x3a]  =       VCT_SEPARATOR | VCT_XMLNAMESTART,
107
        [0x3b]  =       VCT_SEPARATOR,
108
        [0x3c]  =       VCT_SEPARATOR,
109
        [0x3d]  =       VCT_SEPARATOR,
110
        [0x3e]  =       VCT_SEPARATOR,
111
        [0x3f]  =       VCT_SEPARATOR,
112
        [0x40]  =       VCT_SEPARATOR,
113
        [0x41]  =       VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
114
        [0x42]  =       VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
115
        [0x43]  =       VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
116
        [0x44]  =       VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
117
        [0x45]  =       VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
118
        [0x46]  =       VCT_UPALPHA | VCT_HEX | VCT_XMLNAMESTART,
119
        [0x47]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
120
        [0x48]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
121
        [0x49]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
122
        [0x4a]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
123
        [0x4b]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
124
        [0x4c]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
125
        [0x4d]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
126
        [0x4e]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
127
        [0x4f]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
128
        [0x50]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
129
        [0x51]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
130
        [0x52]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
131
        [0x53]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
132
        [0x54]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
133
        [0x55]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
134
        [0x56]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
135
        [0x57]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
136
        [0x58]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
137
        [0x59]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
138
        [0x5a]  =       VCT_UPALPHA | VCT_XMLNAMESTART,
139
        [0x5b]  =       VCT_SEPARATOR,
140
        [0x5c]  =       VCT_SEPARATOR,
141
        [0x5d]  =       VCT_SEPARATOR,
142
        [0x5e]  =       VCT_TCHAR,
143
        [0x5f]  =       VCT_XMLNAMESTART | VCT_TCHAR | VCT_ID,
144
        [0x60]  =       VCT_TCHAR,
145
        [0x61]  =       VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
146
        [0x62]  =       VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
147
        [0x63]  =       VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
148
        [0x64]  =       VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
149
        [0x65]  =       VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
150
        [0x66]  =       VCT_LOALPHA | VCT_HEX | VCT_XMLNAMESTART,
151
        [0x67]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
152
        [0x68]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
153
        [0x69]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
154
        [0x6a]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
155
        [0x6b]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
156
        [0x6c]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
157
        [0x6d]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
158
        [0x6e]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
159
        [0x6f]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
160
        [0x70]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
161
        [0x71]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
162
        [0x72]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
163
        [0x73]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
164
        [0x74]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
165
        [0x75]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
166
        [0x76]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
167
        [0x77]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
168
        [0x78]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
169
        [0x79]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
170
        [0x7a]  =       VCT_LOALPHA | VCT_XMLNAMESTART,
171
        [0x7b]  =       VCT_SEPARATOR,
172
        [0x7c]  =       VCT_TCHAR,
173
        [0x7d]  =       VCT_SEPARATOR,
174
        [0x7e]  =       VCT_TCHAR,
175
        [0x7f]  =       VCT_CTL,
176
        [0xb7]  =       VCT_XMLNAME,
177
        [0xc0]  =       VCT_XMLNAMESTART,
178
        [0xc1]  =       VCT_XMLNAMESTART,
179
        [0xc2]  =       VCT_XMLNAMESTART,
180
        [0xc3]  =       VCT_XMLNAMESTART,
181
        [0xc4]  =       VCT_XMLNAMESTART,
182
        [0xc5]  =       VCT_XMLNAMESTART,
183
        [0xc6]  =       VCT_XMLNAMESTART,
184
        [0xc7]  =       VCT_XMLNAMESTART,
185
        [0xc8]  =       VCT_XMLNAMESTART,
186
        [0xc9]  =       VCT_XMLNAMESTART,
187
        [0xca]  =       VCT_XMLNAMESTART,
188
        [0xcb]  =       VCT_XMLNAMESTART,
189
        [0xcc]  =       VCT_XMLNAMESTART,
190
        [0xcd]  =       VCT_XMLNAMESTART,
191
        [0xce]  =       VCT_XMLNAMESTART,
192
        [0xcf]  =       VCT_XMLNAMESTART,
193
        [0xd0]  =       VCT_XMLNAMESTART,
194
        [0xd1]  =       VCT_XMLNAMESTART,
195
        [0xd2]  =       VCT_XMLNAMESTART,
196
        [0xd3]  =       VCT_XMLNAMESTART,
197
        [0xd4]  =       VCT_XMLNAMESTART,
198
        [0xd5]  =       VCT_XMLNAMESTART,
199
        [0xd6]  =       VCT_XMLNAMESTART,
200
        [0xd8]  =       VCT_XMLNAMESTART,
201
        [0xd9]  =       VCT_XMLNAMESTART,
202
        [0xda]  =       VCT_XMLNAMESTART,
203
        [0xdb]  =       VCT_XMLNAMESTART,
204
        [0xdc]  =       VCT_XMLNAMESTART,
205
        [0xdd]  =       VCT_XMLNAMESTART,
206
        [0xde]  =       VCT_XMLNAMESTART,
207
        [0xdf]  =       VCT_XMLNAMESTART,
208
        [0xe0]  =       VCT_XMLNAMESTART,
209
        [0xe1]  =       VCT_XMLNAMESTART,
210
        [0xe2]  =       VCT_XMLNAMESTART,
211
        [0xe3]  =       VCT_XMLNAMESTART,
212
        [0xe4]  =       VCT_XMLNAMESTART,
213
        [0xe5]  =       VCT_XMLNAMESTART,
214
        [0xe6]  =       VCT_XMLNAMESTART,
215
        [0xe7]  =       VCT_XMLNAMESTART,
216
        [0xe8]  =       VCT_XMLNAMESTART,
217
        [0xe9]  =       VCT_XMLNAMESTART,
218
        [0xea]  =       VCT_XMLNAMESTART,
219
        [0xeb]  =       VCT_XMLNAMESTART,
220
        [0xec]  =       VCT_XMLNAMESTART,
221
        [0xed]  =       VCT_XMLNAMESTART,
222
        [0xee]  =       VCT_XMLNAMESTART,
223
        [0xef]  =       VCT_XMLNAMESTART,
224
        [0xf0]  =       VCT_XMLNAMESTART,
225
        [0xf1]  =       VCT_XMLNAMESTART,
226
        [0xf2]  =       VCT_XMLNAMESTART,
227
        [0xf3]  =       VCT_XMLNAMESTART,
228
        [0xf4]  =       VCT_XMLNAMESTART,
229
        [0xf5]  =       VCT_XMLNAMESTART,
230
        [0xf6]  =       VCT_XMLNAMESTART,
231
        [0xf8]  =       VCT_XMLNAMESTART,
232
        [0xf9]  =       VCT_XMLNAMESTART,
233
        [0xfa]  =       VCT_XMLNAMESTART,
234
        [0xfb]  =       VCT_XMLNAMESTART,
235
        [0xfc]  =       VCT_XMLNAMESTART,
236
        [0xfd]  =       VCT_XMLNAMESTART,
237
        [0xfe]  =       VCT_XMLNAMESTART,
238
        [0xff]  =       VCT_XMLNAMESTART,
239
};
240
241
const char *
242 15461
VCT_invalid_name(const char *b, const char *e)
243
{
244
245 15461
        AN(b);
246 15461
        if (e == NULL)
247 1788
                e = strchr(b, '\0');
248 15461
        assert(b < e);
249
250 15461
        if (!vct_isident1(*b))
251 3
                return (b);
252
253 155855
        for (; b < e; b++)
254 140403
                if (!vct_isident(*b))
255 6
                        return (b);
256
257 15452
        return (NULL);
258
}