]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
forb: Fix races between instances of forb_main_thread
authorMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 18 Feb 2011 22:03:58 +0000 (23:03 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 18 Feb 2011 22:32:59 +0000 (23:32 +0100)
The data passed to forb_main_thread must be allocated for each thread
separately. Otherwise, threads may access data intended for other threads.

src/forbrun/forbrun.c

index 9bd7dc733487f62cf7728b17ca92b76acf877ecc..d1e78db64adf6dcb99836f5812b8e3ad99da4dab 100644 (file)
@@ -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);