-
Notifications
You must be signed in to change notification settings - Fork 2k
Fix #12203: return NULL after flb_worker_context_create failure in flb_log_create #12274
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1001,6 +1001,41 @@ struct flb_log_metrics *flb_log_metrics_create() | |
| return metrics; | ||
| } | ||
|
|
||
| /* | ||
| * Release everything flb_log_create() has set up so far, for the failure | ||
| * paths that run after the channel manager pipe exists but before the | ||
| * collector thread is started. flb_log_destroy() cannot be used there: it | ||
| * joins log->tid and dereferences log->worker, neither of which is valid | ||
| * yet. | ||
| */ | ||
| static void log_create_cleanup(struct flb_log *log, struct flb_config *config) | ||
| { | ||
| flb_log_metrics_destroy(log->metrics); | ||
| flb_pipe_destroy(log->ch_mng); | ||
| log_close_sink(log); | ||
| pthread_mutex_destroy(&log->queue_mutex); | ||
| pthread_mutex_destroy(&log->pipeline_queue.mutex); | ||
| mk_event_loop_destroy(log->evl); | ||
| flb_free(log); | ||
| config->log = NULL; | ||
| } | ||
|
|
||
| /* | ||
| * Release the fake worker context flb_log_create() builds for the main | ||
| * thread. The thread-local pointer is cleared too, otherwise it would be | ||
| * left dangling for any later flb_log_create() attempt. | ||
| */ | ||
| static void log_create_worker_cleanup(struct flb_worker *worker) | ||
| { | ||
| if (worker->log_cache) { | ||
| flb_log_cache_destroy(worker->log_cache); | ||
| worker->log_cache = NULL; | ||
| } | ||
| flb_log_worker_destroy(worker); | ||
| flb_free(worker); | ||
| FLB_TLS_SET(flb_worker_ctx, NULL); | ||
| } | ||
|
|
||
| struct flb_log *flb_log_create(struct flb_config *config, int type, | ||
| int level, char *out) | ||
| { | ||
|
|
@@ -1063,19 +1098,15 @@ struct flb_log *flb_log_create(struct flb_config *config, int type, | |
|
|
||
| if (ret == -1) { | ||
| fprintf(stderr, "[log] could not register event\n"); | ||
| mk_event_loop_destroy(log->evl); | ||
| flb_free(log); | ||
| config->log = NULL; | ||
| log_create_cleanup(log, config); | ||
| return NULL; | ||
| } | ||
|
|
||
| /* Create metrics */ | ||
| log->metrics = flb_log_metrics_create(); | ||
| if (log->metrics == NULL) { | ||
| fprintf(stderr, "[log] could not create log metrics\n"); | ||
| mk_event_loop_destroy(log->evl); | ||
| flb_free(log); | ||
| config->log = NULL; | ||
| log_create_cleanup(log, config); | ||
| return NULL; | ||
| } | ||
|
|
||
|
|
@@ -1087,9 +1118,8 @@ struct flb_log *flb_log_create(struct flb_config *config, int type, | |
| worker = flb_worker_context_create(NULL, NULL, config); | ||
| if (!worker) { | ||
| flb_errno(); | ||
| mk_event_loop_destroy(log->evl); | ||
| flb_free(log); | ||
| config->log = NULL; | ||
| log_create_cleanup(log, config); | ||
| return NULL; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
When Useful? React with 👍 / 👎.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ^ @MsfPablo We need to release resources on exceptions. |
||
| } | ||
|
|
||
| /* Set the worker context global */ | ||
|
|
@@ -1099,10 +1129,8 @@ struct flb_log *flb_log_create(struct flb_config *config, int type, | |
| ret = flb_log_worker_init(worker); | ||
| if (ret == -1) { | ||
| flb_errno(); | ||
| mk_event_loop_destroy(log->evl); | ||
| flb_free(log); | ||
| config->log = NULL; | ||
| flb_free(worker); | ||
| log_create_cleanup(log, config); | ||
|
coderabbitai[bot] marked this conversation as resolved.
|
||
| log_create_worker_cleanup(worker); | ||
| return NULL; | ||
| } | ||
| log->worker = worker; | ||
|
|
@@ -1120,10 +1148,10 @@ struct flb_log *flb_log_create(struct flb_config *config, int type, | |
| ret = flb_worker_create(log_worker_collector, log, &log->tid, config); | ||
| if (ret == -1) { | ||
| pthread_mutex_unlock(&log->pth_mutex); | ||
| mk_event_loop_destroy(log->evl); | ||
| flb_free(log->worker); | ||
| flb_free(log); | ||
| config->log = NULL; | ||
| pthread_mutex_destroy(&log->pth_mutex); | ||
| pthread_cond_destroy(&log->pth_cond); | ||
| log_create_worker_cleanup(log->worker); | ||
| log_create_cleanup(log, config); | ||
| return NULL; | ||
| } | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.