Bug Summary

File:core/ngx_file.c
Location:line 1008, column 13
Description:Null pointer passed as an argument to a 'nonnull' parameter

Annotated Source Code

1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
6
7
8#include <ngx_config.h>
9#include <ngx_core.h>
10
11
12static ngx_int_t ngx_test_full_name(ngx_str_t *name);
13
14
15static ngx_atomic_t temp_number = 0;
16ngx_atomic_t *ngx_temp_number = &temp_number;
17ngx_atomic_int_t ngx_random_number = 123456;
18
19
20ngx_int_t
21ngx_get_full_name(ngx_pool_t *pool, ngx_str_t *prefix, ngx_str_t *name)
22{
23 size_t len;
24 u_char *p, *n;
25 ngx_int_t rc;
26
27 rc = ngx_test_full_name(name);
28
29 if (rc == NGX_OK0) {
30 return rc;
31 }
32
33 len = prefix->len;
34
35#if (NGX_WIN32)
36
37 if (rc == 2) {
38 len = rc;
39 }
40
41#endif
42
43 n = ngx_pnalloc(pool, len + name->len + 1);
44 if (n == NULL((void*)0)) {
45 return NGX_ERROR-1;
46 }
47
48 p = ngx_cpymem(n, prefix->data, len)(((u_char *) memcpy(n, prefix->data, len)) + (len));
49 ngx_cpystrn(p, name->data, name->len + 1);
50
51 name->len += len;
52 name->data = n;
53
54 return NGX_OK0;
55}
56
57
58static ngx_int_t
59ngx_test_full_name(ngx_str_t *name)
60{
61#if (NGX_WIN32)
62 u_char c0, c1;
63
64 c0 = name->data[0];
65
66 if (name->len < 2) {
67 if (c0 == '/') {
68 return 2;
69 }
70
71 return NGX_DECLINED-5;
72 }
73
74 c1 = name->data[1];
75
76 if (c1 == ':') {
77 c0 |= 0x20;
78
79 if ((c0 >= 'a' && c0 <= 'z')) {
80 return NGX_OK0;
81 }
82
83 return NGX_DECLINED-5;
84 }
85
86 if (c1 == '/') {
87 return NGX_OK0;
88 }
89
90 if (c0 == '/') {
91 return 2;
92 }
93
94 return NGX_DECLINED-5;
95
96#else
97
98 if (name->data[0] == '/') {
99 return NGX_OK0;
100 }
101
102 return NGX_DECLINED-5;
103
104#endif
105}
106
107
108ssize_t
109ngx_write_chain_to_temp_file(ngx_temp_file_t *tf, ngx_chain_t *chain)
110{
111 ngx_int_t rc;
112
113 if (tf->file.fd == NGX_INVALID_FILE-1) {
114 rc = ngx_create_temp_file(&tf->file, tf->path, tf->pool,
115 tf->persistent, tf->clean, tf->access);
116
117 if (rc != NGX_OK0) {
118 return rc;
119 }
120
121 if (tf->log_level) {
122 ngx_log_error(tf->log_level, tf->file.log, 0, "%s %V",if ((tf->file.log)->log_level >= tf->log_level) ngx_log_error_core
(tf->log_level, tf->file.log, 0, "%s %V", tf->warn, &
tf->file.name)
123 tf->warn, &tf->file.name)if ((tf->file.log)->log_level >= tf->log_level) ngx_log_error_core
(tf->log_level, tf->file.log, 0, "%s %V", tf->warn, &
tf->file.name)
;
124 }
125 }
126
127#if (NGX_THREADS && NGX_HAVE_PWRITEV1)
128
129 if (tf->thread_write) {
130 return ngx_thread_write_chain_to_file(&tf->file, chain, tf->offset,
131 tf->pool);
132 }
133
134#endif
135
136 return ngx_write_chain_to_file(&tf->file, chain, tf->offset, tf->pool);
137}
138
139
140ngx_int_t
141ngx_create_temp_file(ngx_file_t *file, ngx_path_t *path, ngx_pool_t *pool,
142 ngx_uint_t persistent, ngx_uint_t clean, ngx_uint_t access)
143{
144 uint32_t n;
145 ngx_err_t err;
146 ngx_pool_cleanup_t *cln;
147 ngx_pool_cleanup_file_t *clnf;
148
149 file->name.len = path->name.len + 1 + path->len + 10;
150
151 file->name.data = ngx_pnalloc(pool, file->name.len + 1);
152 if (file->name.data == NULL((void*)0)) {
153 return NGX_ERROR-1;
154 }
155
156#if 0
157 for (i = 0; i < file->name.len; i++) {
158 file->name.data[i] = 'X';
159 }
160#endif
161
162 ngx_memcpy(file->name.data, path->name.data, path->name.len)(void) memcpy(file->name.data, path->name.data, path->
name.len)
;
163
164 n = (uint32_t) ngx_next_temp_number(0);
165
166 cln = ngx_pool_cleanup_add(pool, sizeof(ngx_pool_cleanup_file_t));
167 if (cln == NULL((void*)0)) {
168 return NGX_ERROR-1;
169 }
170
171 for ( ;; ) {
172 (void) ngx_sprintf(file->name.data + path->name.len + 1 + path->len,
173 "%010uD%Z", n);
174
175 ngx_create_hashed_filename(path, file->name.data, file->name.len);
176
177 ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
178 "hashed path: %s", file->name.data);
179
180 file->fd = ngx_open_tempfile(file->name.data, persistent, access);
181
182 ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
183 "temp fd:%d", file->fd);
184
185 if (file->fd != NGX_INVALID_FILE-1) {
186
187 cln->handler = clean ? ngx_pool_delete_file : ngx_pool_cleanup_file;
188 clnf = cln->data;
189
190 clnf->fd = file->fd;
191 clnf->name = file->name.data;
192 clnf->log = pool->log;
193
194 return NGX_OK0;
195 }
196
197 err = ngx_errno(*__errno_location ());
198
199 if (err == NGX_EEXIST_FILE17) {
200 n = (uint32_t) ngx_next_temp_number(1);
201 continue;
202 }
203
204 if ((path->level[0] == 0) || (err != NGX_ENOPATH2)) {
205 ngx_log_error(NGX_LOG_CRIT, file->log, err,if ((file->log)->log_level >= 3) ngx_log_error_core(
3, file->log, err, "open()" " \"%s\" failed", file->name
.data)
206 ngx_open_tempfile_n " \"%s\" failed",if ((file->log)->log_level >= 3) ngx_log_error_core(
3, file->log, err, "open()" " \"%s\" failed", file->name
.data)
207 file->name.data)if ((file->log)->log_level >= 3) ngx_log_error_core(
3, file->log, err, "open()" " \"%s\" failed", file->name
.data)
;
208 return NGX_ERROR-1;
209 }
210
211 if (ngx_create_path(file, path) == NGX_ERROR-1) {
212 return NGX_ERROR-1;
213 }
214 }
215}
216
217
218void
219ngx_create_hashed_filename(ngx_path_t *path, u_char *file, size_t len)
220{
221 size_t i, level;
222 ngx_uint_t n;
223
224 i = path->name.len + 1;
225
226 file[path->name.len + path->len] = '/';
227
228 for (n = 0; n < 3; n++) {
229 level = path->level[n];
230
231 if (level == 0) {
232 break;
233 }
234
235 len -= level;
236 file[i - 1] = '/';
237 ngx_memcpy(&file[i], &file[len], level)(void) memcpy(&file[i], &file[len], level);
238 i += level + 1;
239 }
240}
241
242
243ngx_int_t
244ngx_create_path(ngx_file_t *file, ngx_path_t *path)
245{
246 size_t pos;
247 ngx_err_t err;
248 ngx_uint_t i;
249
250 pos = path->name.len;
251
252 for (i = 0; i < 3; i++) {
253 if (path->level[i] == 0) {
254 break;
255 }
256
257 pos += path->level[i] + 1;
258
259 file->name.data[pos] = '\0';
260
261 ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,
262 "temp file: \"%s\"", file->name.data);
263
264 if (ngx_create_dir(file->name.data, 0700)mkdir((const char *) file->name.data, 0700) == NGX_FILE_ERROR-1) {
265 err = ngx_errno(*__errno_location ());
266 if (err != NGX_EEXIST17) {
267 ngx_log_error(NGX_LOG_CRIT, file->log, err,if ((file->log)->log_level >= 3) ngx_log_error_core(
3, file->log, err, "mkdir()" " \"%s\" failed", file->name
.data)
268 ngx_create_dir_n " \"%s\" failed",if ((file->log)->log_level >= 3) ngx_log_error_core(
3, file->log, err, "mkdir()" " \"%s\" failed", file->name
.data)
269 file->name.data)if ((file->log)->log_level >= 3) ngx_log_error_core(
3, file->log, err, "mkdir()" " \"%s\" failed", file->name
.data)
;
270 return NGX_ERROR-1;
271 }
272 }
273
274 file->name.data[pos] = '/';
275 }
276
277 return NGX_OK0;
278}
279
280
281ngx_err_t
282ngx_create_full_path(u_char *dir, ngx_uint_t access)
283{
284 u_char *p, ch;
285 ngx_err_t err;
286
287 err = 0;
288
289#if (NGX_WIN32)
290 p = dir + 3;
291#else
292 p = dir + 1;
293#endif
294
295 for ( /* void */ ; *p; p++) {
296 ch = *p;
297
298 if (ch != '/') {
299 continue;
300 }
301
302 *p = '\0';
303
304 if (ngx_create_dir(dir, access)mkdir((const char *) dir, access) == NGX_FILE_ERROR-1) {
305 err = ngx_errno(*__errno_location ());
306
307 switch (err) {
308 case NGX_EEXIST17:
309 err = 0;
310 case NGX_EACCES13:
311 break;
312
313 default:
314 return err;
315 }
316 }
317
318 *p = '/';
319 }
320
321 return err;
322}
323
324
325ngx_atomic_uint_t
326ngx_next_temp_number(ngx_uint_t collision)
327{
328 ngx_atomic_uint_t n, add;
329
330 add = collision ? ngx_random_number : 1;
331
332 n = ngx_atomic_fetch_add(ngx_temp_number, add)__sync_fetch_and_add(ngx_temp_number, add);
333
334 return n + add;
335}
336
337
338char *
339ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
340{
341 char *p = conf;
342
343 ssize_t level;
344 ngx_str_t *value;
345 ngx_uint_t i, n;
346 ngx_path_t *path, **slot;
347
348 slot = (ngx_path_t **) (p + cmd->offset);
349
350 if (*slot) {
351 return "is duplicate";
352 }
353
354 path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));
355 if (path == NULL((void*)0)) {
356 return NGX_CONF_ERROR(void *) -1;
357 }
358
359 value = cf->args->elts;
360
361 path->name = value[1];
362
363 if (path->name.data[path->name.len - 1] == '/') {
364 path->name.len--;
365 }
366
367 if (ngx_conf_full_name(cf->cycle, &path->name, 0) != NGX_OK0) {
368 return NGX_CONF_ERROR(void *) -1;
369 }
370
371 path->conf_file = cf->conf_file->file.name.data;
372 path->line = cf->conf_file->line;
373
374 for (i = 0, n = 2; n < cf->args->nelts; i++, n++) {
375 level = ngx_atoi(value[n].data, value[n].len);
376 if (level == NGX_ERROR-1 || level == 0) {
377 return "invalid value";
378 }
379
380 path->level[i] = level;
381 path->len += level + 1;
382 }
383
384 if (path->len > 10 + i) {
385 return "invalid value";
386 }
387
388 *slot = path;
389
390 if (ngx_add_path(cf, slot) == NGX_ERROR-1) {
391 return NGX_CONF_ERROR(void *) -1;
392 }
393
394 return NGX_CONF_OK((void*)0);
395}
396
397
398char *
399ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path, ngx_path_t *prev,
400 ngx_path_init_t *init)
401{
402 if (*path) {
403 return NGX_CONF_OK((void*)0);
404 }
405
406 if (prev) {
407 *path = prev;
408 return NGX_CONF_OK((void*)0);
409 }
410
411 *path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));
412 if (*path == NULL((void*)0)) {
413 return NGX_CONF_ERROR(void *) -1;
414 }
415
416 (*path)->name = init->name;
417
418 if (ngx_conf_full_name(cf->cycle, &(*path)->name, 0) != NGX_OK0) {
419 return NGX_CONF_ERROR(void *) -1;
420 }
421
422 (*path)->level[0] = init->level[0];
423 (*path)->level[1] = init->level[1];
424 (*path)->level[2] = init->level[2];
425
426 (*path)->len = init->level[0] + (init->level[0] ? 1 : 0)
427 + init->level[1] + (init->level[1] ? 1 : 0)
428 + init->level[2] + (init->level[2] ? 1 : 0);
429
430 if (ngx_add_path(cf, path) != NGX_OK0) {
431 return NGX_CONF_ERROR(void *) -1;
432 }
433
434 return NGX_CONF_OK((void*)0);
435}
436
437
438char *
439ngx_conf_set_access_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
440{
441 char *confp = conf;
442
443 u_char *p;
444 ngx_str_t *value;
445 ngx_uint_t i, right, shift, *access;
446
447 access = (ngx_uint_t *) (confp + cmd->offset);
448
449 if (*access != NGX_CONF_UNSET_UINT(ngx_uint_t) -1) {
450 return "is duplicate";
451 }
452
453 value = cf->args->elts;
454
455 *access = 0600;
456
457 for (i = 1; i < cf->args->nelts; i++) {
458
459 p = value[i].data;
460
461 if (ngx_strncmp(p, "user:", sizeof("user:") - 1)(__extension__ (__builtin_constant_p (sizeof("user:") - 1) &&
((__builtin_constant_p ((const char *) p) && strlen (
(const char *) p) < ((size_t) (sizeof("user:") - 1))) || (
__builtin_constant_p ((const char *) "user:") && strlen
((const char *) "user:") < ((size_t) (sizeof("user:") - 1
)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
((const char *) p) && __builtin_constant_p ((const char
*) "user:") && (__s1_len = strlen ((const char *) p)
, __s2_len = strlen ((const char *) "user:"), (!((size_t)(const
void *)(((const char *) p) + 1) - (size_t)(const void *)((const
char *) p) == 1) || __s1_len >= 4) && (!((size_t)
(const void *)(((const char *) "user:") + 1) - (size_t)(const
void *)((const char *) "user:") == 1) || __s2_len >= 4)) ?
__builtin_strcmp ((const char *) p, (const char *) "user:") :
(__builtin_constant_p ((const char *) p) && ((size_t
)(const void *)(((const char *) p) + 1) - (size_t)(const void
*)((const char *) p) == 1) && (__s1_len = strlen ((const
char *) p), __s1_len < 4) ? (__builtin_constant_p ((const
char *) "user:") && ((size_t)(const void *)(((const char
*) "user:") + 1) - (size_t)(const void *)((const char *) "user:"
) == 1) ? __builtin_strcmp ((const char *) p, (const char *) "user:"
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ((const char *) "user:"); int __result
= (((const unsigned char *) (const char *) ((const char *) p
))[0] - __s2[0]); if (__s1_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) ((const
char *) p))[1] - __s2[1]); if (__s1_len > 1 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
(const char *) p))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ((const char *) p))[3] - __s2[3]); } } __result; }))) : (
__builtin_constant_p ((const char *) "user:") && ((size_t
)(const void *)(((const char *) "user:") + 1) - (size_t)(const
void *)((const char *) "user:") == 1) && (__s2_len =
strlen ((const char *) "user:"), __s2_len < 4) ? (__builtin_constant_p
((const char *) p) && ((size_t)(const void *)(((const
char *) p) + 1) - (size_t)(const void *)((const char *) p) ==
1) ? __builtin_strcmp ((const char *) p, (const char *) "user:"
) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ((const char *) p); int __result = ((
(const unsigned char *) (const char *) ((const char *) "user:"
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) ((const
char *) "user:"))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ((const char *) "user:"))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) ((const char *) "user:"))[3] - __s2[3
]); } } __result; })))) : __builtin_strcmp ((const char *) p,
(const char *) "user:")))); }) : strncmp ((const char *) p, (
const char *) "user:", sizeof("user:") - 1)))
== 0) {
462 shift = 6;
463 p += sizeof("user:") - 1;
464
465 } else if (ngx_strncmp(p, "group:", sizeof("group:") - 1)(__extension__ (__builtin_constant_p (sizeof("group:") - 1) &&
((__builtin_constant_p ((const char *) p) && strlen (
(const char *) p) < ((size_t) (sizeof("group:") - 1))) || (
__builtin_constant_p ((const char *) "group:") && strlen
((const char *) "group:") < ((size_t) (sizeof("group:") -
1)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
((const char *) p) && __builtin_constant_p ((const char
*) "group:") && (__s1_len = strlen ((const char *) p
), __s2_len = strlen ((const char *) "group:"), (!((size_t)(const
void *)(((const char *) p) + 1) - (size_t)(const void *)((const
char *) p) == 1) || __s1_len >= 4) && (!((size_t)
(const void *)(((const char *) "group:") + 1) - (size_t)(const
void *)((const char *) "group:") == 1) || __s2_len >= 4))
? __builtin_strcmp ((const char *) p, (const char *) "group:"
) : (__builtin_constant_p ((const char *) p) && ((size_t
)(const void *)(((const char *) p) + 1) - (size_t)(const void
*)((const char *) p) == 1) && (__s1_len = strlen ((const
char *) p), __s1_len < 4) ? (__builtin_constant_p ((const
char *) "group:") && ((size_t)(const void *)(((const
char *) "group:") + 1) - (size_t)(const void *)((const char *
) "group:") == 1) ? __builtin_strcmp ((const char *) p, (const
char *) "group:") : (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) ((const char *) "group:"
); int __result = (((const unsigned char *) (const char *) ((
const char *) p))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ((const char *) p))[1] - __s2[1]); if (__s1_len >
1 && __result == 0) { __result = (((const unsigned char
*) (const char *) ((const char *) p))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) ((const char *) p))[3] - __s2[3]); } }
__result; }))) : (__builtin_constant_p ((const char *) "group:"
) && ((size_t)(const void *)(((const char *) "group:"
) + 1) - (size_t)(const void *)((const char *) "group:") == 1
) && (__s2_len = strlen ((const char *) "group:"), __s2_len
< 4) ? (__builtin_constant_p ((const char *) p) &&
((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const
void *)((const char *) p) == 1) ? __builtin_strcmp ((const char
*) p, (const char *) "group:") : (- (__extension__ ({ const unsigned
char *__s2 = (const unsigned char *) (const char *) ((const char
*) p); int __result = (((const unsigned char *) (const char *
) ((const char *) "group:"))[0] - __s2[0]); if (__s2_len >
0 && __result == 0) { __result = (((const unsigned char
*) (const char *) ((const char *) "group:"))[1] - __s2[1]); if
(__s2_len > 1 && __result == 0) { __result = (((const
unsigned char *) (const char *) ((const char *) "group:"))[2
] - __s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) ((const char *) "group:"
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp ((const
char *) p, (const char *) "group:")))); }) : strncmp ((const
char *) p, (const char *) "group:", sizeof("group:") - 1)))
== 0) {
466 shift = 3;
467 p += sizeof("group:") - 1;
468
469 } else if (ngx_strncmp(p, "all:", sizeof("all:") - 1)(__extension__ (__builtin_constant_p (sizeof("all:") - 1) &&
((__builtin_constant_p ((const char *) p) && strlen (
(const char *) p) < ((size_t) (sizeof("all:") - 1))) || (__builtin_constant_p
((const char *) "all:") && strlen ((const char *) "all:"
) < ((size_t) (sizeof("all:") - 1)))) ? __extension__ ({ size_t
__s1_len, __s2_len; (__builtin_constant_p ((const char *) p)
&& __builtin_constant_p ((const char *) "all:") &&
(__s1_len = strlen ((const char *) p), __s2_len = strlen ((const
char *) "all:"), (!((size_t)(const void *)(((const char *) p
) + 1) - (size_t)(const void *)((const char *) p) == 1) || __s1_len
>= 4) && (!((size_t)(const void *)(((const char *
) "all:") + 1) - (size_t)(const void *)((const char *) "all:"
) == 1) || __s2_len >= 4)) ? __builtin_strcmp ((const char
*) p, (const char *) "all:") : (__builtin_constant_p ((const
char *) p) && ((size_t)(const void *)(((const char *
) p) + 1) - (size_t)(const void *)((const char *) p) == 1) &&
(__s1_len = strlen ((const char *) p), __s1_len < 4) ? (__builtin_constant_p
((const char *) "all:") && ((size_t)(const void *)((
(const char *) "all:") + 1) - (size_t)(const void *)((const char
*) "all:") == 1) ? __builtin_strcmp ((const char *) p, (const
char *) "all:") : (__extension__ ({ const unsigned char *__s2
= (const unsigned char *) (const char *) ((const char *) "all:"
); int __result = (((const unsigned char *) (const char *) ((
const char *) p))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ((const char *) p))[1] - __s2[1]); if (__s1_len >
1 && __result == 0) { __result = (((const unsigned char
*) (const char *) ((const char *) p))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) ((const char *) p))[3] - __s2[3]); } }
__result; }))) : (__builtin_constant_p ((const char *) "all:"
) && ((size_t)(const void *)(((const char *) "all:") +
1) - (size_t)(const void *)((const char *) "all:") == 1) &&
(__s2_len = strlen ((const char *) "all:"), __s2_len < 4)
? (__builtin_constant_p ((const char *) p) && ((size_t
)(const void *)(((const char *) p) + 1) - (size_t)(const void
*)((const char *) p) == 1) ? __builtin_strcmp ((const char *
) p, (const char *) "all:") : (- (__extension__ ({ const unsigned
char *__s2 = (const unsigned char *) (const char *) ((const char
*) p); int __result = (((const unsigned char *) (const char *
) ((const char *) "all:"))[0] - __s2[0]); if (__s2_len > 0
&& __result == 0) { __result = (((const unsigned char
*) (const char *) ((const char *) "all:"))[1] - __s2[1]); if
(__s2_len > 1 && __result == 0) { __result = (((const
unsigned char *) (const char *) ((const char *) "all:"))[2] -
__s2[2]); if (__s2_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) ((const char *) "all:"
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp ((const
char *) p, (const char *) "all:")))); }) : strncmp ((const char
*) p, (const char *) "all:", sizeof("all:") - 1)))
== 0) {
470 shift = 0;
471 p += sizeof("all:") - 1;
472
473 } else {
474 goto invalid;
475 }
476
477 if (ngx_strcmp(p, "rw")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
((const char *) p) && __builtin_constant_p ((const char
*) "rw") && (__s1_len = strlen ((const char *) p), __s2_len
= strlen ((const char *) "rw"), (!((size_t)(const void *)(((
const char *) p) + 1) - (size_t)(const void *)((const char *)
p) == 1) || __s1_len >= 4) && (!((size_t)(const void
*)(((const char *) "rw") + 1) - (size_t)(const void *)((const
char *) "rw") == 1) || __s2_len >= 4)) ? __builtin_strcmp
((const char *) p, (const char *) "rw") : (__builtin_constant_p
((const char *) p) && ((size_t)(const void *)(((const
char *) p) + 1) - (size_t)(const void *)((const char *) p) ==
1) && (__s1_len = strlen ((const char *) p), __s1_len
< 4) ? (__builtin_constant_p ((const char *) "rw") &&
((size_t)(const void *)(((const char *) "rw") + 1) - (size_t
)(const void *)((const char *) "rw") == 1) ? __builtin_strcmp
((const char *) p, (const char *) "rw") : (__extension__ ({ const
unsigned char *__s2 = (const unsigned char *) (const char *)
((const char *) "rw"); int __result = (((const unsigned char
*) (const char *) ((const char *) p))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) ((const char *) p))[1] - __s2[1]); if
(__s1_len > 1 && __result == 0) { __result = (((const
unsigned char *) (const char *) ((const char *) p))[2] - __s2
[2]); if (__s1_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) ((const char *) p))
[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ((
const char *) "rw") && ((size_t)(const void *)(((const
char *) "rw") + 1) - (size_t)(const void *)((const char *) "rw"
) == 1) && (__s2_len = strlen ((const char *) "rw"), __s2_len
< 4) ? (__builtin_constant_p ((const char *) p) &&
((size_t)(const void *)(((const char *) p) + 1) - (size_t)(const
void *)((const char *) p) == 1) ? __builtin_strcmp ((const char
*) p, (const char *) "rw") : (- (__extension__ ({ const unsigned
char *__s2 = (const unsigned char *) (const char *) ((const char
*) p); int __result = (((const unsigned char *) (const char *
) ((const char *) "rw"))[0] - __s2[0]); if (__s2_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ((const char *) "rw"))[1] - __s2[1]); if (__s2_len >
1 && __result == 0) { __result = (((const unsigned char
*) (const char *) ((const char *) "rw"))[2] - __s2[2]); if (
__s2_len > 2 && __result == 0) __result = (((const
unsigned char *) (const char *) ((const char *) "rw"))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp ((const char *) p
, (const char *) "rw")))); })
== 0) {
478 right = 6;
479
480 } else if (ngx_strcmp(p, "r")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
((const char *) p) && __builtin_constant_p ((const char
*) "r") && (__s1_len = strlen ((const char *) p), __s2_len
= strlen ((const char *) "r"), (!((size_t)(const void *)(((const
char *) p) + 1) - (size_t)(const void *)((const char *) p) ==
1) || __s1_len >= 4) && (!((size_t)(const void *)
(((const char *) "r") + 1) - (size_t)(const void *)((const char
*) "r") == 1) || __s2_len >= 4)) ? __builtin_strcmp ((const
char *) p, (const char *) "r") : (__builtin_constant_p ((const
char *) p) && ((size_t)(const void *)(((const char *
) p) + 1) - (size_t)(const void *)((const char *) p) == 1) &&
(__s1_len = strlen ((const char *) p), __s1_len < 4) ? (__builtin_constant_p
((const char *) "r") && ((size_t)(const void *)(((const
char *) "r") + 1) - (size_t)(const void *)((const char *) "r"
) == 1) ? __builtin_strcmp ((const char *) p, (const char *) "r"
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ((const char *) "r"); int __result = (
((const unsigned char *) (const char *) ((const char *) p))[0
] - __s2[0]); if (__s1_len > 0 && __result == 0) {
__result = (((const unsigned char *) (const char *) ((const char
*) p))[1] - __s2[1]); if (__s1_len > 1 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
(const char *) p))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ((const char *) p))[3] - __s2[3]); } } __result; }))) : (
__builtin_constant_p ((const char *) "r") && ((size_t
)(const void *)(((const char *) "r") + 1) - (size_t)(const void
*)((const char *) "r") == 1) && (__s2_len = strlen (
(const char *) "r"), __s2_len < 4) ? (__builtin_constant_p
((const char *) p) && ((size_t)(const void *)(((const
char *) p) + 1) - (size_t)(const void *)((const char *) p) ==
1) ? __builtin_strcmp ((const char *) p, (const char *) "r")
: (- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ((const char *) p); int __result = ((
(const unsigned char *) (const char *) ((const char *) "r"))[
0] - __s2[0]); if (__s2_len > 0 && __result == 0) {
__result = (((const unsigned char *) (const char *) ((const char
*) "r"))[1] - __s2[1]); if (__s2_len > 1 && __result
== 0) { __result = (((const unsigned char *) (const char *) (
(const char *) "r"))[2] - __s2[2]); if (__s2_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ((const char *) "r"))[3] - __s2[3]); } } __result; })))) :
__builtin_strcmp ((const char *) p, (const char *) "r")))); }
)
== 0) {
481 right = 4;
482
483 } else {
484 goto invalid;
485 }
486
487 *access |= right << shift;
488 }
489
490 return NGX_CONF_OK((void*)0);
491
492invalid:
493
494 ngx_conf_log_error(NGX_LOG_EMERG1, cf, 0, "invalid value \"%V\"", &value[i]);
495
496 return NGX_CONF_ERROR(void *) -1;
497}
498
499
500ngx_int_t
501ngx_add_path(ngx_conf_t *cf, ngx_path_t **slot)
502{
503 ngx_uint_t i, n;
504 ngx_path_t *path, **p;
505
506 path = *slot;
507
508 p = cf->cycle->paths.elts;
509 for (i = 0; i < cf->cycle->paths.nelts; i++) {
510 if (p[i]->name.len == path->name.len
511 && ngx_strcmp(p[i]->name.data, path->name.data)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
((const char *) p[i]->name.data) && __builtin_constant_p
((const char *) path->name.data) && (__s1_len = strlen
((const char *) p[i]->name.data), __s2_len = strlen ((const
char *) path->name.data), (!((size_t)(const void *)(((const
char *) p[i]->name.data) + 1) - (size_t)(const void *)((const
char *) p[i]->name.data) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)(((const char *) path->name.data
) + 1) - (size_t)(const void *)((const char *) path->name.
data) == 1) || __s2_len >= 4)) ? __builtin_strcmp ((const char
*) p[i]->name.data, (const char *) path->name.data) : (
__builtin_constant_p ((const char *) p[i]->name.data) &&
((size_t)(const void *)(((const char *) p[i]->name.data) +
1) - (size_t)(const void *)((const char *) p[i]->name.data
) == 1) && (__s1_len = strlen ((const char *) p[i]->
name.data), __s1_len < 4) ? (__builtin_constant_p ((const char
*) path->name.data) && ((size_t)(const void *)(((
const char *) path->name.data) + 1) - (size_t)(const void *
)((const char *) path->name.data) == 1) ? __builtin_strcmp
((const char *) p[i]->name.data, (const char *) path->
name.data) : (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) ((const char *) path->name
.data); int __result = (((const unsigned char *) (const char *
) ((const char *) p[i]->name.data))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) ((const char *) p[i]->name.data))[
1] - __s2[1]); if (__s1_len > 1 && __result == 0) {
__result = (((const unsigned char *) (const char *) ((const char
*) p[i]->name.data))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ((const char *) p[i]->name.data))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p ((const char *) path->name.
data) && ((size_t)(const void *)(((const char *) path
->name.data) + 1) - (size_t)(const void *)((const char *) path
->name.data) == 1) && (__s2_len = strlen ((const char
*) path->name.data), __s2_len < 4) ? (__builtin_constant_p
((const char *) p[i]->name.data) && ((size_t)(const
void *)(((const char *) p[i]->name.data) + 1) - (size_t)(
const void *)((const char *) p[i]->name.data) == 1) ? __builtin_strcmp
((const char *) p[i]->name.data, (const char *) path->
name.data) : (- (__extension__ ({ const unsigned char *__s2 =
(const unsigned char *) (const char *) ((const char *) p[i]->
name.data); int __result = (((const unsigned char *) (const char
*) ((const char *) path->name.data))[0] - __s2[0]); if (__s2_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) ((const char *) path->name.data))[
1] - __s2[1]); if (__s2_len > 1 && __result == 0) {
__result = (((const unsigned char *) (const char *) ((const char
*) path->name.data))[2] - __s2[2]); if (__s2_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ((const char *) path->name.data))[3] - __s2[3]); } } __result
; })))) : __builtin_strcmp ((const char *) p[i]->name.data
, (const char *) path->name.data)))); })
== 0)
512 {
513 if (p[i]->data != path->data) {
514 ngx_conf_log_error(NGX_LOG_EMERG1, cf, 0,
515 "the same path name \"%V\" "
516 "used in %s:%ui and",
517 &p[i]->name, p[i]->conf_file, p[i]->line);
518 return NGX_ERROR-1;
519 }
520
521 for (n = 0; n < 3; n++) {
522 if (p[i]->level[n] != path->level[n]) {
523 if (path->conf_file == NULL((void*)0)) {
524 if (p[i]->conf_file == NULL((void*)0)) {
525 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, "
"but the different levels, you need to " "redefine one of them in http section"
, &p[i]->name)
526 "the default path name \"%V\" has "if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, "
"but the different levels, you need to " "redefine one of them in http section"
, &p[i]->name)
527 "the same name as another default path, "if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, "
"but the different levels, you need to " "redefine one of them in http section"
, &p[i]->name)
528 "but the different levels, you need to "if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, "
"but the different levels, you need to " "redefine one of them in http section"
, &p[i]->name)
529 "redefine one of them in http section",if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, "
"but the different levels, you need to " "redefine one of them in http section"
, &p[i]->name)
530 &p[i]->name)if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the default path name \"%V\" has " "the same name as another default path, "
"but the different levels, you need to " "redefine one of them in http section"
, &p[i]->name)
;
531 return NGX_ERROR-1;
532 }
533
534 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but "
"the different levels, you need to " "define default path in http section"
, &p[i]->name, p[i]->conf_file, p[i]->line)
535 "the path name \"%V\" in %s:%ui has "if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but "
"the different levels, you need to " "define default path in http section"
, &p[i]->name, p[i]->conf_file, p[i]->line)
536 "the same name as default path, but "if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but "
"the different levels, you need to " "define default path in http section"
, &p[i]->name, p[i]->conf_file, p[i]->line)
537 "the different levels, you need to "if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but "
"the different levels, you need to " "define default path in http section"
, &p[i]->name, p[i]->conf_file, p[i]->line)
538 "define default path in http section",if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but "
"the different levels, you need to " "define default path in http section"
, &p[i]->name, p[i]->conf_file, p[i]->line)
539 &p[i]->name, p[i]->conf_file, p[i]->line)if ((cf->log)->log_level >= 1) ngx_log_error_core(1,
cf->log, 0, "the path name \"%V\" in %s:%ui has " "the same name as default path, but "
"the different levels, you need to " "define default path in http section"
, &p[i]->name, p[i]->conf_file, p[i]->line)
;
540 return NGX_ERROR-1;
541 }
542
543 ngx_conf_log_error(NGX_LOG_EMERG1, cf, 0,
544 "the same path name \"%V\" in %s:%ui "
545 "has the different levels than",
546 &p[i]->name, p[i]->conf_file, p[i]->line);
547 return NGX_ERROR-1;
548 }
549
550 if (p[i]->level[n] == 0) {
551 break;
552 }
553 }
554
555 *slot = p[i];
556
557 return NGX_OK0;
558 }
559 }
560
561 p = ngx_array_push(&cf->cycle->paths);
562 if (p == NULL((void*)0)) {
563 return NGX_ERROR-1;
564 }
565
566 *p = path;
567
568 return NGX_OK0;
569}
570
571
572ngx_int_t
573ngx_create_paths(ngx_cycle_t *cycle, ngx_uid_t user)
574{
575 ngx_err_t err;
576 ngx_uint_t i;
577 ngx_path_t **path;
578
579 path = cycle->paths.elts;
580 for (i = 0; i < cycle->paths.nelts; i++) {
581
582 if (ngx_create_dir(path[i]->name.data, 0700)mkdir((const char *) path[i]->name.data, 0700) == NGX_FILE_ERROR-1) {
583 err = ngx_errno(*__errno_location ());
584 if (err != NGX_EEXIST17) {
585 ngx_log_error(NGX_LOG_EMERG, cycle->log, err,if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, err, "mkdir()" " \"%s\" failed", path[i]->
name.data)
586 ngx_create_dir_n " \"%s\" failed",if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, err, "mkdir()" " \"%s\" failed", path[i]->
name.data)
587 path[i]->name.data)if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, err, "mkdir()" " \"%s\" failed", path[i]->
name.data)
;
588 return NGX_ERROR-1;
589 }
590 }
591
592 if (user == (ngx_uid_t) NGX_CONF_UNSET_UINT(ngx_uint_t) -1) {
593 continue;
594 }
595
596#if !(NGX_WIN32)
597 {
598 ngx_file_info_t fi;
599
600 if (ngx_file_info((const char *) path[i]->name.data, &fi)stat((const char *) (const char *) path[i]->name.data, &
fi)
601 == NGX_FILE_ERROR-1)
602 {
603 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, (*__errno_location ()), "stat()" " \"%s\" failed"
, path[i]->name.data)
604 ngx_file_info_n " \"%s\" failed", path[i]->name.data)if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, (*__errno_location ()), "stat()" " \"%s\" failed"
, path[i]->name.data)
;
605 return NGX_ERROR-1;
606 }
607
608 if (fi.st_uid != user) {
609 if (chown((const char *) path[i]->name.data, user, -1) == -1) {
610 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, (*__errno_location ()), "chown(\"%s\", %d) failed"
, path[i]->name.data, user)
611 "chown(\"%s\", %d) failed",if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, (*__errno_location ()), "chown(\"%s\", %d) failed"
, path[i]->name.data, user)
612 path[i]->name.data, user)if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, (*__errno_location ()), "chown(\"%s\", %d) failed"
, path[i]->name.data, user)
;
613 return NGX_ERROR-1;
614 }
615 }
616
617 if ((fi.st_mode & (S_IRUSR0400|S_IWUSR0200|S_IXUSR0100))
618 != (S_IRUSR0400|S_IWUSR0200|S_IXUSR0100))
619 {
620 fi.st_mode |= (S_IRUSR0400|S_IWUSR0200|S_IXUSR0100);
621
622 if (chmod((const char *) path[i]->name.data, fi.st_mode) == -1) {
623 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, (*__errno_location ()), "chmod() \"%s\" failed"
, path[i]->name.data)
624 "chmod() \"%s\" failed", path[i]->name.data)if ((cycle->log)->log_level >= 1) ngx_log_error_core
(1, cycle->log, (*__errno_location ()), "chmod() \"%s\" failed"
, path[i]->name.data)
;
625 return NGX_ERROR-1;
626 }
627 }
628 }
629#endif
630 }
631
632 return NGX_OK0;
633}
634
635
636ngx_int_t
637ngx_ext_rename_file(ngx_str_t *src, ngx_str_t *to, ngx_ext_rename_file_t *ext)
638{
639 u_char *name;
640 ngx_err_t err;
641 ngx_copy_file_t cf;
642
643#if !(NGX_WIN32)
644
645 if (ext->access) {
646 if (ngx_change_file_access(src->data, ext->access)chmod((const char *) src->data, ext->access) == NGX_FILE_ERROR-1) {
647 ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "chmod()" " \"%s\" failed"
, src->data)
648 ngx_change_file_access_n " \"%s\" failed", src->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "chmod()" " \"%s\" failed"
, src->data)
;
649 err = 0;
650 goto failed;
651 }
652 }
653
654#endif
655
656 if (ext->time != -1) {
657 if (ngx_set_file_time(src->data, ext->fd, ext->time) != NGX_OK0) {
658 ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "utimes()" " \"%s\" failed"
, src->data)
659 ngx_set_file_time_n " \"%s\" failed", src->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "utimes()" " \"%s\" failed"
, src->data)
;
660 err = 0;
661 goto failed;
662 }
663 }
664
665 if (ngx_rename_file(src->data, to->data)rename((const char *) src->data, (const char *) to->data
)
!= NGX_FILE_ERROR-1) {
666 return NGX_OK0;
667 }
668
669 err = ngx_errno(*__errno_location ());
670
671 if (err == NGX_ENOPATH2) {
672
673 if (!ext->create_path) {
674 goto failed;
675 }
676
677 err = ngx_create_full_path(to->data, ngx_dir_access(ext->path_access)(ext->path_access | (ext->path_access & 0444) >>
2)
);
678
679 if (err) {
680 ngx_log_error(NGX_LOG_CRIT, ext->log, err,if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, err, "mkdir()" " \"%s\" failed", to->data)
681 ngx_create_dir_n " \"%s\" failed", to->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, err, "mkdir()" " \"%s\" failed", to->data)
;
682 err = 0;
683 goto failed;
684 }
685
686 if (ngx_rename_file(src->data, to->data)rename((const char *) src->data, (const char *) to->data
)
!= NGX_FILE_ERROR-1) {
687 return NGX_OK0;
688 }
689
690 err = ngx_errno(*__errno_location ());
691 }
692
693#if (NGX_WIN32)
694
695 if (err == NGX_EEXIST17 || err == NGX_EEXIST_FILE17) {
696 err = ngx_win32_rename_file(src, to, ext->log);
697
698 if (err == 0) {
699 return NGX_OK0;
700 }
701 }
702
703#endif
704
705 if (err == NGX_EXDEV18) {
706
707 cf.size = -1;
708 cf.buf_size = 0;
709 cf.access = ext->access;
710 cf.time = ext->time;
711 cf.log = ext->log;
712
713 name = ngx_alloc(to->len + 1 + 10 + 1, ext->log);
714 if (name == NULL((void*)0)) {
715 return NGX_ERROR-1;
716 }
717
718 (void) ngx_sprintf(name, "%*s.%010uD%Z", to->len, to->data,
719 (uint32_t) ngx_next_temp_number(0));
720
721 if (ngx_copy_file(src->data, name, &cf) == NGX_OK0) {
722
723 if (ngx_rename_file(name, to->data)rename((const char *) name, (const char *) to->data) != NGX_FILE_ERROR-1) {
724 ngx_freefree(name);
725
726 if (ngx_delete_file(src->data)unlink((const char *) src->data) == NGX_FILE_ERROR-1) {
727 ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed"
, src->data)
728 ngx_delete_file_n " \"%s\" failed",if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed"
, src->data)
729 src->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed"
, src->data)
;
730 return NGX_ERROR-1;
731 }
732
733 return NGX_OK0;
734 }
735
736 ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "rename()" " \"%s\" to \"%s\" failed"
, name, to->data)
737 ngx_rename_file_n " \"%s\" to \"%s\" failed",if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "rename()" " \"%s\" to \"%s\" failed"
, name, to->data)
738 name, to->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "rename()" " \"%s\" to \"%s\" failed"
, name, to->data)
;
739
740 if (ngx_delete_file(name)unlink((const char *) name) == NGX_FILE_ERROR-1) {
741 ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed"
, name)
742 ngx_delete_file_n " \"%s\" failed", name)if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed"
, name)
;
743
744 }
745 }
746
747 ngx_freefree(name);
748
749 err = 0;
750 }
751
752failed:
753
754 if (ext->delete_file) {
755 if (ngx_delete_file(src->data)unlink((const char *) src->data) == NGX_FILE_ERROR-1) {
756 ngx_log_error(NGX_LOG_CRIT, ext->log, ngx_errno,if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed"
, src->data)
757 ngx_delete_file_n " \"%s\" failed", src->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, (*__errno_location ()), "unlink()" " \"%s\" failed"
, src->data)
;
758 }
759 }
760
761 if (err) {
762 ngx_log_error(NGX_LOG_CRIT, ext->log, err,if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, err, "rename()" " \"%s\" to \"%s\" failed", src
->data, to->data)
763 ngx_rename_file_n " \"%s\" to \"%s\" failed",if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, err, "rename()" " \"%s\" to \"%s\" failed", src
->data, to->data)
764 src->data, to->data)if ((ext->log)->log_level >= 3) ngx_log_error_core(3
, ext->log, err, "rename()" " \"%s\" to \"%s\" failed", src
->data, to->data)
;
765 }
766
767 return NGX_ERROR-1;
768}
769
770
771ngx_int_t
772ngx_copy_file(u_char *from, u_char *to, ngx_copy_file_t *cf)
773{
774 char *buf;
775 off_t size;
776 size_t len;
777 ssize_t n;
778 ngx_fd_t fd, nfd;
779 ngx_int_t rc;
780 ngx_file_info_t fi;
781
782 rc = NGX_ERROR-1;
783 buf = NULL((void*)0);
784 nfd = NGX_INVALID_FILE-1;
785
786 fd = ngx_open_file(from, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0)open((const char *) from, 00|0, 0);
787
788 if (fd == NGX_INVALID_FILE-1) {
789 ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno,if ((cf->log)->log_level >= 3) ngx_log_error_core(3,
cf->log, (*__errno_location ()), "open()" " \"%s\" failed"
, from)
790 ngx_open_file_n " \"%s\" failed", from)if ((cf->log)->log_level >= 3) ngx_log_error_core(3,
cf->log, (*__errno_location ()), "open()" " \"%s\" failed"
, from)
;
791 goto failed;
792 }
793
794 if (cf->size != -1) {
795 size = cf->size;
796
797 } else {
798 if (ngx_fd_info(fd, &fi)fstat(fd, &fi) == NGX_FILE_ERROR-1) {
799 ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "fstat()" " \"%s\" failed"
, from)
800 ngx_fd_info_n " \"%s\" failed", from)if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "fstat()" " \"%s\" failed"
, from)
;
801
802 goto failed;
803 }
804
805 size = ngx_file_size(&fi)(&fi)->st_size;
806 }
807
808 len = cf->buf_size ? cf->buf_size : 65536;
809
810 if ((off_t) len > size) {
811 len = (size_t) size;
812 }
813
814 buf = ngx_alloc(len, cf->log);
815 if (buf == NULL((void*)0)) {
816 goto failed;
817 }
818
819 nfd = ngx_open_file(to, NGX_FILE_WRONLY, NGX_FILE_CREATE_OR_OPEN,open((const char *) to, 01|0100, cf->access)
820 cf->access)open((const char *) to, 01|0100, cf->access);
821
822 if (nfd == NGX_INVALID_FILE-1) {
823 ngx_log_error(NGX_LOG_CRIT, cf->log, ngx_errno,if ((cf->log)->log_level >= 3) ngx_log_error_core(3,
cf->log, (*__errno_location ()), "open()" " \"%s\" failed"
, to)
824 ngx_open_file_n " \"%s\" failed", to)if ((cf->log)->log_level >= 3) ngx_log_error_core(3,
cf->log, (*__errno_location ()), "open()" " \"%s\" failed"
, to)
;
825 goto failed;
826 }
827
828 while (size > 0) {
829
830 if ((off_t) len > size) {
831 len = (size_t) size;
832 }
833
834 n = ngx_read_fdread(fd, buf, len);
835
836 if (n == -1) {
837 ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "read()" " \"%s\" failed"
, from)
838 ngx_read_fd_n " \"%s\" failed", from)if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "read()" " \"%s\" failed"
, from)
;
839 goto failed;
840 }
841
842 if ((size_t) n != len) {
843 ngx_log_error(NGX_LOG_ALERT, cf->log, 0,if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, 0, "read()" " has read only %z of %O from %s", n
, size, from)
844 ngx_read_fd_n " has read only %z of %O from %s",if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, 0, "read()" " has read only %z of %O from %s", n
, size, from)
845 n, size, from)if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, 0, "read()" " has read only %z of %O from %s", n
, size, from)
;
846 goto failed;
847 }
848
849 n = ngx_write_fd(nfd, buf, len);
850
851 if (n == -1) {
852 ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "write()" " \"%s\" failed"
, to)
853 ngx_write_fd_n " \"%s\" failed", to)if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "write()" " \"%s\" failed"
, to)
;
854 goto failed;
855 }
856
857 if ((size_t) n != len) {
858 ngx_log_error(NGX_LOG_ALERT, cf->log, 0,if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, 0, "write()" " has written only %z of %O to %s",
n, size, to)
859 ngx_write_fd_n " has written only %z of %O to %s",if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, 0, "write()" " has written only %z of %O to %s",
n, size, to)
860 n, size, to)if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, 0, "write()" " has written only %z of %O to %s",
n, size, to)
;
861 goto failed;
862 }
863
864 size -= n;
865 }
866
867 if (cf->time != -1) {
868 if (ngx_set_file_time(to, nfd, cf->time) != NGX_OK0) {
869 ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "utimes()" " \"%s\" failed"
, to)
870 ngx_set_file_time_n " \"%s\" failed", to)if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "utimes()" " \"%s\" failed"
, to)
;
871 goto failed;
872 }
873 }
874
875 rc = NGX_OK0;
876
877failed:
878
879 if (nfd != NGX_INVALID_FILE-1) {
880 if (ngx_close_fileclose(nfd) == NGX_FILE_ERROR-1) {
881 ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "close()" " \"%s\" failed"
, to)
882 ngx_close_file_n " \"%s\" failed", to)if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "close()" " \"%s\" failed"
, to)
;
883 }
884 }
885
886 if (fd != NGX_INVALID_FILE-1) {
887 if (ngx_close_fileclose(fd) == NGX_FILE_ERROR-1) {
888 ngx_log_error(NGX_LOG_ALERT, cf->log, ngx_errno,if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "close()" " \"%s\" failed"
, from)
889 ngx_close_file_n " \"%s\" failed", from)if ((cf->log)->log_level >= 2) ngx_log_error_core(2,
cf->log, (*__errno_location ()), "close()" " \"%s\" failed"
, from)
;
890 }
891 }
892
893 if (buf) {
894 ngx_freefree(buf);
895 }
896
897 return rc;
898}
899
900
901/*
902 * ctx->init_handler() - see ctx->alloc
903 * ctx->file_handler() - file handler
904 * ctx->pre_tree_handler() - handler is called before entering directory
905 * ctx->post_tree_handler() - handler is called after leaving directory
906 * ctx->spec_handler() - special (socket, FIFO, etc.) file handler
907 *
908 * ctx->data - some data structure, it may be the same on all levels, or
909 * reallocated if ctx->alloc is nonzero
910 *
911 * ctx->alloc - a size of data structure that is allocated at every level
912 * and is initialized by ctx->init_handler()
913 *
914 * ctx->log - a log
915 *
916 * on fatal (memory) error handler must return NGX_ABORT to stop walking tree
917 */
918
919ngx_int_t
920ngx_walk_tree(ngx_tree_ctx_t *ctx, ngx_str_t *tree)
921{
922 void *data, *prev;
923 u_char *p, *name;
924 size_t len;
925 ngx_int_t rc;
926 ngx_err_t err;
927 ngx_str_t file, buf;
928 ngx_dir_t dir;
929
930 ngx_str_null(&buf)(&buf)->len = 0; (&buf)->data = ((void*)0);
1
Within the expansion of the macro 'ngx_str_null':
a
Null pointer value stored to 'buf.data'
931
932 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,
933 "walk tree \"%V\"", tree);
934
935 if (ngx_open_dir(tree, &dir) == NGX_ERROR-1) {
2
Taking false branch
936 ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,if ((ctx->log)->log_level >= 3) ngx_log_error_core(3
, ctx->log, (*__errno_location ()), "opendir()" " \"%s\" failed"
, tree->data)
937 ngx_open_dir_n " \"%s\" failed", tree->data)if ((ctx->log)->log_level >= 3) ngx_log_error_core(3
, ctx->log, (*__errno_location ()), "opendir()" " \"%s\" failed"
, tree->data)
;
938 return NGX_ERROR-1;
939 }
940
941 prev = ctx->data;
942
943 if (ctx->alloc) {
3
Taking false branch
944 data = ngx_alloc(ctx->alloc, ctx->log);
945 if (data == NULL((void*)0)) {
946 goto failed;
947 }
948
949 if (ctx->init_handler(data, prev) == NGX_ABORT-6) {
950 goto failed;
951 }
952
953 ctx->data = data;
954
955 } else {
956 data = NULL((void*)0);
957 }
958
959 for ( ;; ) {
4
Loop condition is true. Entering loop body
960
961 ngx_set_errno(0)(*__errno_location ()) = 0;
962
963 if (ngx_read_dir(&dir) == NGX_ERROR-1) {
5
Taking false branch
964 err = ngx_errno(*__errno_location ());
965
966 if (err == NGX_ENOMOREFILES0) {
967 rc = NGX_OK0;
968
969 } else {
970 ngx_log_error(NGX_LOG_CRIT, ctx->log, err,if ((ctx->log)->log_level >= 3) ngx_log_error_core(3
, ctx->log, err, "readdir()" " \"%s\" failed", tree->data
)
971 ngx_read_dir_n " \"%s\" failed", tree->data)if ((ctx->log)->log_level >= 3) ngx_log_error_core(3
, ctx->log, err, "readdir()" " \"%s\" failed", tree->data
)
;
972 rc = NGX_ERROR-1;
973 }
974
975 goto done;
976 }
977
978 len = ngx_de_namelen(&dir)strlen((const char *) (&dir)->de->d_name);
979 name = ngx_de_name(&dir)((u_char *) (&dir)->de->d_name);
980
981 ngx_log_debug2(NGX_LOG_DEBUG_CORE, ctx->log, 0,
982 "tree name %uz:\"%s\"", len, name);
983
984 if (len == 1 && name[0] == '.') {
6
Assuming 'len' is not equal to 1
985 continue;
986 }
987
988 if (len == 2 && name[0] == '.' && name[1] == '.') {
7
Assuming 'len' is not equal to 2
989 continue;
990 }
991
992 file.len = tree->len + 1 + len;
993
994 if (file.len + NGX_DIR_MASK_LEN0 > buf.len) {
8
Taking false branch
995
996 if (buf.len) {
997 ngx_freefree(buf.data);
998 }
999
1000 buf.len = tree->len + 1 + len + NGX_DIR_MASK_LEN0;
1001
1002 buf.data = ngx_alloc(buf.len + 1, ctx->log);
1003 if (buf.data == NULL((void*)0)) {
1004 goto failed;
1005 }
1006 }
1007
1008 p = ngx_cpymem(buf.data, tree->data, tree->len)(((u_char *) memcpy(buf.data, tree->data, tree->len)) +
(tree->len))
;
9
Within the expansion of the macro 'ngx_cpymem':
a
Null pointer passed as an argument to a 'nonnull' parameter
1009 *p++ = '/';
1010 ngx_memcpy(p, name, len + 1)(void) memcpy(p, name, len + 1);
1011
1012 file.data = buf.data;
1013
1014 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,
1015 "tree path \"%s\"", file.data);
1016
1017 if (!dir.valid_info) {
1018 if (ngx_de_info(file.data, &dir) == NGX_FILE_ERROR-1) {
1019 ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,if ((ctx->log)->log_level >= 3) ngx_log_error_core(3
, ctx->log, (*__errno_location ()), "stat()" " \"%s\" failed"
, file.data)
1020 ngx_de_info_n " \"%s\" failed", file.data)if ((ctx->log)->log_level >= 3) ngx_log_error_core(3
, ctx->log, (*__errno_location ()), "stat()" " \"%s\" failed"
, file.data)
;
1021 continue;
1022 }
1023 }
1024
1025 if (ngx_de_is_file(&dir)(((&dir)->type) ? ((&dir)->type == DT_REG) : ((
((((&dir)->info.st_mode)) & 0170000) == (0100000))
))
) {
1026
1027 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,
1028 "tree file \"%s\"", file.data);
1029
1030 ctx->size = ngx_de_size(&dir)(&dir)->info.st_size;
1031 ctx->fs_size = ngx_de_fs_size(&dir)(((&dir)->info.st_size < (&dir)->info.st_blocks
* 512) ? ((&dir)->info.st_blocks * 512) : ((&dir)
->info.st_size))
;
1032 ctx->access = ngx_de_access(&dir)(((&dir)->info.st_mode) & 0777);
1033 ctx->mtime = ngx_de_mtime(&dir)(&dir)->info.st_mtim.tv_sec;
1034
1035 if (ctx->file_handler(ctx, &file) == NGX_ABORT-6) {
1036 goto failed;
1037 }
1038
1039 } else if (ngx_de_is_dir(&dir)(((&dir)->type) ? ((&dir)->type == DT_DIR) : ((
((((&dir)->info.st_mode)) & 0170000) == (0040000))
))
) {
1040
1041 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,
1042 "tree enter dir \"%s\"", file.data);
1043
1044 ctx->access = ngx_de_access(&dir)(((&dir)->info.st_mode) & 0777);
1045 ctx->mtime = ngx_de_mtime(&dir)(&dir)->info.st_mtim.tv_sec;
1046
1047 rc = ctx->pre_tree_handler(ctx, &file);
1048
1049 if (rc == NGX_ABORT-6) {
1050 goto failed;
1051 }
1052
1053 if (rc == NGX_DECLINED-5) {
1054 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,
1055 "tree skip dir \"%s\"", file.data);
1056 continue;
1057 }
1058
1059 if (ngx_walk_tree(ctx, &file) == NGX_ABORT-6) {
1060 goto failed;
1061 }
1062
1063 ctx->access = ngx_de_access(&dir)(((&dir)->info.st_mode) & 0777);
1064 ctx->mtime = ngx_de_mtime(&dir)(&dir)->info.st_mtim.tv_sec;
1065
1066 if (ctx->post_tree_handler(ctx, &file) == NGX_ABORT-6) {
1067 goto failed;
1068 }
1069
1070 } else {
1071
1072 ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,
1073 "tree special \"%s\"", file.data);
1074
1075 if (ctx->spec_handler(ctx, &file) == NGX_ABORT-6) {
1076 goto failed;
1077 }
1078 }
1079 }
1080
1081failed:
1082
1083 rc = NGX_ABORT-6;
1084
1085done:
1086
1087 if (buf.len) {
1088 ngx_freefree(buf.data);
1089 }
1090
1091 if (data) {
1092 ngx_freefree(data);
1093 ctx->data = prev;
1094 }
1095
1096 if (ngx_close_dir(&dir)closedir((&dir)->dir) == NGX_ERROR-1) {
1097 ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,if ((ctx->log)->log_level >= 3) ngx_log_error_core(3
, ctx->log, (*__errno_location ()), "closedir()" " \"%s\" failed"
, tree->data)
1098 ngx_close_dir_n " \"%s\" failed", tree->data)if ((ctx->log)->log_level >= 3) ngx_log_error_core(3
, ctx->log, (*__errno_location ()), "closedir()" " \"%s\" failed"
, tree->data)
;
1099 }
1100
1101 return rc;
1102}