Mercurial > hg > nginx
comparison src/core/ngx_open_file_cache.c @ 1986:7df9b30e2361
fix segfault when file is deleted and open_file_cache_errors is off
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 29 Apr 2008 14:39:15 +0000 |
parents | ed71d58c0cf3 |
children | 0e628cf11c29 |
comparison
equal
deleted
inserted
replaced
1985:f711544d01b4 | 1986:7df9b30e2361 |
---|---|
171 | 171 |
172 if (file) { | 172 if (file) { |
173 | 173 |
174 file->uses++; | 174 file->uses++; |
175 | 175 |
176 ngx_queue_remove(&file->queue); | |
177 | |
178 if (file->fd == NGX_INVALID_FILE && file->err == 0 && !file->is_dir) { | 176 if (file->fd == NGX_INVALID_FILE && file->err == 0 && !file->is_dir) { |
179 | 177 |
180 /* file was not used often enough to keep open */ | 178 /* file was not used often enough to keep open */ |
181 | 179 |
182 rc = ngx_open_and_stat_file(name->data, of, pool->log); | 180 rc = ngx_open_and_stat_file(name->data, of, pool->log); |
183 | 181 |
184 if (rc != NGX_OK && (of->err == 0 || !of->errors)) { | 182 if (rc != NGX_OK && (of->err == 0 || !of->errors)) { |
185 goto failed; | 183 goto failed; |
186 } | 184 } |
185 | |
186 ngx_queue_remove(&file->queue); | |
187 | 187 |
188 goto add_event; | 188 goto add_event; |
189 } | 189 } |
190 | 190 |
191 if ((file->event && file->use_event) | 191 if ((file->event && file->use_event) |
209 } | 209 } |
210 | 210 |
211 } else { | 211 } else { |
212 of->err = file->err; | 212 of->err = file->err; |
213 } | 213 } |
214 | |
215 ngx_queue_remove(&file->queue); | |
214 | 216 |
215 goto found; | 217 goto found; |
216 } | 218 } |
217 | 219 |
218 ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0, | 220 ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0, |
233 rc = ngx_open_and_stat_file(name->data, of, pool->log); | 235 rc = ngx_open_and_stat_file(name->data, of, pool->log); |
234 | 236 |
235 if (rc != NGX_OK && (of->err == 0 || !of->errors)) { | 237 if (rc != NGX_OK && (of->err == 0 || !of->errors)) { |
236 goto failed; | 238 goto failed; |
237 } | 239 } |
240 | |
241 ngx_queue_remove(&file->queue); | |
238 | 242 |
239 if (of->is_dir) { | 243 if (of->is_dir) { |
240 | 244 |
241 if (file->is_dir || file->err) { | 245 if (file->is_dir || file->err) { |
242 goto update; | 246 goto update; |