Bug Summary

File:src/libexec/ftpd/obj/ftpcmd.c
Warning:line 1084, column 13
Attempt to free released memory

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ftpcmd.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/libexec/ftpd/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/libexec/ftpd -I /usr/src/libexec/ftpd/../../bin/ls -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/libexec/ftpd/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c ftpcmd.c
1#include <stdlib.h>
2#include <string.h>
3#define YYBYACC1 1
4#define YYMAJOR1 1
5#define YYMINOR9 9
6#define YYLEXyylex() yylex()
7#define YYEMPTY-1 -1
8#define yyclearin(yychar=(-1)) (yychar=(YYEMPTY-1))
9#define yyerrok(yyerrflag=0) (yyerrflag=0)
10#define YYRECOVERING()(yyerrflag!=0) (yyerrflag!=0)
11#define YYPREFIX"yy" "yy"
12#line 41 "/usr/src/libexec/ftpd/ftpcmd.y"
13
14#include <sys/types.h>
15#include <sys/socket.h>
16#include <sys/stat.h>
17
18#include <netinet/in.h>
19#include <arpa/ftp.h>
20
21#include <ctype.h>
22#include <errno(*__errno()).h>
23#include <glob.h>
24#include <pwd.h>
25#include <signal.h>
26#include <stdio.h>
27#include <stdlib.h>
28#include <string.h>
29#include <syslog.h>
30#include <time.h>
31#include <unistd.h>
32#include <netdb.h>
33#include <limits.h>
34
35#include "monitor.h"
36#include "extern.h"
37
38extern union sockunion data_dest;
39extern int logged_in;
40extern struct passwd *pw;
41extern int guest;
42extern int logging;
43extern int type;
44extern int form;
45extern int debug;
46extern int timeout;
47extern int maxtimeout;
48extern int pdata;
49extern char hostname[], remotehost[];
50extern char proctitle[];
51extern int usedefault;
52extern int transflag;
53extern char tmpline[];
54extern int portcheck;
55extern union sockunion his_addr;
56extern int umaskchange;
57
58off_t restart_point;
59
60static int cmd_type;
61static int cmd_form;
62static int cmd_bytesz;
63static int state;
64static int quit;
65char cbuf[512];
66char *fromname;
67
68#line 98 "/usr/src/libexec/ftpd/ftpcmd.y"
69#ifndef YYSTYPE_DEFINED
70#define YYSTYPE_DEFINED
71typedef union {
72 int i;
73 off_t o;
74 char *s;
75} YYSTYPE;
76#endif /* YYSTYPE_DEFINED */
77#line 78 "ftpcmd.c"
78#define A257 257
79#define B258 258
80#define C259 259
81#define E260 260
82#define F261 261
83#define I262 262
84#define L263 263
85#define N264 264
86#define P265 265
87#define R266 266
88#define S267 267
89#define T268 268
90#define SP269 269
91#define CRLF270 270
92#define COMMA271 271
93#define ALL272 272
94#define USER273 273
95#define PASS274 274
96#define ACCT275 275
97#define REIN276 276
98#define QUIT277 277
99#define PORT278 278
100#define PASV279 279
101#define TYPE280 280
102#define STRU281 281
103#define MODE282 282
104#define RETR283 283
105#define STOR284 284
106#define APPE285 285
107#define MLFL286 286
108#define MAIL287 287
109#define MSND288 288
110#define MSOM289 289
111#define MSAM290 290
112#define MRSQ291 291
113#define MRCP292 292
114#define ALLO293 293
115#define REST294 294
116#define RNFR295 295
117#define RNTO296 296
118#define ABOR297 297
119#define DELE298 298
120#define CWD299 299
121#define LIST300 300
122#define NLST301 301
123#define SITE302 302
124#define STAT303 303
125#define HELP304 304
126#define NOOP305 305
127#define MKD306 306
128#define RMD307 307
129#define PWD308 308
130#define CDUP309 309
131#define STOU310 310
132#define SMNT311 311
133#define SYST312 312
134#define SIZE313 313
135#define MDTM314 314
136#define LPRT315 315
137#define LPSV316 316
138#define EPRT317 317
139#define EPSV318 318
140#define UMASK319 319
141#define IDLE320 320
142#define CHMOD321 321
143#define LEXERR322 322
144#define STRING323 323
145#define NUMBER324 324
146#define BIGNUM325 325
147#define YYERRCODE256 256
148const short yylhs[] =
149 { -1,
150 0, 0, 0, 17, 17, 17, 17, 17, 17, 17,
151 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
152 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
153 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
154 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
155 17, 17, 17, 18, 18, 16, 15, 15, 4, 12,
156 12, 9, 10, 11, 8, 8, 8, 7, 7, 7,
157 7, 7, 7, 7, 7, 5, 5, 5, 6, 6,
158 6, 14, 13, 3, 1, 2,
159};
160const short yylen[] =
161 { 2,
162 0, 2, 2, 4, 4, 5, 5, 5, 5, 3,
163 3, 5, 5, 3, 5, 5, 5, 5, 9, 5,
164 5, 5, 3, 5, 3, 5, 5, 3, 5, 5,
165 3, 3, 5, 2, 4, 2, 5, 5, 3, 3,
166 4, 6, 5, 7, 9, 5, 7, 5, 3, 5,
167 5, 2, 1, 5, 5, 1, 0, 1, 1, 1,
168 1, 11, 17, 41, 1, 1, 1, 1, 3, 1,
169 3, 1, 1, 3, 2, 1, 1, 1, 1, 1,
170 1, 1, 1, 1, 0, 0,
171};
172const short yydefred[] =
173 { 1,
174 0, 53, 0, 0, 0, 86, 86, 85, 85, 85,
175 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
176 85, 85, 0, 85, 0, 0, 85, 85, 85, 85,
177 85, 85, 85, 85, 86, 86, 86, 85, 2, 3,
178 0, 0, 52, 0, 0, 0, 0, 0, 0, 0,
179 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
180 0, 0, 0, 34, 36, 0, 0, 0, 0, 0,
181 0, 0, 0, 0, 0, 0, 0, 56, 0, 58,
182 0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
183 0, 0, 0, 31, 0, 0, 32, 0, 25, 0,
184 23, 0, 85, 85, 0, 0, 28, 0, 0, 0,
185 39, 40, 0, 49, 0, 0, 0, 11, 0, 0,
186 14, 4, 5, 0, 0, 0, 0, 72, 0, 0,
187 76, 78, 77, 0, 80, 81, 79, 0, 83, 82,
188 0, 0, 0, 0, 60, 61, 0, 0, 0, 0,
189 0, 0, 0, 0, 41, 0, 0, 0, 0, 35,
190 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
191 0, 0, 6, 0, 0, 0, 59, 75, 15, 16,
192 17, 20, 21, 22, 0, 18, 55, 54, 30, 29,
193 33, 26, 24, 0, 0, 43, 0, 0, 46, 27,
194 37, 38, 48, 50, 51, 0, 7, 8, 9, 13,
195 12, 0, 67, 65, 66, 69, 71, 74, 0, 42,
196 84, 0, 0, 0, 0, 0, 0, 44, 0, 47,
197 0, 0, 0, 0, 0, 0, 19, 45, 0, 0,
198 0, 0, 0, 0, 0, 0, 0, 62, 0, 0,
199 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
200 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
201 0, 0, 0, 0, 0, 0, 0, 0, 64,
202};
203const short yydgoto[] =
204 { 1,
205 46, 44, 222, 178, 134, 138, 130, 216, 125, 167,
206 168, 147, 140, 141, 81, 79, 39, 40,
207};
208const short yysindex[] =
209 { 0,
210 -211, 0, -263, -256, -253, 0, 0, 0, 0, 0,
211 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, -226, 0, -254, -224, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
214 -264, -244, 0, -169, -155, -147, -136, -135, -134, -133,
215 -132, -131, -130, -129, -127, -126, -124, -194, -192, -157,
216 -295, -151, -180, 0, 0, -123, -122, -121, -120, -118,
217 -117, -115, -114, -113, -112, -110, -149, 0, -109, 0,
218 -108, -176, 0, -146, -205, -247, -171, -171, -171, -167,
219 -260, -171, -171, 0, -171, -171, 0, -171, 0, -163,
220 0, -144, 0, 0, -156, -171, 0, -107, -171, -171,
221 0, 0, -171, 0, -171, -171, -159, 0, -154, -269,
222 0, 0, 0, -105, -103, -101, -99, 0, -267, -98,
223 0, 0, 0, -97, 0, 0, 0, -96, 0, 0,
224 -95, -94, -93, -142, 0, 0, -92, -91, -90, -89,
225 -87, -86, -85, -152, 0, -140, -83, -138, -82, 0,
226 -81, -80, -79, -78, -77, -84, -76, -75, -74, -73,
227 -72, -125, 0, -245, -245, -119, 0, 0, 0, 0,
228 0, 0, 0, 0, -66, 0, 0, 0, 0, 0,
229 0, 0, 0, -69, -116, 0, -116, -111, 0, 0,
230 0, 0, 0, 0, 0, -106, 0, 0, 0, 0,
231 0, -68, 0, 0, 0, 0, 0, 0, -67, 0,
232 0, -64, -65, -63, -62, -104, -102, 0, -171, 0,
233 -100, -61, -59, -58, -57, -71, 0, 0, -70, -56,
234 -55, -60, -54, -52, -50, -53, -51, 0, -48, -49,
235 -46, -47, -45, -44, -43, -42, -41, -40, -39, -38,
236 -37, -36, -35, -34, -33, -32, -31, -30, -29, -28,
237 -27, -26, -25, -24, -23, -22, -21, -20, 0,};
238const short yyrindex[] =
239 { 0,
240 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
241 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
242 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
243 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
244 0, -19, 0, 0, 0, 0, 0, 0, 0, 0,
245 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
246 -17, 0, 0, 0, 0, 0, 0, 0, 0, 0,
247 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
248 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
249 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
250 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
251 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
252 0, 0, 0, 0, 0, -18, -15, 0, -14, 0,
253 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
254 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
256 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
257 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
258 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
259 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
260 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
261 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
262 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
263 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
264 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
265 0, 0, 0, 0, -13, 0, 0, 0, 0, 0,
266 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
267 0, 0, 0, 0, 0, 0, 0, 0, 0,};
268const short yygindex[] =
269 { 0,
270 20, 73, 30, 6, 0, 0, 0, 42, 0, 0,
271 0, 0, 0, -88, 0, 0, 0, 0,
272};
273#define YYTABLESIZE304 304
274const short yytable[] =
275 { 142,
276 143, 176, 170, 148, 149, 41, 150, 151, 102, 152,
277 135, 136, 42, 213, 63, 64, 43, 159, 214, 137,
278 161, 162, 215, 103, 163, 104, 164, 165, 47, 48,
279 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
280 59, 60, 61, 62, 2, 65, 66, 67, 68, 69,
281 70, 71, 72, 73, 171, 131, 177, 77, 78, 132,
282 133, 3, 4, 145, 146, 5, 6, 7, 8, 9,
283 10, 11, 12, 13, 96, 97, 98, 99, 80, 45,
284 105, 14, 15, 16, 17, 18, 19, 20, 21, 22,
285 23, 24, 25, 26, 27, 28, 29, 30, 31, 82,
286 32, 33, 34, 35, 36, 37, 38, 74, 75, 76,
287 126, 100, 101, 127, 83, 128, 129, 106, 107, 120,
288 121, 84, 156, 157, 154, 155, 185, 186, 195, 196,
289 198, 199, 85, 86, 87, 88, 89, 90, 91, 92,
290 234, 93, 108, 94, 95, 109, 110, 124, 111, 112,
291 113, 139, 114, 115, 116, 117, 144, 118, 119, 153,
292 122, 123, 160, 158, 166, 172, 173, 174, 169, 175,
293 194, 179, 180, 181, 182, 183, 184, 187, 188, 189,
294 190, 218, 191, 192, 193, 197, 206, 200, 201, 202,
295 203, 204, 205, 207, 208, 209, 210, 211, 212, 219,
296 220, 227, 226, 229, 177, 228, 230, 221, 231, 236,
297 237, 238, 224, 239, 242, 243, 217, 225, 246, 232,
298 247, 233, 250, 235, 252, 254, 223, 256, 0, 258,
299 0, 260, 0, 262, 0, 264, 0, 266, 0, 268,
300 0, 270, 0, 272, 0, 274, 0, 276, 0, 278,
301 57, 68, 240, 241, 70, 73, 63, 0, 0, 0,
302 0, 0, 0, 244, 0, 0, 0, 0, 0, 245,
303 248, 0, 249, 0, 251, 0, 253, 0, 0, 255,
304 0, 257, 0, 259, 0, 261, 0, 263, 0, 265,
305 0, 267, 0, 269, 0, 271, 0, 273, 0, 275,
306 0, 277, 85, 279,
307};
308const short yycheck[] =
309 { 88,
310 89, 269, 272, 92, 93, 269, 95, 96, 304, 98,
311 258, 259, 269, 259, 269, 270, 270, 106, 264, 267,
312 109, 110, 268, 319, 113, 321, 115, 116, 9, 10,
313 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
314 21, 22, 269, 24, 256, 270, 27, 28, 29, 30,
315 31, 32, 33, 34, 324, 261, 324, 38, 323, 265,
316 266, 273, 274, 324, 325, 277, 278, 279, 280, 281,
317 282, 283, 284, 285, 269, 270, 269, 270, 323, 7,
318 61, 293, 294, 295, 296, 297, 298, 299, 300, 301,
319 302, 303, 304, 305, 306, 307, 308, 309, 310, 269,
320 312, 313, 314, 315, 316, 317, 318, 35, 36, 37,
321 257, 269, 270, 260, 270, 262, 263, 269, 270, 269,
322 270, 269, 103, 104, 269, 270, 269, 270, 269, 270,
323 269, 270, 269, 269, 269, 269, 269, 269, 269, 269,
324 229, 269, 323, 270, 269, 269, 269, 324, 270, 270,
325 269, 323, 270, 269, 269, 269, 324, 270, 269, 323,
326 270, 270, 270, 320, 324, 271, 270, 269, 323, 269,
327 323, 270, 270, 270, 270, 270, 270, 270, 270, 270,
328 270, 176, 270, 270, 270, 269, 271, 270, 270, 270,
329 270, 270, 270, 270, 270, 270, 270, 270, 324, 266,
330 270, 269, 271, 269, 324, 270, 270, 324, 271, 271,
331 270, 270, 324, 271, 271, 271, 175, 324, 271, 324,
332 271, 324, 271, 324, 271, 271, 197, 271, -1, 271,
333 -1, 271, -1, 271, -1, 271, -1, 271, -1, 271,
334 -1, 271, -1, 271, -1, 271, -1, 271, -1, 271,
335 270, 270, 324, 324, 270, 270, 270, -1, -1, -1,
336 -1, -1, -1, 324, -1, -1, -1, -1, -1, 324,
337 324, -1, 324, -1, 324, -1, 324, -1, -1, 324,
338 -1, 324, -1, 324, -1, 324, -1, 324, -1, 324,
339 -1, 324, -1, 324, -1, 324, -1, 324, -1, 324,
340 -1, 324, 320, 324,
341};
342#define YYFINAL1 1
343#ifndef YYDEBUG0
344#define YYDEBUG0 0
345#endif
346#define YYMAXTOKEN325 325
347#if YYDEBUG0
348const char * const yyname[] =
349 {
350"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3550,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3560,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"A","B","C","E","F","I","L","N",
357"P","R","S","T","SP","CRLF","COMMA","ALL","USER","PASS","ACCT","REIN","QUIT",
358"PORT","PASV","TYPE","STRU","MODE","RETR","STOR","APPE","MLFL","MAIL","MSND",
359"MSOM","MSAM","MRSQ","MRCP","ALLO","REST","RNFR","RNTO","ABOR","DELE","CWD",
360"LIST","NLST","SITE","STAT","HELP","NOOP","MKD","RMD","PWD","CDUP","STOU",
361"SMNT","SYST","SIZE","MDTM","LPRT","LPSV","EPRT","EPSV","UMASK","IDLE","CHMOD",
362"LEXERR","STRING","NUMBER","BIGNUM",
363};
364const char * const yyrule[] =
365 {"$accept : cmd_list",
366"cmd_list :",
367"cmd_list : cmd_list cmd",
368"cmd_list : cmd_list rcmd",
369"cmd : USER SP username CRLF",
370"cmd : PASS SP password CRLF",
371"cmd : PORT check_login_epsvall SP host_port CRLF",
372"cmd : LPRT check_login_epsvall SP host_long_port4 CRLF",
373"cmd : LPRT check_login_epsvall SP host_long_port6 CRLF",
374"cmd : EPRT check_login_epsvall SP STRING CRLF",
375"cmd : PASV check_login_epsvall CRLF",
376"cmd : LPSV check_login_epsvall CRLF",
377"cmd : EPSV check_login SP NUMBER CRLF",
378"cmd : EPSV check_login SP ALL CRLF",
379"cmd : EPSV check_login CRLF",
380"cmd : TYPE check_login SP type_code CRLF",
381"cmd : STRU check_login SP struct_code CRLF",
382"cmd : MODE check_login SP mode_code CRLF",
383"cmd : ALLO check_login SP NUMBER CRLF",
384"cmd : ALLO check_login SP NUMBER SP R SP NUMBER CRLF",
385"cmd : RETR check_login SP pathname CRLF",
386"cmd : STOR check_login SP pathname CRLF",
387"cmd : APPE check_login SP pathname CRLF",
388"cmd : NLST check_login CRLF",
389"cmd : NLST check_login SP STRING CRLF",
390"cmd : LIST check_login CRLF",
391"cmd : LIST check_login SP pathname CRLF",
392"cmd : STAT check_login SP pathname CRLF",
393"cmd : STAT check_login CRLF",
394"cmd : DELE check_login SP pathname CRLF",
395"cmd : RNTO check_login SP pathname CRLF",
396"cmd : ABOR check_login CRLF",
397"cmd : CWD check_login CRLF",
398"cmd : CWD check_login SP pathname CRLF",
399"cmd : HELP CRLF",
400"cmd : HELP SP STRING CRLF",
401"cmd : NOOP CRLF",
402"cmd : MKD check_login SP pathname CRLF",
403"cmd : RMD check_login SP pathname CRLF",
404"cmd : PWD check_login CRLF",
405"cmd : CDUP check_login CRLF",
406"cmd : SITE SP HELP CRLF",
407"cmd : SITE SP HELP SP STRING CRLF",
408"cmd : SITE SP UMASK check_login CRLF",
409"cmd : SITE SP UMASK check_login SP octal_number CRLF",
410"cmd : SITE SP CHMOD check_login SP octal_number SP pathname CRLF",
411"cmd : SITE SP check_login IDLE CRLF",
412"cmd : SITE SP check_login IDLE SP NUMBER CRLF",
413"cmd : STOU check_login SP pathname CRLF",
414"cmd : SYST check_login CRLF",
415"cmd : SIZE check_login SP pathname CRLF",
416"cmd : MDTM check_login SP pathname CRLF",
417"cmd : QUIT CRLF",
418"cmd : error",
419"rcmd : RNFR check_login SP pathname CRLF",
420"rcmd : REST check_login SP file_size CRLF",
421"username : STRING",
422"password :",
423"password : STRING",
424"byte_size : NUMBER",
425"file_size : NUMBER",
426"file_size : BIGNUM",
427"host_port : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER",
428"host_long_port4 : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER",
429"host_long_port6 : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER",
430"form_code : N",
431"form_code : T",
432"form_code : C",
433"type_code : A",
434"type_code : A SP form_code",
435"type_code : E",
436"type_code : E SP form_code",
437"type_code : I",
438"type_code : L",
439"type_code : L SP byte_size",
440"type_code : L byte_size",
441"struct_code : F",
442"struct_code : R",
443"struct_code : P",
444"mode_code : S",
445"mode_code : B",
446"mode_code : C",
447"pathname : pathstring",
448"pathstring : STRING",
449"octal_number : NUMBER",
450"check_login :",
451"check_login_epsvall :",
452};
453#endif
454#ifdef YYSTACKSIZE10000
455#undef YYMAXDEPTH10000
456#define YYMAXDEPTH10000 YYSTACKSIZE10000
457#else
458#ifdef YYMAXDEPTH10000
459#define YYSTACKSIZE10000 YYMAXDEPTH10000
460#else
461#define YYSTACKSIZE10000 10000
462#define YYMAXDEPTH10000 10000
463#endif
464#endif
465#define YYINITSTACKSIZE200 200
466/* LINTUSED */
467int yydebug;
468int yynerrs;
469int yyerrflag;
470int yychar;
471short *yyssp;
472YYSTYPE *yyvsp;
473YYSTYPE yyval;
474YYSTYPE yylval;
475short *yyss;
476short *yysslim;
477YYSTYPE *yyvs;
478unsigned int yystacksize;
479int yyparse(void);
480#line 984 "/usr/src/libexec/ftpd/ftpcmd.y"
481
482#define CMD0 0 /* beginning of command */
483#define ARGS1 1 /* expect miscellaneous arguments */
484#define STR12 2 /* expect SP followed by STRING */
485#define STR23 3 /* expect STRING */
486#define OSTR4 4 /* optional SP then STRING */
487#define ZSTR15 5 /* SP then optional STRING */
488#define ZSTR26 6 /* optional STRING after SP */
489#define SITECMD7 7 /* SITE command */
490#define NSTR8 8 /* Number followed by a string */
491
492struct tab {
493 char *name;
494 short token;
495 short state;
496 short implemented; /* 1 if command is implemented */
497 char *help;
498};
499
500struct tab cmdtab[] = { /* In order defined in RFC 765 */
501 { "USER", USER273, STR12, 1, "<sp> username" },
502 { "PASS", PASS274, ZSTR15, 1, "<sp> password" },
503 { "ACCT", ACCT275, STR12, 0, "(specify account)" },
504 { "SMNT", SMNT311, ARGS1, 0, "(structure mount)" },
505 { "REIN", REIN276, ARGS1, 0, "(reinitialize server state)" },
506 { "QUIT", QUIT277, ARGS1, 1, "(terminate service)", },
507 { "PORT", PORT278, ARGS1, 1, "<sp> b0, b1, b2, b3, b4" },
508 { "LPRT", LPRT315, ARGS1, 1, "<sp> af, hal, h1, h2, h3,..., pal, p1, p2..." },
509 { "EPRT", EPRT317, STR12, 1, "<sp> |af|addr|port|" },
510 { "PASV", PASV279, ARGS1, 1, "(set server in passive mode)" },
511 { "LPSV", LPSV316, ARGS1, 1, "(set server in passive mode)" },
512 { "EPSV", EPSV318, ARGS1, 1, "[<sp> af|ALL]" },
513 { "TYPE", TYPE280, ARGS1, 1, "<sp> [ A | E | I | L ]" },
514 { "STRU", STRU281, ARGS1, 1, "(specify file structure)" },
515 { "MODE", MODE282, ARGS1, 1, "(specify transfer mode)" },
516 { "RETR", RETR283, STR12, 1, "<sp> file-name" },
517 { "STOR", STOR284, STR12, 1, "<sp> file-name" },
518 { "APPE", APPE285, STR12, 1, "<sp> file-name" },
519 { "MLFL", MLFL286, OSTR4, 0, "(mail file)" },
520 { "MAIL", MAIL287, OSTR4, 0, "(mail to user)" },
521 { "MSND", MSND288, OSTR4, 0, "(mail send to terminal)" },
522 { "MSOM", MSOM289, OSTR4, 0, "(mail send to terminal or mailbox)" },
523 { "MSAM", MSAM290, OSTR4, 0, "(mail send to terminal and mailbox)" },
524 { "MRSQ", MRSQ291, OSTR4, 0, "(mail recipient scheme question)" },
525 { "MRCP", MRCP292, STR12, 0, "(mail recipient)" },
526 { "ALLO", ALLO293, ARGS1, 1, "allocate storage (vacuously)" },
527 { "REST", REST294, ARGS1, 1, "<sp> offset (restart command)" },
528 { "RNFR", RNFR295, STR12, 1, "<sp> file-name" },
529 { "RNTO", RNTO296, STR12, 1, "<sp> file-name" },
530 { "ABOR", ABOR297, ARGS1, 1, "(abort operation)" },
531 { "DELE", DELE298, STR12, 1, "<sp> file-name" },
532 { "CWD", CWD299, OSTR4, 1, "[ <sp> directory-name ]" },
533 { "XCWD", CWD299, OSTR4, 1, "[ <sp> directory-name ]" },
534 { "LIST", LIST300, OSTR4, 1, "[ <sp> path-name ]" },
535 { "NLST", NLST301, OSTR4, 1, "[ <sp> path-name ]" },
536 { "SITE", SITE302, SITECMD7, 1, "site-cmd [ <sp> arguments ]" },
537 { "SYST", SYST312, ARGS1, 1, "(get type of operating system)" },
538 { "STAT", STAT303, OSTR4, 1, "[ <sp> path-name ]" },
539 { "HELP", HELP304, OSTR4, 1, "[ <sp> <string> ]" },
540 { "NOOP", NOOP305, ARGS1, 1, "" },
541 { "MKD", MKD306, STR12, 1, "<sp> path-name" },
542 { "XMKD", MKD306, STR12, 1, "<sp> path-name" },
543 { "RMD", RMD307, STR12, 1, "<sp> path-name" },
544 { "XRMD", RMD307, STR12, 1, "<sp> path-name" },
545 { "PWD", PWD308, ARGS1, 1, "(return current directory)" },
546 { "XPWD", PWD308, ARGS1, 1, "(return current directory)" },
547 { "CDUP", CDUP309, ARGS1, 1, "(change to parent directory)" },
548 { "XCUP", CDUP309, ARGS1, 1, "(change to parent directory)" },
549 { "STOU", STOU310, STR12, 1, "<sp> file-name" },
550 { "SIZE", SIZE313, OSTR4, 1, "<sp> path-name" },
551 { "MDTM", MDTM314, OSTR4, 1, "<sp> path-name" },
552 { NULL((void *)0), 0, 0, 0, 0 }
553};
554
555struct tab sitetab[] = {
556 { "UMASK", UMASK319, ARGS1, 1, "[ <sp> umask ]" },
557 { "IDLE", IDLE320, ARGS1, 1, "[ <sp> maximum-idle-time ]" },
558 { "CHMOD", CHMOD321, NSTR8, 1, "<sp> mode <sp> file-name" },
559 { "HELP", HELP304, OSTR4, 1, "[ <sp> <string> ]" },
560 { NULL((void *)0), 0, 0, 0, 0 }
561};
562
563static void help(struct tab *, char *);
564static struct tab *
565 lookup(struct tab *, const char *);
566static void sizecmd(const char *);
567static int yylex(void);
568
569extern int epsvall;
570
571static struct tab *
572lookup(struct tab *p, const char *cmd)
573{
574
575 for (; p->name != NULL((void *)0); p++)
576 if (strcmp(cmd, p->name) == 0)
577 return (p);
578 return (NULL((void *)0));
579}
580
581#include <arpa/telnet.h>
582
583/*
584 * get_line - a hacked up version of fgets to ignore TELNET escape codes.
585 */
586int
587get_line(char *s, int n)
588{
589 int c;
590 char *cs;
591
592 cs = s;
593/* tmpline may contain saved command from urgent mode interruption */
594 for (c = 0; tmpline[c] != '\0' && --n > 0; ++c) {
595 *cs++ = tmpline[c];
596 if (tmpline[c] == '\n') {
597 *cs++ = '\0';
598 if (debug)
599 syslog(LOG_DEBUG7, "command: %s", s);
600 tmpline[0] = '\0';
601 return(0);
602 }
603 if (c == 0)
604 tmpline[0] = '\0';
605 }
606 while ((c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget(
(&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc)
((&__sF[0])))
) != EOF(-1)) {
607 c &= 0377;
608 if (c == IAC255) {
609 if ((c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget(
(&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc)
((&__sF[0])))
) != EOF(-1)) {
610 c &= 0377;
611 switch (c) {
612 case WILL251:
613 case WONT252:
614 c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget(
(&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc)
((&__sF[0])))
;
615 printf("%c%c%c", IAC255, DONT254, 0377&c);
616 (void) fflush(stdout(&__sF[1]));
617 continue;
618 case DO253:
619 case DONT254:
620 c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget(
(&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc)
((&__sF[0])))
;
621 printf("%c%c%c", IAC255, WONT252, 0377&c);
622 (void) fflush(stdout(&__sF[1]));
623 continue;
624 case IAC255:
625 break;
626 default:
627 continue; /* ignore command */
628 }
629 }
630 }
631 *cs++ = c;
632 if (--n <= 0) {
633 /*
634 * If command doesn't fit into buffer, discard the
635 * rest of the command and indicate truncation.
636 * This prevents the command to be split up into
637 * multiple commands.
638 */
639 while (c != '\n' && (c = getc(stdin)(!__isthreaded ? (--((&__sF[0]))->_r < 0 ? __srget(
(&__sF[0])) : (int)(*((&__sF[0]))->_p++)) : (getc)
((&__sF[0])))
) != EOF(-1))
640 ;
641 return (-2);
642 }
643 if (c == '\n')
644 break;
645 }
646 if (c == EOF(-1) && cs == s)
647 return (-1);
648 *cs++ = '\0';
649 if (debug) {
650 if (!guest && strncasecmp("pass ", s, 5) == 0) {
651 /* Don't syslog passwords */
652 syslog(LOG_DEBUG7, "command: %.5s ???", s);
653 } else {
654 char *cp;
655 int len;
656
657 /* Don't syslog trailing CR-LF */
658 len = strlen(s);
659 cp = s + len - 1;
660 while (cp >= s && (*cp == '\n' || *cp == '\r')) {
661 --cp;
662 --len;
663 }
664 syslog(LOG_DEBUG7, "command: %.*s", len, s);
665 }
666 }
667 return (0);
668}
669
670/*ARGSUSED*/
671void
672toolong(int signo)
673{
674 struct syslog_data sdata = SYSLOG_DATA_INIT{0, (const char *)0, (1<<3), 0xff};
675
676 reply_r(421,
677 "Timeout (%d seconds): closing control connection.", timeout);
678 if (logging)
679 syslog_r(LOG_INFO6, &sdata, "User %s timed out after %d seconds",
680 (pw ? pw -> pw_name : "unknown"), timeout);
681 dologout(1);
682}
683
684static int
685yylex(void)
686{
687 static int cpos;
688 char *cp, *cp2;
689 struct tab *p;
690 int n;
691 char c;
692
693 for (;;) {
694 switch (state) {
695
696 case CMD0:
697 (void) alarm((unsigned) timeout);
698 n = get_line(cbuf, sizeof(cbuf)-1);
699 if (n == -1) {
700 reply(221, "You could at least say goodbye.");
701 dologout(0);
702 } else if (n == -2) {
703 reply(500, "Command too long.");
704 alarm(0);
705 continue;
706 }
707 (void) alarm(0);
708 if ((cp = strchr(cbuf, '\r'))) {
709 *cp++ = '\n';
710 *cp = '\0';
711 }
712 if (strncasecmp(cbuf, "PASS", 4) != 0) {
713 if ((cp = strpbrk(cbuf, "\n"))) {
714 c = *cp;
715 *cp = '\0';
716 setproctitle("%s: %s", proctitle, cbuf);
717 *cp = c;
718 }
719 }
720 if ((cp = strpbrk(cbuf, " \n")))
721 cpos = cp - cbuf;
722 if (cpos == 0)
723 cpos = 4;
724 c = cbuf[cpos];
725 cbuf[cpos] = '\0';
726 upper(cbuf);
727 p = lookup(cmdtab, cbuf);
728 cbuf[cpos] = c;
729 if (p != NULL((void *)0)) {
730 if (p->implemented == 0) {
731 nack(p->name);
732 return (LEXERR322);
733 }
734 state = p->state;
735 yylval.s = p->name;
736 return (p->token);
737 }
738 break;
739
740 case SITECMD7:
741 if (cbuf[cpos] == ' ') {
742 cpos++;
743 return (SP269);
744 }
745 cp = &cbuf[cpos];
746 if ((cp2 = strpbrk(cp, " \n")))
747 cpos = cp2 - cbuf;
748 c = cbuf[cpos];
749 cbuf[cpos] = '\0';
750 upper(cp);
751 p = lookup(sitetab, cp);
752 cbuf[cpos] = c;
753 if (p != NULL((void *)0)) {
754 if (p->implemented == 0) {
755 state = CMD0;
756 nack(p->name);
757 return (LEXERR322);
758 }
759 state = p->state;
760 yylval.s = p->name;
761 return (p->token);
762 }
763 state = CMD0;
764 break;
765
766 case OSTR4:
767 if (cbuf[cpos] == '\n') {
768 state = CMD0;
769 return (CRLF270);
770 }
771 /* FALLTHROUGH */
772
773 case STR12:
774 case ZSTR15:
775 dostr1:
776 if (cbuf[cpos] == ' ') {
777 cpos++;
778 state = state == OSTR4 ? STR23 : state+1;
779 return (SP269);
780 }
781 break;
782
783 case ZSTR26:
784 if (cbuf[cpos] == '\n') {
785 state = CMD0;
786 return (CRLF270);
787 }
788 /* FALLTHROUGH */
789
790 case STR23:
791 cp = &cbuf[cpos];
792 n = strlen(cp);
793 cpos += n - 1;
794 /*
795 * Make sure the string is nonempty and \n terminated.
796 */
797 if (n > 1 && cbuf[cpos] == '\n') {
798 cbuf[cpos] = '\0';
799 yylval.s = strdup(cp);
800 if (yylval.s == NULL((void *)0))
801 fatal("Ran out of memory.");
802 cbuf[cpos] = '\n';
803 state = ARGS1;
804 return (STRING323);
805 }
806 break;
807
808 case NSTR8:
809 if (cbuf[cpos] == ' ') {
810 cpos++;
811 return (SP269);
812 }
813 if (isdigit((unsigned char)cbuf[cpos])) {
814 cp = &cbuf[cpos];
815 while (isdigit((unsigned char)cbuf[++cpos]))
816 ;
817 c = cbuf[cpos];
818 cbuf[cpos] = '\0';
819 yylval.i = atoi(cp);
820 cbuf[cpos] = c;
821 state = STR12;
822 return (NUMBER324);
823 }
824 state = STR12;
825 goto dostr1;
826
827 case ARGS1:
828 if (isdigit((unsigned char)cbuf[cpos])) {
829 long long llval;
830
831 cp = &cbuf[cpos];
832 errno(*__errno()) = 0;
833 llval = strtoll(cp, &cp2, 10);
834 if (llval < 0 ||
835 (errno(*__errno()) == ERANGE34 && llval == LLONG_MAX9223372036854775807LL))
836 break;
837
838 cpos = (int)(cp2 - cbuf);
839 if (llval > INT_MAX2147483647) {
840 yylval.o = llval;
841 return (BIGNUM325);
842 } else {
843 yylval.i = (int)llval;
844 return (NUMBER324);
845 }
846 }
847 if (strncasecmp(&cbuf[cpos], "ALL", 3) == 0 &&
848 !isalnum((unsigned char)cbuf[cpos + 3])) {
849 cpos += 3;
850 return ALL272;
851 }
852 switch (cbuf[cpos++]) {
853
854 case '\n':
855 state = CMD0;
856 return (CRLF270);
857
858 case ' ':
859 return (SP269);
860
861 case ',':
862 return (COMMA271);
863
864 case 'A':
865 case 'a':
866 return (A257);
867
868 case 'B':
869 case 'b':
870 return (B258);
871
872 case 'C':
873 case 'c':
874 return (C259);
875
876 case 'E':
877 case 'e':
878 return (E260);
879
880 case 'F':
881 case 'f':
882 return (F261);
883
884 case 'I':
885 case 'i':
886 return (I262);
887
888 case 'L':
889 case 'l':
890 return (L263);
891
892 case 'N':
893 case 'n':
894 return (N264);
895
896 case 'P':
897 case 'p':
898 return (P265);
899
900 case 'R':
901 case 'r':
902 return (R266);
903
904 case 'S':
905 case 's':
906 return (S267);
907
908 case 'T':
909 case 't':
910 return (T268);
911
912 }
913 break;
914
915 default:
916 fatal("Unknown state in scanner.");
917 }
918 state = CMD0;
919 return (LEXERR322);
920 }
921}
922
923void
924upper(char *s)
925{
926 char *p;
927
928 for (p = s; *p; p++)
929 *p = (char)toupper((unsigned char)*p);
930}
931
932static void
933help(struct tab *ctab, char *s)
934{
935 struct tab *c;
936 int width, NCMDS;
937 char *type;
938
939 if (ctab == sitetab)
940 type = "SITE ";
941 else
942 type = "";
943 width = 0, NCMDS = 0;
944 for (c = ctab; c->name != NULL((void *)0); c++) {
945 int len = strlen(c->name);
946
947 if (len > width)
948 width = len;
949 NCMDS++;
950 }
951 width = (width + 8) &~ 7;
952 if (s == NULL((void *)0)) {
953 int i, j, w;
954 int columns, lines;
955
956 lreply(214, "The following %scommands are recognized %s.",
957 type, "(* =>'s unimplemented)");
958 columns = 76 / width;
959 if (columns == 0)
960 columns = 1;
961 lines = (NCMDS + columns - 1) / columns;
962 for (i = 0; i < lines; i++) {
963 printf(" ");
964 for (j = 0; j < columns; j++) {
965 c = ctab + j * lines + i;
966 printf("%s%c", c->name,
967 c->implemented ? ' ' : '*');
968 if (c + lines >= &ctab[NCMDS])
969 break;
970 w = strlen(c->name) + 1;
971 while (w < width) {
972 putchar(' ')(!__isthreaded ? __sputc(' ', (&__sF[1])) : (putc)(' ', (
&__sF[1])))
;
973 w++;
974 }
975 }
976 printf("\r\n");
977 }
978 (void) fflush(stdout(&__sF[1]));
979 reply(214, "Direct comments to ftp-bugs@%s.", hostname);
980 return;
981 }
982 upper(s);
983 c = lookup(ctab, s);
984 if (c == NULL((void *)0)) {
985 reply(502, "Unknown command %s.", s);
986 return;
987 }
988 if (c->implemented)
989 reply(214, "Syntax: %s%s %s", type, c->name, c->help);
990 else
991 reply(214, "%s%-*s\t%s; unimplemented.", type, width,
992 c->name, c->help);
993}
994
995static void
996sizecmd(const char *filename)
997{
998 switch (type) {
999 case TYPE_L4:
1000 case TYPE_I3: {
1001 struct stat stbuf;
1002 if (stat(filename, &stbuf) == -1 || !S_ISREG(stbuf.st_mode)((stbuf.st_mode & 0170000) == 0100000))
1003 reply(550, "%s: not a plain file.", filename);
1004 else
1005 reply(213, "%lld", (long long)stbuf.st_size);
1006 break; }
1007 case TYPE_A1: {
1008 FILE *fin;
1009 int c;
1010 off_t count;
1011 struct stat stbuf;
1012 fin = fopen(filename, "r");
1013 if (fin == NULL((void *)0)) {
1014 perror_reply(550, filename);
1015 return;
1016 }
1017 if (fstat(fileno(fin)(!__isthreaded ? ((fin)->_file) : (fileno)(fin)), &stbuf) == -1 || !S_ISREG(stbuf.st_mode)((stbuf.st_mode & 0170000) == 0100000)) {
1018 reply(550, "%s: not a plain file.", filename);
1019 (void) fclose(fin);
1020 return;
1021 }
1022 if (stbuf.st_size > 10240) {
1023 reply(550, "%s: file too large for SIZE.", filename);
1024 (void) fclose(fin);
1025 return;
1026 }
1027
1028 count = 0;
1029 while((c = getc(fin)(!__isthreaded ? (--(fin)->_r < 0 ? __srget(fin) : (int
)(*(fin)->_p++)) : (getc)(fin))
) != EOF(-1)) {
1030 if (c == '\n') /* will get expanded to \r\n */
1031 count++;
1032 count++;
1033 }
1034 (void) fclose(fin);
1035
1036 reply(213, "%lld", (long long)count);
1037 break; }
1038 default:
1039 reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
1040 }
1041}
1042#line 1035 "ftpcmd.c"
1043/* allocate initial stack or double stack size, up to YYMAXDEPTH */
1044static int yygrowstack(void)
1045{
1046 unsigned int newsize;
1047 long sslen;
1048 short *newss;
1049 YYSTYPE *newvs;
1050
1051 if ((newsize = yystacksize) == 0)
3
Assuming the condition is false
4
Taking false branch
1052 newsize = YYINITSTACKSIZE200;
1053 else if (newsize >= YYMAXDEPTH10000)
5
Assuming 'newsize' is < YYMAXDEPTH
6
Taking false branch
1054 return -1;
1055 else if ((newsize *= 2) > YYMAXDEPTH10000)
7
Assuming the condition is false
8
Taking false branch
1056 newsize = YYMAXDEPTH10000;
1057 sslen = yyssp - yyss;
1058#ifdef SIZE_MAX
1059#define YY_SIZE_MAX0xffffffffU SIZE_MAX
1060#else
1061#define YY_SIZE_MAX0xffffffffU 0xffffffffU
1062#endif
1063 if (newsize && YY_SIZE_MAX0xffffffffU / newsize < sizeof *newss)
9
Assuming 'newsize' is 0
1064 goto bail;
1065 newss = (short *)realloc(yyss, newsize * sizeof *newss);
1066 if (newss == NULL((void *)0))
10
Assuming 'newss' is not equal to NULL
11
Taking false branch
1067 goto bail;
1068 yyss = newss;
1069 yyssp = newss + sslen;
1070 if (newsize
11.1
'newsize' is 0
&& YY_SIZE_MAX0xffffffffU / newsize < sizeof *newvs)
1071 goto bail;
1072 newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs);
12
Memory is released
1073 if (newvs == NULL((void *)0))
13
Assuming 'newvs' is equal to NULL
14
Taking true branch
1074 goto bail;
15
Control jumps to line 1081
1075 yyvs = newvs;
1076 yyvsp = newvs + sslen;
1077 yystacksize = newsize;
1078 yysslim = yyss + newsize - 1;
1079 return 0;
1080bail:
1081 if (yyss
15.1
'yyss' is non-null
)
16
Taking true branch
1082 free(yyss);
1083 if (yyvs)
17
Assuming 'yyvs' is non-null
18
Taking true branch
1084 free(yyvs);
19
Attempt to free released memory
1085 yyss = yyssp = NULL((void *)0);
1086 yyvs = yyvsp = NULL((void *)0);
1087 yystacksize = 0;
1088 return -1;
1089}
1090
1091#define YYABORTgoto yyabort goto yyabort
1092#define YYREJECTgoto yyabort goto yyabort
1093#define YYACCEPTgoto yyaccept goto yyaccept
1094#define YYERRORgoto yyerrlab goto yyerrlab
1095int
1096yyparse(void)
1097{
1098 int yym, yyn, yystate;
1099#if YYDEBUG0
1100 const char *yys;
1101
1102 if ((yys = getenv("YYDEBUG")))
1103 {
1104 yyn = *yys;
1105 if (yyn >= '0' && yyn <= '9')
1106 yydebug = yyn - '0';
1107 }
1108#endif /* YYDEBUG */
1109
1110 yynerrs = 0;
1111 yyerrflag = 0;
1112 yychar = (-1);
1113
1114 if (yyss == NULL((void *)0) && yygrowstack()) goto yyoverflow;
1
Assuming 'yyss' is equal to NULL
2
Calling 'yygrowstack'
1115 yyssp = yyss;
1116 yyvsp = yyvs;
1117 *yyssp = yystate = 0;
1118
1119yyloop:
1120 if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
1121 if (yychar < 0)
1122 {
1123 if ((yychar = yylex()) < 0) yychar = 0;
1124#if YYDEBUG0
1125 if (yydebug)
1126 {
1127 yys = 0;
1128 if (yychar <= YYMAXTOKEN325) yys = yyname[yychar];
1129 if (!yys) yys = "illegal-symbol";
1130 printf("%sdebug: state %d, reading %d (%s)\n",
1131 YYPREFIX"yy", yystate, yychar, yys);
1132 }
1133#endif
1134 }
1135 if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
1136 yyn <= YYTABLESIZE304 && yycheck[yyn] == yychar)
1137 {
1138#if YYDEBUG0
1139 if (yydebug)
1140 printf("%sdebug: state %d, shifting to state %d\n",
1141 YYPREFIX"yy", yystate, yytable[yyn]);
1142#endif
1143 if (yyssp >= yysslim && yygrowstack())
1144 {
1145 goto yyoverflow;
1146 }
1147 *++yyssp = yystate = yytable[yyn];
1148 *++yyvsp = yylval;
1149 yychar = (-1);
1150 if (yyerrflag > 0) --yyerrflag;
1151 goto yyloop;
1152 }
1153 if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
1154 yyn <= YYTABLESIZE304 && yycheck[yyn] == yychar)
1155 {
1156 yyn = yytable[yyn];
1157 goto yyreduce;
1158 }
1159 if (yyerrflag) goto yyinrecovery;
1160#if defined(__GNUC__4)
1161 goto yynewerror;
1162#endif
1163yynewerror:
1164 yyerror("syntax error");
1165#if defined(__GNUC__4)
1166 goto yyerrlab;
1167#endif
1168yyerrlab:
1169 ++yynerrs;
1170yyinrecovery:
1171 if (yyerrflag < 3)
1172 {
1173 yyerrflag = 3;
1174 for (;;)
1175 {
1176 if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE256) >= 0 &&
1177 yyn <= YYTABLESIZE304 && yycheck[yyn] == YYERRCODE256)
1178 {
1179#if YYDEBUG0
1180 if (yydebug)
1181 printf("%sdebug: state %d, error recovery shifting\
1182 to state %d\n", YYPREFIX"yy", *yyssp, yytable[yyn]);
1183#endif
1184 if (yyssp >= yysslim && yygrowstack())
1185 {
1186 goto yyoverflow;
1187 }
1188 *++yyssp = yystate = yytable[yyn];
1189 *++yyvsp = yylval;
1190 goto yyloop;
1191 }
1192 else
1193 {
1194#if YYDEBUG0
1195 if (yydebug)
1196 printf("%sdebug: error recovery discarding state %d\n",
1197 YYPREFIX"yy", *yyssp);
1198#endif
1199 if (yyssp <= yyss) goto yyabort;
1200 --yyssp;
1201 --yyvsp;
1202 }
1203 }
1204 }
1205 else
1206 {
1207 if (yychar == 0) goto yyabort;
1208#if YYDEBUG0
1209 if (yydebug)
1210 {
1211 yys = 0;
1212 if (yychar <= YYMAXTOKEN325) yys = yyname[yychar];
1213 if (!yys) yys = "illegal-symbol";
1214 printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
1215 YYPREFIX"yy", yystate, yychar, yys);
1216 }
1217#endif
1218 yychar = (-1);
1219 goto yyloop;
1220 }
1221yyreduce:
1222#if YYDEBUG0
1223 if (yydebug)
1224 printf("%sdebug: state %d, reducing by rule %d (%s)\n",
1225 YYPREFIX"yy", yystate, yyn, yyrule[yyn]);
1226#endif
1227 yym = yylen[yyn];
1228 if (yym)
1229 yyval = yyvsp[1-yym];
1230 else
1231 memset(&yyval, 0, sizeof yyval);
1232 switch (yyn)
1233 {
1234case 2:
1235#line 141 "/usr/src/libexec/ftpd/ftpcmd.y"
1236{
1237 if (fromname) {
1238 free(fromname);
1239 fromname = NULL((void *)0);
1240 }
1241 restart_point = 0;
1242 }
1243break;
1244case 4:
1245#line 153 "/usr/src/libexec/ftpd/ftpcmd.y"
1246{
1247 monitor_user(yyvsp[-1].s);
1248 free(yyvsp[-1].s);
1249 }
1250break;
1251case 5:
1252#line 158 "/usr/src/libexec/ftpd/ftpcmd.y"
1253{
1254 quit = monitor_pass(yyvsp[-1].s);
1255 explicit_bzero(yyvsp[-1].s, strlen(yyvsp[-1].s));
1256 free(yyvsp[-1].s);
1257
1258 /* Terminate unprivileged pre-auth slave */
1259 if (quit)
1260 _exit(0);
1261 }
1262break;
1263case 6:
1264#line 168 "/usr/src/libexec/ftpd/ftpcmd.y"
1265{
1266 if (yyvsp[-3].i) {
1267 if (yyvsp[-1].i) {
1268 usedefault = 1;
1269 reply(500,
1270 "Illegal PORT rejected (range errors).");
1271 } else if (portcheck &&
1272 ntohs(data_dest.su_sin.sin_port)(__uint16_t)(__builtin_constant_p(data_dest.su_sin.sin_port) ?
(__uint16_t)(((__uint16_t)(data_dest.su_sin.sin_port) & 0xffU
) << 8 | ((__uint16_t)(data_dest.su_sin.sin_port) &
0xff00U) >> 8) : __swap16md(data_dest.su_sin.sin_port)
)
< IPPORT_RESERVED1024) {
1273 usedefault = 1;
1274 reply(500,
1275 "Illegal PORT rejected (reserved port).");
1276 } else if (portcheck &&
1277 memcmp(&data_dest.su_sin.sin_addr,
1278 &his_addr.su_sin.sin_addr,
1279 sizeof data_dest.su_sin.sin_addr)) {
1280 usedefault = 1;
1281 reply(500,
1282 "Illegal PORT rejected (address wrong).");
1283 } else {
1284 usedefault = 0;
1285 if (pdata >= 0) {
1286 (void) close(pdata);
1287 pdata = -1;
1288 }
1289 reply(200, "PORT command successful.");
1290 }
1291 }
1292 }
1293break;
1294case 7:
1295#line 197 "/usr/src/libexec/ftpd/ftpcmd.y"
1296{
1297 if (yyvsp[-3].i) {
1298 /* reject invalid host_long_port4 */
1299 if (yyvsp[-1].i) {
1300 reply(500,
1301 "Illegal LPRT command rejected");
1302 usedefault = 1;
1303 } else {
1304 usedefault = 0;
1305 if (pdata >= 0) {
1306 (void) close(pdata);
1307 pdata = -1;
1308 }
1309 reply(200, "LPRT command successful.");
1310 }
1311 }
1312 }
1313break;
1314case 8:
1315#line 216 "/usr/src/libexec/ftpd/ftpcmd.y"
1316{
1317 if (yyvsp[-3].i) {
1318 /* reject invalid host_long_port6 */
1319 if (yyvsp[-1].i) {
1320 reply(500,
1321 "Illegal LPRT command rejected");
1322 usedefault = 1;
1323 } else {
1324 usedefault = 0;
1325 if (pdata >= 0) {
1326 (void) close(pdata);
1327 pdata = -1;
1328 }
1329 reply(200, "LPRT command successful.");
1330 }
1331 }
1332 }
1333break;
1334case 9:
1335#line 235 "/usr/src/libexec/ftpd/ftpcmd.y"
1336{
1337 if (yyvsp[-3].i)
1338 extended_port(yyvsp[-1].s);
1339 free(yyvsp[-1].s);
1340 }
1341break;
1342case 10:
1343#line 242 "/usr/src/libexec/ftpd/ftpcmd.y"
1344{
1345 if (yyvsp[-1].i)
1346 passive();
1347 }
1348break;
1349case 11:
1350#line 247 "/usr/src/libexec/ftpd/ftpcmd.y"
1351{
1352 if (yyvsp[-1].i)
1353 long_passive("LPSV", PF_UNSPEC0);
1354 }
1355break;
1356case 12:
1357#line 252 "/usr/src/libexec/ftpd/ftpcmd.y"
1358{
1359 if (yyvsp[-3].i)
1360 long_passive("EPSV", epsvproto2af(yyvsp[-1].i));
1361 }
1362break;
1363case 13:
1364#line 257 "/usr/src/libexec/ftpd/ftpcmd.y"
1365{
1366 if (yyvsp[-3].i) {
1367 reply(200, "EPSV ALL command successful.");
1368 epsvall++;
1369 }
1370 }
1371break;
1372case 14:
1373#line 264 "/usr/src/libexec/ftpd/ftpcmd.y"
1374{
1375 if (yyvsp[-1].i)
1376 long_passive("EPSV", PF_UNSPEC0);
1377 }
1378break;
1379case 15:
1380#line 269 "/usr/src/libexec/ftpd/ftpcmd.y"
1381{
1382 if (yyvsp[-3].i) {
1383 switch (cmd_type) {
1384
1385 case TYPE_A1:
1386 if (cmd_form == FORM_N1) {
1387 reply(200, "Type set to A.");
1388 type = cmd_type;
1389 form = cmd_form;
1390 } else
1391 reply(504, "Form must be N.");
1392 break;
1393
1394 case TYPE_E2:
1395 reply(504, "Type E not implemented.");
1396 break;
1397
1398 case TYPE_I3:
1399 reply(200, "Type set to I.");
1400 type = cmd_type;
1401 break;
1402
1403 case TYPE_L4:
1404 if (cmd_bytesz == 8) {
1405 reply(200,
1406 "Type set to L (byte size 8).");
1407 type = cmd_type;
1408 } else
1409 reply(504, "Byte size must be 8.");
1410
1411 }
1412 }
1413 }
1414break;
1415case 16:
1416#line 303 "/usr/src/libexec/ftpd/ftpcmd.y"
1417{
1418 if (yyvsp[-3].i) {
1419 switch (yyvsp[-1].i) {
1420
1421 case STRU_F1:
1422 reply(200, "STRU F ok.");
1423 break;
1424
1425 default:
1426 reply(504, "Unimplemented STRU type.");
1427 }
1428 }
1429 }
1430break;
1431case 17:
1432#line 317 "/usr/src/libexec/ftpd/ftpcmd.y"
1433{
1434 if (yyvsp[-3].i) {
1435 switch (yyvsp[-1].i) {
1436
1437 case MODE_S1:
1438 reply(200, "MODE S ok.");
1439 break;
1440
1441 default:
1442 reply(502, "Unimplemented MODE type.");
1443 }
1444 }
1445 }
1446break;
1447case 18:
1448#line 331 "/usr/src/libexec/ftpd/ftpcmd.y"
1449{
1450 if (yyvsp[-3].i) {
1451 reply(202, "ALLO command ignored.");
1452 }
1453 }
1454break;
1455case 19:
1456#line 337 "/usr/src/libexec/ftpd/ftpcmd.y"
1457{
1458 if (yyvsp[-7].i) {
1459 reply(202, "ALLO command ignored.");
1460 }
1461 }
1462break;
1463case 20:
1464#line 343 "/usr/src/libexec/ftpd/ftpcmd.y"
1465{
1466 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1467 retrieve(RET_FILE, yyvsp[-1].s);
1468 if (yyvsp[-1].s != NULL((void *)0))
1469 free(yyvsp[-1].s);
1470 }
1471break;
1472case 21:
1473#line 350 "/usr/src/libexec/ftpd/ftpcmd.y"
1474{
1475 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1476 store(yyvsp[-1].s, "w", 0);
1477 if (yyvsp[-1].s != NULL((void *)0))
1478 free(yyvsp[-1].s);
1479 }
1480break;
1481case 22:
1482#line 357 "/usr/src/libexec/ftpd/ftpcmd.y"
1483{
1484 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1485 store(yyvsp[-1].s, "a", 0);
1486 if (yyvsp[-1].s != NULL((void *)0))
1487 free(yyvsp[-1].s);
1488 }
1489break;
1490case 23:
1491#line 364 "/usr/src/libexec/ftpd/ftpcmd.y"
1492{
1493 if (yyvsp[-1].i)
1494 send_file_list(".");
1495 }
1496break;
1497case 24:
1498#line 369 "/usr/src/libexec/ftpd/ftpcmd.y"
1499{
1500 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1501 send_file_list(yyvsp[-1].s);
1502 free(yyvsp[-1].s);
1503 }
1504break;
1505case 25:
1506#line 375 "/usr/src/libexec/ftpd/ftpcmd.y"
1507{
1508 if (yyvsp[-1].i)
1509 retrieve(RET_LIST, ".");
1510 }
1511break;
1512case 26:
1513#line 380 "/usr/src/libexec/ftpd/ftpcmd.y"
1514{
1515 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1516 retrieve(RET_LIST, yyvsp[-1].s);
1517 if (yyvsp[-1].s != NULL((void *)0))
1518 free(yyvsp[-1].s);
1519 }
1520break;
1521case 27:
1522#line 387 "/usr/src/libexec/ftpd/ftpcmd.y"
1523{
1524 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1525 statfilecmd(yyvsp[-1].s);
1526 if (yyvsp[-1].s != NULL((void *)0))
1527 free(yyvsp[-1].s);
1528 }
1529break;
1530case 28:
1531#line 394 "/usr/src/libexec/ftpd/ftpcmd.y"
1532{
1533 if (yyvsp[-1].i)
1534 statcmd();
1535 }
1536break;
1537case 29:
1538#line 399 "/usr/src/libexec/ftpd/ftpcmd.y"
1539{
1540 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1541 delete(yyvsp[-1].s);
1542 if (yyvsp[-1].s != NULL((void *)0))
1543 free(yyvsp[-1].s);
1544 }
1545break;
1546case 30:
1547#line 406 "/usr/src/libexec/ftpd/ftpcmd.y"
1548{
1549 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) {
1550 if (fromname) {
1551 renamecmd(fromname, yyvsp[-1].s);
1552 free(fromname);
1553 fromname = NULL((void *)0);
1554 } else {
1555 reply(503,
1556 "Bad sequence of commands.");
1557 }
1558 }
1559 if (yyvsp[-1].s != NULL((void *)0))
1560 free(yyvsp[-1].s);
1561 }
1562break;
1563case 31:
1564#line 421 "/usr/src/libexec/ftpd/ftpcmd.y"
1565{
1566 if (yyvsp[-1].i)
1567 reply(225, "ABOR command successful.");
1568 }
1569break;
1570case 32:
1571#line 426 "/usr/src/libexec/ftpd/ftpcmd.y"
1572{
1573 if (yyvsp[-1].i)
1574 cwd(pw->pw_dir);
1575 }
1576break;
1577case 33:
1578#line 431 "/usr/src/libexec/ftpd/ftpcmd.y"
1579{
1580 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1581 cwd(yyvsp[-1].s);
1582 if (yyvsp[-1].s != NULL((void *)0))
1583 free(yyvsp[-1].s);
1584 }
1585break;
1586case 34:
1587#line 438 "/usr/src/libexec/ftpd/ftpcmd.y"
1588{
1589 help(cmdtab, NULL((void *)0));
1590 }
1591break;
1592case 35:
1593#line 442 "/usr/src/libexec/ftpd/ftpcmd.y"
1594{
1595 char *cp = yyvsp[-1].s;
1596
1597 if (strncasecmp(cp, "SITE", 4) == 0) {
1598 cp = yyvsp[-1].s + 4;
1599 if (*cp == ' ')
1600 cp++;
1601 if (*cp)
1602 help(sitetab, cp);
1603 else
1604 help(sitetab, NULL((void *)0));
1605 } else
1606 help(cmdtab, yyvsp[-1].s);
1607 free (yyvsp[-1].s);
1608 }
1609break;
1610case 36:
1611#line 458 "/usr/src/libexec/ftpd/ftpcmd.y"
1612{
1613 reply(200, "NOOP command successful.");
1614 }
1615break;
1616case 37:
1617#line 462 "/usr/src/libexec/ftpd/ftpcmd.y"
1618{
1619 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1620 makedir(yyvsp[-1].s);
1621 if (yyvsp[-1].s != NULL((void *)0))
1622 free(yyvsp[-1].s);
1623 }
1624break;
1625case 38:
1626#line 469 "/usr/src/libexec/ftpd/ftpcmd.y"
1627{
1628 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1629 removedir(yyvsp[-1].s);
1630 if (yyvsp[-1].s != NULL((void *)0))
1631 free(yyvsp[-1].s);
1632 }
1633break;
1634case 39:
1635#line 476 "/usr/src/libexec/ftpd/ftpcmd.y"
1636{
1637 if (yyvsp[-1].i)
1638 pwd();
1639 }
1640break;
1641case 40:
1642#line 481 "/usr/src/libexec/ftpd/ftpcmd.y"
1643{
1644 if (yyvsp[-1].i)
1645 cwd("..");
1646 }
1647break;
1648case 41:
1649#line 486 "/usr/src/libexec/ftpd/ftpcmd.y"
1650{
1651 help(sitetab, NULL((void *)0));
1652 }
1653break;
1654case 42:
1655#line 490 "/usr/src/libexec/ftpd/ftpcmd.y"
1656{
1657 help(sitetab, yyvsp[-1].s);
1658 free (yyvsp[-1].s);
1659 }
1660break;
1661case 43:
1662#line 495 "/usr/src/libexec/ftpd/ftpcmd.y"
1663{
1664 mode_t oldmask;
1665
1666 if (yyvsp[-1].i) {
1667 oldmask = umask(0);
1668 (void) umask(oldmask);
1669 reply(200, "Current UMASK is %03o", oldmask);
1670 }
1671 }
1672break;
1673case 44:
1674#line 505 "/usr/src/libexec/ftpd/ftpcmd.y"
1675{
1676 mode_t oldmask;
1677
1678 if (yyvsp[-3].i) {
1679 if ((yyvsp[-1].i == -1) || (yyvsp[-1].i > 0777)) {
1680 reply(501, "Bad UMASK value");
1681 } else if (!umaskchange) {
1682 reply(550,
1683 "No permission to change umask.");
1684 } else {
1685 oldmask = umask(yyvsp[-1].i);
1686 reply(200,
1687 "UMASK set to %03o (was %03o)",
1688 yyvsp[-1].i, oldmask);
1689 }
1690 }
1691 }
1692break;
1693case 45:
1694#line 523 "/usr/src/libexec/ftpd/ftpcmd.y"
1695{
1696 if (yyvsp[-5].i && (yyvsp[-1].s != NULL((void *)0))) {
1697 if ((yyvsp[-3].i == -1) || (yyvsp[-3].i > 0777))
1698 reply(501,
1699 "CHMOD: Mode value must be between "
1700 "0 and 0777");
1701 else if (!umaskchange)
1702 reply(550,
1703 "No permission to change mode of %s.",
1704 yyvsp[-1].s);
1705 else if (chmod(yyvsp[-1].s, yyvsp[-3].i) == -1)
1706 perror_reply(550, yyvsp[-1].s);
1707 else
1708 reply(200,
1709 "CHMOD command successful.");
1710 }
1711 if (yyvsp[-1].s != NULL((void *)0))
1712 free(yyvsp[-1].s);
1713 }
1714break;
1715case 46:
1716#line 543 "/usr/src/libexec/ftpd/ftpcmd.y"
1717{
1718 if (yyvsp[-2].i)
1719 reply(200,
1720 "Current IDLE time limit is %d "
1721 "seconds; max %d",
1722 timeout, maxtimeout);
1723 }
1724break;
1725case 47:
1726#line 551 "/usr/src/libexec/ftpd/ftpcmd.y"
1727{
1728 if (yyvsp[-4].i) {
1729 if (yyvsp[-1].i < 30 || yyvsp[-1].i > maxtimeout) {
1730 reply(501,
1731 "Maximum IDLE time must be between "
1732 "30 and %d seconds",
1733 maxtimeout);
1734 } else {
1735 timeout = yyvsp[-1].i;
1736 (void) alarm((unsigned) timeout);
1737 reply(200,
1738 "Maximum IDLE time set to %d seconds",
1739 timeout);
1740 }
1741 }
1742 }
1743break;
1744case 48:
1745#line 568 "/usr/src/libexec/ftpd/ftpcmd.y"
1746{
1747 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1748 store(yyvsp[-1].s, "w", 1);
1749 if (yyvsp[-1].s != NULL((void *)0))
1750 free(yyvsp[-1].s);
1751 }
1752break;
1753case 49:
1754#line 575 "/usr/src/libexec/ftpd/ftpcmd.y"
1755{
1756 if (yyvsp[-1].i)
1757 reply(215, "UNIX Type: L8");
1758 }
1759break;
1760case 50:
1761#line 588 "/usr/src/libexec/ftpd/ftpcmd.y"
1762{
1763 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0))
1764 sizecmd(yyvsp[-1].s);
1765 if (yyvsp[-1].s != NULL((void *)0))
1766 free(yyvsp[-1].s);
1767 }
1768break;
1769case 51:
1770#line 605 "/usr/src/libexec/ftpd/ftpcmd.y"
1771{
1772 if (yyvsp[-3].i && yyvsp[-1].s != NULL((void *)0)) {
1773 struct stat stbuf;
1774 if (stat(yyvsp[-1].s, &stbuf) == -1)
1775 reply(550, "%s: %s",
1776 yyvsp[-1].s, strerror(errno(*__errno())));
1777 else if (!S_ISREG(stbuf.st_mode)((stbuf.st_mode & 0170000) == 0100000)) {
1778 reply(550, "%s: not a plain file.", yyvsp[-1].s);
1779 } else {
1780 struct tm *t;
1781 t = gmtime(&stbuf.st_mtimest_mtim.tv_sec);
1782 reply(213,
1783 "%04d%02d%02d%02d%02d%02d",
1784 1900 + t->tm_year,
1785 t->tm_mon+1, t->tm_mday,
1786 t->tm_hour, t->tm_min, t->tm_sec);
1787 }
1788 }
1789 if (yyvsp[-1].s != NULL((void *)0))
1790 free(yyvsp[-1].s);
1791 }
1792break;
1793case 52:
1794#line 627 "/usr/src/libexec/ftpd/ftpcmd.y"
1795{
1796 reply(221, "Goodbye.");
1797 dologout(0);
1798 }
1799break;
1800case 53:
1801#line 632 "/usr/src/libexec/ftpd/ftpcmd.y"
1802{
1803 yyclearin(yychar=(-1)); /* discard lookahead data */
1804 yyerrok(yyerrflag=0); /* clear error condition */
1805 state = 0; /* reset lexer state */
1806 }
1807break;
1808case 54:
1809#line 640 "/usr/src/libexec/ftpd/ftpcmd.y"
1810{
1811 restart_point = 0;
1812 if (yyvsp[-3].i && yyvsp[-1].s) {
1813 if (fromname)
1814 free(fromname);
1815 fromname = renamefrom(yyvsp[-1].s);
1816 if (fromname == NULL((void *)0))
1817 free(yyvsp[-1].s);
1818 } else if (yyvsp[-1].s) {
1819 free (yyvsp[-1].s);
1820 }
1821 }
1822break;
1823case 55:
1824#line 654 "/usr/src/libexec/ftpd/ftpcmd.y"
1825{
1826 if (yyvsp[-3].i) {
1827 if (fromname) {
1828 free(fromname);
1829 fromname = NULL((void *)0);
1830 }
1831 restart_point = yyvsp[-1].o;
1832 reply(350, "Restarting at %lld. %s",
1833 (long long)restart_point,
1834 "Send STORE or RETRIEVE to initiate transfer.");
1835 }
1836 }
1837break;
1838case 57:
1839#line 674 "/usr/src/libexec/ftpd/ftpcmd.y"
1840{
1841 yyval.s = calloc(1, sizeof(char));
1842 }
1843break;
1844case 60:
1845#line 686 "/usr/src/libexec/ftpd/ftpcmd.y"
1846{
1847 yyval.o = yyvsp[0].i;
1848 }
1849break;
1850case 61:
1851#line 690 "/usr/src/libexec/ftpd/ftpcmd.y"
1852{
1853 yyval.o = yyvsp[0].o;
1854 }
1855break;
1856case 62:
1857#line 698 "/usr/src/libexec/ftpd/ftpcmd.y"
1858{
1859 char *a, *p;
1860
1861 if (yyvsp[-10].i < 0 || yyvsp[-10].i > 255 || yyvsp[-8].i < 0 || yyvsp[-8].i > 255 ||
1862 yyvsp[-6].i < 0 || yyvsp[-6].i > 255 || yyvsp[-4].i < 0 || yyvsp[-4].i > 255 ||
1863 yyvsp[-2].i < 0 || yyvsp[-2].i > 255 || yyvsp[0].i < 0 || yyvsp[0].i > 255) {
1864 yyval.i = 1;
1865 } else {
1866 data_dest.su_sin.sin_len = sizeof(struct sockaddr_in);
1867 data_dest.su_sin.sin_family = AF_INET2;
1868 p = (char *)&data_dest.su_sin.sin_port;
1869 p[0] = yyvsp[-2].i; p[1] = yyvsp[0].i;
1870 a = (char *)&data_dest.su_sin.sin_addr;
1871 a[0] = yyvsp[-10].i; a[1] = yyvsp[-8].i; a[2] = yyvsp[-6].i; a[3] = yyvsp[-4].i;
1872 yyval.i = 0;
1873 }
1874 }
1875break;
1876case 63:
1877#line 721 "/usr/src/libexec/ftpd/ftpcmd.y"
1878{
1879 char *a, *p;
1880
1881 /* reject invalid LPRT command */
1882 if (yyvsp[-16].i != 4 || yyvsp[-14].i != 4 ||
1883 yyvsp[-12].i < 0 || yyvsp[-12].i > 255 || yyvsp[-10].i < 0 || yyvsp[-10].i > 255 ||
1884 yyvsp[-8].i < 0 || yyvsp[-8].i > 255 || yyvsp[-6].i < 0 || yyvsp[-6].i > 255 ||
1885 yyvsp[-4].i != 2 ||
1886 yyvsp[-2].i < 0 || yyvsp[-2].i > 255 || yyvsp[0].i < 0 || yyvsp[0].i > 255) {
1887 yyval.i = 1;
1888 } else {
1889 data_dest.su_sin.sin_len =
1890 sizeof(struct sockaddr_in);
1891 data_dest.su_familysu_si.si_family = AF_INET2;
1892 p = (char *)&data_dest.su_portsu_si.si_port;
1893 p[0] = yyvsp[-2].i; p[1] = yyvsp[0].i;
1894 a = (char *)&data_dest.su_sin.sin_addr;
1895 a[0] = yyvsp[-12].i; a[1] = yyvsp[-10].i; a[2] = yyvsp[-8].i; a[3] = yyvsp[-6].i;
1896 yyval.i = 0;
1897 }
1898 }
1899break;
1900case 64:
1901#line 751 "/usr/src/libexec/ftpd/ftpcmd.y"
1902{
1903 char *a, *p;
1904
1905 /* reject invalid LPRT command */
1906 if (yyvsp[-40].i != 6 || yyvsp[-38].i != 16 ||
1907 yyvsp[-36].i < 0 || yyvsp[-36].i > 255 || yyvsp[-34].i < 0 || yyvsp[-34].i > 255 ||
1908 yyvsp[-32].i < 0 || yyvsp[-32].i > 255 || yyvsp[-30].i < 0 || yyvsp[-30].i > 255 ||
1909 yyvsp[-28].i < 0 || yyvsp[-28].i > 255 || yyvsp[-26].i < 0 || yyvsp[-26].i > 255 ||
1910 yyvsp[-24].i < 0 || yyvsp[-24].i > 255 || yyvsp[-22].i < 0 || yyvsp[-22].i > 255 ||
1911 yyvsp[-20].i < 0 || yyvsp[-20].i > 255 || yyvsp[-18].i < 0 || yyvsp[-18].i > 255 ||
1912 yyvsp[-16].i < 0 || yyvsp[-16].i > 255 || yyvsp[-14].i < 0 || yyvsp[-14].i > 255 ||
1913 yyvsp[-12].i < 0 || yyvsp[-12].i > 255 || yyvsp[-10].i < 0 || yyvsp[-10].i > 255 ||
1914 yyvsp[-8].i < 0 || yyvsp[-8].i > 255 || yyvsp[-6].i < 0 || yyvsp[-6].i > 255 ||
1915 yyvsp[-4].i != 2 ||
1916 yyvsp[-2].i < 0 || yyvsp[-2].i > 255 || yyvsp[0].i < 0 || yyvsp[0].i > 255) {
1917 yyval.i = 1;
1918 } else {
1919 data_dest.su_sin6.sin6_len =
1920 sizeof(struct sockaddr_in6);
1921 data_dest.su_familysu_si.si_family = AF_INET624;
1922 p = (char *)&data_dest.su_portsu_si.si_port;
1923 p[0] = yyvsp[-2].i; p[1] = yyvsp[0].i;
1924 a = (char *)&data_dest.su_sin6.sin6_addr;
1925 a[0] = yyvsp[-36].i; a[1] = yyvsp[-34].i;
1926 a[2] = yyvsp[-32].i; a[3] = yyvsp[-30].i;
1927 a[4] = yyvsp[-28].i; a[5] = yyvsp[-26].i;
1928 a[6] = yyvsp[-24].i; a[7] = yyvsp[-22].i;
1929 a[8] = yyvsp[-20].i; a[9] = yyvsp[-18].i;
1930 a[10] = yyvsp[-16].i; a[11] = yyvsp[-14].i;
1931 a[12] = yyvsp[-12].i; a[13] = yyvsp[-10].i;
1932 a[14] = yyvsp[-8].i; a[15] = yyvsp[-6].i;
1933 if (his_addr.su_familysu_si.si_family == AF_INET624) {
1934 /* XXX more sanity checks! */
1935 data_dest.su_sin6.sin6_scope_id =
1936 his_addr.su_sin6.sin6_scope_id;
1937 }
1938
1939 yyval.i = 0;
1940 }
1941 }
1942break;
1943case 65:
1944#line 795 "/usr/src/libexec/ftpd/ftpcmd.y"
1945{
1946 yyval.i = FORM_N1;
1947 }
1948break;
1949case 66:
1950#line 799 "/usr/src/libexec/ftpd/ftpcmd.y"
1951{
1952 yyval.i = FORM_T2;
1953 }
1954break;
1955case 67:
1956#line 803 "/usr/src/libexec/ftpd/ftpcmd.y"
1957{
1958 yyval.i = FORM_C3;
1959 }
1960break;
1961case 68:
1962#line 810 "/usr/src/libexec/ftpd/ftpcmd.y"
1963{
1964 cmd_type = TYPE_A1;
1965 cmd_form = FORM_N1;
1966 }
1967break;
1968case 69:
1969#line 815 "/usr/src/libexec/ftpd/ftpcmd.y"
1970{
1971 cmd_type = TYPE_A1;
1972 cmd_form = yyvsp[0].i;
1973 }
1974break;
1975case 70:
1976#line 820 "/usr/src/libexec/ftpd/ftpcmd.y"
1977{
1978 cmd_type = TYPE_E2;
1979 cmd_form = FORM_N1;
1980 }
1981break;
1982case 71:
1983#line 825 "/usr/src/libexec/ftpd/ftpcmd.y"
1984{
1985 cmd_type = TYPE_E2;
1986 cmd_form = yyvsp[0].i;
1987 }
1988break;
1989case 72:
1990#line 830 "/usr/src/libexec/ftpd/ftpcmd.y"
1991{
1992 cmd_type = TYPE_I3;
1993 }
1994break;
1995case 73:
1996#line 834 "/usr/src/libexec/ftpd/ftpcmd.y"
1997{
1998 cmd_type = TYPE_L4;
1999 cmd_bytesz = 8;
2000 }
2001break;
2002case 74:
2003#line 839 "/usr/src/libexec/ftpd/ftpcmd.y"
2004{
2005 cmd_type = TYPE_L4;
2006 cmd_bytesz = yyvsp[0].i;
2007 }
2008break;
2009case 75:
2010#line 845 "/usr/src/libexec/ftpd/ftpcmd.y"
2011{
2012 cmd_type = TYPE_L4;
2013 cmd_bytesz = yyvsp[0].i;
2014 }
2015break;
2016case 76:
2017#line 853 "/usr/src/libexec/ftpd/ftpcmd.y"
2018{
2019 yyval.i = STRU_F1;
2020 }
2021break;
2022case 77:
2023#line 857 "/usr/src/libexec/ftpd/ftpcmd.y"
2024{
2025 yyval.i = STRU_R2;
2026 }
2027break;
2028case 78:
2029#line 861 "/usr/src/libexec/ftpd/ftpcmd.y"
2030{
2031 yyval.i = STRU_P3;
2032 }
2033break;
2034case 79:
2035#line 868 "/usr/src/libexec/ftpd/ftpcmd.y"
2036{
2037 yyval.i = MODE_S1;
2038 }
2039break;
2040case 80:
2041#line 872 "/usr/src/libexec/ftpd/ftpcmd.y"
2042{
2043 yyval.i = MODE_B2;
2044 }
2045break;
2046case 81:
2047#line 876 "/usr/src/libexec/ftpd/ftpcmd.y"
2048{
2049 yyval.i = MODE_C3;
2050 }
2051break;
2052case 82:
2053#line 883 "/usr/src/libexec/ftpd/ftpcmd.y"
2054{
2055 /*
2056 * Problem: this production is used for all pathname
2057 * processing, but only gives a 550 error reply.
2058 * This is a valid reply in some cases but not in others.
2059 */
2060 if (logged_in && yyvsp[0].s && strchr(yyvsp[0].s, '~') != NULL((void *)0)) {
2061 glob_t gl;
2062 int flags =
2063 GLOB_BRACE0x0080|GLOB_NOCHECK0x0010|GLOB_QUOTE0x0400|GLOB_TILDE0x0800;
2064 char *pptr = yyvsp[0].s;
2065
2066 /*
2067 * glob() will only find a leading ~, but
2068 * Netscape kindly puts a slash in front of
2069 * it for publish URLs. There needs to be
2070 * a flag for glob() that expands tildes
2071 * anywhere in the string.
2072 */
2073 if ((pptr[0] == '/') && (pptr[1] == '~'))
2074 pptr++;
2075
2076 memset(&gl, 0, sizeof(gl));
2077 if (glob(pptr, flags, NULL((void *)0), &gl) ||
2078 gl.gl_pathc == 0) {
2079 reply(550, "not found");
2080 yyval.s = NULL((void *)0);
2081 } else {
2082 yyval.s = strdup(gl.gl_pathv[0]);
2083 }
2084 globfree(&gl);
2085 free(yyvsp[0].s);
2086 } else
2087 yyval.s = yyvsp[0].s;
2088 }
2089break;
2090case 84:
2091#line 926 "/usr/src/libexec/ftpd/ftpcmd.y"
2092{
2093 int ret, dec, multby, digit;
2094
2095 /*
2096 * Convert a number that was read as decimal number
2097 * to what it would be if it had been read as octal.
2098 */
2099 dec = yyvsp[0].i;
2100 multby = 1;
2101 ret = 0;
2102 while (dec) {
2103 digit = dec%10;
2104 if (digit > 7) {
2105 ret = -1;
2106 break;
2107 }
2108 ret += digit * multby;
2109 multby *= 8;
2110 dec /= 10;
2111 }
2112 yyval.i = ret;
2113 }
2114break;
2115case 85:
2116#line 953 "/usr/src/libexec/ftpd/ftpcmd.y"
2117{
2118 if (logged_in)
2119 yyval.i = 1;
2120 else {
2121 reply(530, "Please login with USER and PASS.");
2122 yyval.i = 0;
2123 state = 0;
2124 YYABORTgoto yyabort;
2125 }
2126 }
2127break;
2128case 86:
2129#line 967 "/usr/src/libexec/ftpd/ftpcmd.y"
2130{
2131 if (!logged_in) {
2132 reply(530, "Please login with USER and PASS.");
2133 yyval.i = 0;
2134 state = 0;
2135 YYABORTgoto yyabort;
2136 } else if (epsvall) {
2137 reply(501, "the command is disallowed "
2138 "after EPSV ALL");
2139 usedefault = 1;
2140 yyval.i = 0;
2141 } else
2142 yyval.i = 1;
2143 }
2144break;
2145#line 2138 "ftpcmd.c"
2146 }
2147 yyssp -= yym;
2148 yystate = *yyssp;
2149 yyvsp -= yym;
2150 yym = yylhs[yyn];
2151 if (yystate == 0 && yym == 0)
2152 {
2153#if YYDEBUG0
2154 if (yydebug)
2155 printf("%sdebug: after reduction, shifting from state 0 to\
2156 state %d\n", YYPREFIX"yy", YYFINAL1);
2157#endif
2158 yystate = YYFINAL1;
2159 *++yyssp = YYFINAL1;
2160 *++yyvsp = yyval;
2161 if (yychar < 0)
2162 {
2163 if ((yychar = yylex()) < 0) yychar = 0;
2164#if YYDEBUG0
2165 if (yydebug)
2166 {
2167 yys = 0;
2168 if (yychar <= YYMAXTOKEN325) yys = yyname[yychar];
2169 if (!yys) yys = "illegal-symbol";
2170 printf("%sdebug: state %d, reading %d (%s)\n",
2171 YYPREFIX"yy", YYFINAL1, yychar, yys);
2172 }
2173#endif
2174 }
2175 if (yychar == 0) goto yyaccept;
2176 goto yyloop;
2177 }
2178 if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
2179 yyn <= YYTABLESIZE304 && yycheck[yyn] == yystate)
2180 yystate = yytable[yyn];
2181 else
2182 yystate = yydgoto[yym];
2183#if YYDEBUG0
2184 if (yydebug)
2185 printf("%sdebug: after reduction, shifting from state %d \
2186to state %d\n", YYPREFIX"yy", *yyssp, yystate);
2187#endif
2188 if (yyssp >= yysslim && yygrowstack())
2189 {
2190 goto yyoverflow;
2191 }
2192 *++yyssp = yystate;
2193 *++yyvsp = yyval;
2194 goto yyloop;
2195yyoverflow:
2196 yyerror("yacc stack overflow");
2197yyabort:
2198 if (yyss)
2199 free(yyss);
2200 if (yyvs)
2201 free(yyvs);
2202 yyss = yyssp = NULL((void *)0);
2203 yyvs = yyvsp = NULL((void *)0);
2204 yystacksize = 0;
2205 return (1);
2206yyaccept:
2207 if (yyss)
2208 free(yyss);
2209 if (yyvs)
2210 free(yyvs);
2211 yyss = yyssp = NULL((void *)0);
2212 yyvs = yyvsp = NULL((void *)0);
2213 yystacksize = 0;
2214 return (0);
2215}