From: Michal Sojka Date: Fri, 18 Feb 2011 22:03:58 +0000 (+0100) Subject: forb: Fix races between instances of forb_main_thread X-Git-Url: http://rtime.felk.cvut.cz/gitweb/frescor/frsh-forb.git/commitdiff_plain/5d60dcf39e822701bf43ff9eecf78fc99f63855a?ds=sidebyside forb: Fix races between instances of forb_main_thread The data passed to forb_main_thread must be allocated for each thread separately. Otherwise, threads may access data intended for other threads. --- diff --git a/src/forb/src/forbrun/forbrun.c b/src/forb/src/forbrun/forbrun.c index 9bd7dc73..d1e78db6 100644 --- a/src/forb/src/forbrun/forbrun.c +++ b/src/forb/src/forbrun/forbrun.c @@ -47,6 +47,7 @@ void *forb_main_thread(void *arg) struct forb_main_data *data = arg; int ret; ret = data->forb_main(data->orb, data->argc, data->argv); + free(data); exit(ret); return NULL; } @@ -119,29 +120,29 @@ int main(int argc, char *argv[]) for (i = optind; i < argc; i++) { void *handle; fosa_thread_id_t tid; - struct forb_main_data data; + struct forb_main_data *data = malloc(sizeof(*data)); - data.filename = argv[i]; - handle = dlopen(data.filename, RTLD_LOCAL|RTLD_LAZY); + data->filename = argv[i]; + handle = dlopen(data->filename, RTLD_LOCAL|RTLD_LAZY); if (!handle) - error(1, errno, "dlopen(\"%s\") failed", data.filename); - data.forb_main = dlsym(handle, "forb_main"); - if (!data.forb_main) - error(1, errno, "Cannot find forb_main() in %s", data.filename); + error(1, errno, "dlopen(\"%s\") failed", data->filename); + data->forb_main = dlsym(handle, "forb_main"); + if (!data->forb_main) + error(1, errno, "Cannot find forb_main() in %s", data->filename); - data.orb = orb; + data->orb = orb; - // parse forb parameters - data.argc = 1; - data.argv = &argv[i]; + // prepare forb_main() parameters + data->argc = 1; + data->argv = &argv[i]; while (i+1 < argc) { i++; if (!strcmp(argv[i], "--")) break; else - data.argc++; + data->argc++; } - fosa_thread_create(&tid, NULL, forb_main_thread, &data); + fosa_thread_create(&tid, NULL, forb_main_thread, data); libs_loaded_cnt++; forb_wait_for_server_ready(orb);