Update of /cvsroot/sblim/sfcb
In directory vz-cvs-3.sog:/tmp/cvs-serv21729
Modified Files:
sfcBroker.c
Log Message:
[3497096] double free during stopProc
Index: sfcBroker.c
===================================================================
RCS file: /cvsroot/sblim/sfcb/sfcBroker.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- sfcBroker.c 23 Feb 2012 21:25:25 -0000 1.61
+++ sfcBroker.c 5 Mar 2012 19:12:09 -0000 1.62
@@ -157,6 +157,10 @@
return 0;
}
+/* 3497096 :77022 */
+extern pthread_mutex_t syncMtx; /* syncronize provider state */
+extern int prov_rdy_state; /* -1 indicates not ready */
+
static pthread_mutex_t sdMtx=PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t sdCnd=PTHREAD_COND_INITIALIZER;
static int stopping=0;
@@ -165,17 +169,42 @@
static void stopBroker(void *p)
{
struct timespec waitTime;
- int rc,sa=0,sp=0;
-
- stopping=1;
-
+ int rc,sa=0,sp=0, count = 0;
+
+ /* SF 3497096 bugzilla 77022 */
+ /* stopping is set to prevent other threads calling this routine */
+ pthread_mutex_lock(&syncMtx);
+ if (stopping) {
+ printf("Stopping sfcb is in progress. Please wait...\n");
+ pthread_mutex_unlock(&syncMtx);
+ return;
+ }
+ else {
+ stopping=1;
+ pthread_mutex_unlock(&syncMtx);
+ }
+
+ /* Look for providers ready status. A 5 seconds wait is performed to
+ * avoid a hang here in the event of provider looping, crashing etc
+ */
+ for (;;) {
+ pthread_mutex_lock(&syncMtx);
+ if (prov_rdy_state == -1) {
+ if (count >= 5) break; /* lock will be released later */
+ pthread_mutex_unlock(&syncMtx);
+ sleep(1);
+ count++;
+ }
+ else break; /* lock will be released later */
+ }
+
stopLocalConnectServer();
for(;;) {
if (adaptersStopped==0) {
pthread_mutex_lock(&sdMtx);
- waitTime.tv_sec=time(NULL)+5;
+ waitTime.tv_sec=time(NULL)+1; //5
waitTime.tv_nsec=0;
if (sa==0) fprintf(stderr,"--- Stopping adapters\n");
sa++;
@@ -191,7 +220,7 @@
if (adaptersStopped) {
pthread_mutex_lock(&sdMtx);
- waitTime.tv_sec=time(NULL)+5;
+ waitTime.tv_sec=time(NULL)+1; //5
waitTime.tv_nsec=0;
if (sp==0) fprintf(stderr,"--- Stopping providers\n");
sp++;
@@ -209,9 +238,11 @@
uninitProvProcCtl();
uninitSocketPairs();
sunsetControl();
-// uninitGarbageCollector();
+ uninitGarbageCollector();
closeLogging();
free((void *)sfcBrokerStart);
+
+ pthread_mutex_unlock(&syncMtx);
if (restartBroker) {
char *emsg=strerror(errno);
|