From 44b809aa1fe4dcee08f735c8f30e62a548d662a2 Mon Sep 17 00:00:00 2001 From: letz Date: Tue, 30 Nov 2004 17:31:46 +0000 Subject: [PATCH] Fix a segmentation fault in shared memory desallocation if a driver can not be loaded. git-svn-id: svn+ssh://jackaudio.org/trunk/jack@812 0c269be4-1314-0410-8aa9-9f06e86f4224 --- jackd/jackd.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/jackd/jackd.c b/jackd/jackd.c index c711d69..e7dbe35 100644 --- a/jackd/jackd.c +++ b/jackd/jackd.c @@ -150,12 +150,12 @@ jack_main (jack_driver_desc_t * driver_desc, JSList * driver_params) if (jack_engine_load_driver (engine, driver_desc, driver_params)) { fprintf (stderr, "cannot load driver module %s\n", driver_desc->name); - return -1; + goto error; } - if (engine->driver->start (engine->driver) != 0) { - jack_error ("cannot start driver"); - return -1; + if (engine->driver->start (engine->driver) != 0) { + jack_error ("cannot start driver"); + goto error; } /* install a do-nothing handler because otherwise pthreads @@ -197,7 +197,7 @@ jack_main (jack_driver_desc_t * driver_desc, JSList * driver_params) break; } } - + if (sig != SIGSEGV) { /* unblock signals so we can see them during shutdown. @@ -206,9 +206,13 @@ jack_main (jack_driver_desc_t * driver_desc, JSList * driver_params) */ sigprocmask (SIG_UNBLOCK, &signals, 0); } - + jack_engine_delete (engine); return 1; + +error: + jack_engine_delete (engine); + return -1; } static jack_driver_desc_t * @@ -229,7 +233,6 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) filename = malloc (strlen (driver_dir) + 1 + strlen (sofile) + 1); sprintf (filename, "%s/%s", driver_dir, sofile); - if (verbose) { fprintf (stderr, "getting driver descriptor from %s\n", filename); } @@ -278,7 +281,6 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) free (filename); return descriptor; - } static JSList * @@ -323,7 +325,6 @@ jack_drivers_load () if (desc) { driver_list = jack_slist_append (driver_list, desc); } - } err = closedir (dir_stream);