Hello community, here is the log from the commit of package sblim-sfcb checked in at Sat Nov 8 20:26:18 CET 2008. -------- --- sblim-sfcb/sblim-sfcb.changes 2008-10-24 08:32:46.000000000 +0200 +++ /mounts/work_src_done/STABLE/sblim-sfcb/sblim-sfcb.changes 2008-11-07 23:42:17.000000000 +0100 @@ -1,0 +2,11 @@ +Fri Nov 7 14:39:22 MST 2008 - bwhiteley@suse.de + +- Better patch for HTTP connection close -- sblim tracker #2193250 +- Handle more escaped chars in XML (bnc#435882, sblim#2169807) + +------------------------------------------------------------------- +Wed Oct 29 14:15:17 MDT 2008 - bwhiteley@suse.de + +- Better patch for shutdown deadlock -- sblim tracker #2185304 + +------------------------------------------------------------------- @@ -14,0 +26,5 @@ +- SBLIM tracker #2189391 fork() race condition in providerDrv.c:getProcess() +- SBLIM tracker #2192023 sfcb deadlocks on nsHt initialization +- SBLIM tracker #2185304 SFCB doesn't shut down properly a good portion + of the time. +- bnc:438758, SBLIM tracker #2189234 wrong minimal provider check calling whatdependson for head-i586 New: ---- 0190-2189391-fix-fork-race-in-getProcess.patch 0200-2192023-Fix-nsHt-deadlock.patch 0210-2185304-shutdown_deadlock_remove_mlogf.patch 0220-2189234-minimal-provider-count-is-3-4-with-interOpProvider.patch 0230-2169807-435882-xml-char-ref.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ sblim-sfcb.spec ++++++ --- /var/tmp/diff_new_pack.I32392/_old 2008-11-08 20:25:28.000000000 +0100 +++ /var/tmp/diff_new_pack.I32392/_new 2008-11-08 20:25:28.000000000 +0100 @@ -21,7 +21,7 @@ Name: sblim-sfcb Version: 1.3.2 -Release: 8 +Release: 9 Group: System/Management License: Other uncritical OpenSource License; CPL 1.0 Url: http://sblim.sf.net/ @@ -53,6 +53,11 @@ Patch160: 0160-2158198-syslog.patch Patch170: 0170-2172023-mlogf.patch Patch180: 0180-2175507-alloca_sockaddr.patch +Patch190: 0190-2189391-fix-fork-race-in-getProcess.patch +Patch200: 0200-2192023-Fix-nsHt-deadlock.patch +Patch210: 0210-2185304-shutdown_deadlock_remove_mlogf.patch +Patch220: 0220-2189234-minimal-provider-count-is-3-4-with-interOpProvider.patch +Patch230: 0230-2169807-435882-xml-char-ref.patch Provides: cimserver Provides: cim-server %if 0%{?suse_version} >= 1030 @@ -105,6 +110,11 @@ %patch160 -p0 -b .0160-2158198-syslog.patch %patch170 -p0 -b .0170-2172023-mlogf.patch %patch180 -p0 -b .0180-2175507-alloca_sockaddr.patch +%patch190 -p1 -b .0190-2189391-fix-fork-race-in-getProcess.patch +%patch200 -p1 -b .0200-2192023-Fix-nsHt-deadlock.patch +%patch210 -p0 -b .0210-2185304 +%patch220 -p1 -b .0220-2189234-minimal-provider-count-is-3-4-with-interOpProvider.patch +%patch230 -p0 -b .0230-2169807-435882-xml-char-ref.patch export PATCH_GET=0 %build @@ -191,6 +201,11 @@ %files -f _pkg_list %changelog +* Fri Nov 07 2008 bwhiteley@suse.de +- Better patch for HTTP connection close -- sblim tracker #2193250 +- Handle more escaped chars in XML (bnc#435882, sblim#2169807) +* Wed Oct 29 2008 bwhiteley@suse.de +- Better patch for shutdown deadlock -- sblim tracker #2185304 * Wed Oct 22 2008 bwhiteley@suse.de - The following bugs from the sblim tracker address bnc#425457 - [ 2164750 ] sfcb does not handle some malformed HTTP requests correctly @@ -203,6 +218,11 @@ - [ 2172023 ] mlogf call cleanups - [ 2175507 ] sockaddr_un not allocated for localconnect server - Some code cleanup. +- SBLIM tracker #2189391 fork() race condition in providerDrv.c:getProcess() +- SBLIM tracker #2192023 sfcb deadlocks on nsHt initialization +- SBLIM tracker #2185304 SFCB doesn't shut down properly a good portion + of the time. +- bnc:438758, SBLIM tracker #2189234 wrong minimal provider check * Wed Oct 15 2008 kkaempf@suse.de - help Buildservice executing shell scripts. * Tue Oct 14 2008 kkaempf@suse.de ++++++ 0110-2164750-sfcb_handle_malformed_requests.patch ++++++ --- /var/tmp/diff_new_pack.I32392/_old 2008-11-08 20:25:28.000000000 +0100 +++ /var/tmp/diff_new_pack.I32392/_new 2008-11-08 20:25:28.000000000 +0100 @@ -87,13 +87,13 @@ if (r < 0 && (errno == EINTR || errno == EAGAIN)) continue; - if (r <= 0) break; + if (r == 0) { -+ if (b->size == 0 || -+ (strstr(b->data, "\r\n\r\n") == NULL && -+ strstr(b->data, "\n\n") == NULL)) { -+ mlogf(M_ERROR,M_SHOW,"-#- HTTP header ended prematurely\n"); -+ state = 3; -+ break; -+ } ++ if (b->size == 0) break; ++ if (strstr(b->data, "\r\n\r\n") == NULL && ++ strstr(b->data, "\n\n") == NULL) { ++ mlogf(M_ERROR,M_SHOW,"-#- HTTP header ended prematurely\n"); ++ state = 3; ++ break; ++ } + } add2buffer(b, buf, r); ++++++ 0190-2189391-fix-fork-race-in-getProcess.patch ++++++
From ab68a4ef1edb2d2ee4a8e2361c5762e01f62b898 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Klaus=20K=C3=A4mpf?=
Date: Thu, 23 Oct 2008 15:07:26 +0200 Subject: [PATCH] fix fork() race in getProcess
This line (*proc)->pid = info->pid = fork(); presents a race condition, since both processes (parent and child) inherit the 'info' and the '*proc' pointers. So depending who runs first, (*proc)->pid and info->pid either set to 0 (child proc last) or to the childs pid (parent proc last). With the fix, only the parent (tracking children) writes to shared data structs. --- providerDrv.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/providerDrv.c b/providerDrv.c index 0ffc920..ad04bfe 100644 --- a/providerDrv.c +++ b/providerDrv.c @@ -555,6 +555,7 @@ static int getProcess(ProviderInfo * info, ProviderProcess ** proc) for (i = 0; i < provProcMax; i++) { if (provProc[i].pid == 0) { + pid_t pid; *proc = provProc + i; providerSockets=sPairs[(*proc)->id]; @@ -565,14 +566,14 @@ static int getProcess(ProviderInfo * info, ProviderProcess ** proc) info->proc = *proc; info->next = NULL; - (*proc)->pid = info->pid = fork(); + pid = fork(); - if (info->pid < 0) { + if (pid < 0) { perror("provider fork"); _SFCB_ABORT(); } - if (info->pid == 0) { + if (pid == 0) { /* child */ currentProc=getpid(); setSignal(SIGCHLD, SIG_DFL,0); @@ -590,8 +591,6 @@ static int getProcess(ProviderInfo * info, ProviderProcess ** proc) getInode(providerSockets.receive))); processName=info->providerName; providerProcess=1; - info->proc=*proc; - info->pid=currentProc; semSetValue(sfcbSem,PROV_GUARD((*proc)->id),0); semSetValue(sfcbSem,PROV_INUSE((*proc)->id),0); @@ -606,6 +605,7 @@ static int getProcess(ProviderInfo * info, ProviderProcess ** proc) else { info->startSeq=++seq; + info->pid = (*proc)->pid = pid; } _SFCB_TRACE(1,("--- Fork provider OK %s %d %d", info->providerName, info->pid, i)); -- 1.6.0.2 ++++++ 0200-2192023-Fix-nsHt-deadlock.patch ++++++
From d67f071cb4ce08bcfaf2dcd1b267e40929f816cd Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Klaus=20K=C3=A4mpf?=
Date: Fri, 24 Oct 2008 15:56:51 +0200 Subject: [PATCH] Fix nsHt deadlock
The global namespace hash table must only be created once. On fast multi-core systems, a simple 'if (nsHt != NULL)' is not sufficient since another thread might still be filling nsHt. --- classProviderGz.c | 21 +++++++++++++++++---- 1 files changed, 17 insertions(+), 4 deletions(-) diff --git a/classProviderGz.c b/classProviderGz.c index 10b88e9..07748c7 100644 --- a/classProviderGz.c +++ b/classProviderGz.c @@ -124,6 +124,7 @@ typedef struct nameSpaces { } NameSpaces; static UtilHashTable *nsHt=NULL; +static pthread_once_t nsHt_once = PTHREAD_ONCE_INIT; static int nsBaseLen; static void buildInheritanceTable(ClassRegister * cr) @@ -402,12 +403,13 @@ static ClassRegister *newClassRegister(char *fname) free(buf); free(cc); } - +#if 0 if (cr->vr) { mlogf(M_INFO,M_SHOW,"--- Caching ClassProvider for %s (%d.%d-%d) using %ld bytes\n", fin, cr->vr->version, cr->vr->level, cr->vr->objImplLevel, total); } else mlogf(M_INFO,M_SHOW,"--- Caching ClassProvider for %s (no-version) using %ld bytes\n", fin, total); +#endif buildInheritanceTable(cr); @@ -476,6 +478,11 @@ static UtilHashTable *buildClassRegisters() return gatherNameSpaces(dn,NULL,1); } +static void nsHt_init() +{ + nsHt=buildClassRegisters(); +} + static ClassRegister *getNsReg(const CMPIObjectPath *ref, int *rc) { @@ -483,9 +490,15 @@ static ClassRegister *getNsReg(const CMPIObjectPath *ref, int *rc) CMPIString *nsi=CMGetNameSpace(ref,NULL); ClassRegister *cReg; *rc=0; - - if (nsHt==NULL) nsHt=buildClassRegisters(); - + + pthread_once(&nsHt_once, nsHt_init); + + if (nsHt==NULL) { + mlogf(M_ERROR,M_SHOW,"--- ClassProvider: namespace hash table not initialized\n"); + *rc = 1; + return NULL; + } + if (nsi && nsi->hdl) { ns=(char*)nsi->hdl; if (strcasecmp(ns,"root/pg_interop")==0) -- 1.6.0.2 ++++++ 0210-2185304-shutdown_deadlock_remove_mlogf.patch ++++++ Index: sfcBroker.c =================================================================== RCS file: /cvsroot/sblim/sfcb/sfcBroker.c,v retrieving revision 1.42 diff -u -p -r1.42 sfcBroker.c --- sfcBroker.c 2 Oct 2008 16:35:23 -0000 1.42 +++ sfcBroker.c 29 Oct 2008 19:00:34 -0000 @@ -226,12 +226,12 @@ static void stopBroker(void *p) stopLocalConnectServer(); for(;;) { - waitTime.tv_sec=time(NULL)+5; - waitTime.tv_nsec=0; if (adaptersStopped==0) { pthread_mutex_lock(&sdMtx); - if (sa==0) mlogf(M_INFO,M_SHOW,"--- Stopping adapters\n"); + waitTime.tv_sec=time(NULL)+5; + waitTime.tv_nsec=0; + if (sa==0) fprintf(stderr,"--- Stopping adapters\n"); sa++; if (stopNextAdapter()) { rc=pthread_cond_timedwait(&sdCnd,&sdMtx,&waitTime); @@ -245,7 +245,9 @@ static void stopBroker(void *p) if (adaptersStopped) { pthread_mutex_lock(&sdMtx); - if (sp==0) mlogf(M_INFO,M_SHOW,"--- Stopping providers\n"); + waitTime.tv_sec=time(NULL)+5; + waitTime.tv_nsec=0; + if (sp==0) fprintf(stderr,"--- Stopping providers\n"); sp++; if (stopNextProc()) { rc=pthread_cond_timedwait(&sdCnd,&sdMtx,&waitTime); @@ -265,9 +267,8 @@ static void stopBroker(void *p) if (restartBroker) { char *emsg=strerror(errno); - mlogf(M_INFO,M_SHOW,"---\n"); execvp("sfcbd",restartArgv); - mlogf(M_ERROR,M_SHOW,"--- execv for restart problem: %s\n",emsg); + fprintf(stderr,"--- execv for restart problem: %s\n",emsg); abort(); } @@ -303,7 +304,7 @@ static void handleSigquit(int sig) pthread_attr_t tattr; if (sfcBrokerPid==currentProc) { - mlogf(M_INFO,M_SHOW, "--- Winding down %s\n", processName); + fprintf(stderr,"--- Winding down %s\n", processName); pthread_attr_init(&tattr); pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); pthread_create(&t, &tattr, (void *(*)(void *))stopBroker,NULL); @@ -319,7 +320,7 @@ static void handleSigHup(int sig) if (sfcBrokerPid==currentProc) { restartBroker=1; - mlogf(M_INFO,M_SHOW, "--- Restarting %s\n", processName); + fprintf(stderr,"--- Restarting %s\n", processName); pthread_attr_init(&tattr); pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); pthread_create(&t, &tattr, (void *(*)(void *))stopBroker,NULL); @@ -353,7 +354,7 @@ static void handleSigChld(int sig) // mlogf(M_INFO,M_SHOW,"sigchild %d\n",pid); if (testStartedAdapter(pid,&left)) { if (left==0) { - mlogf(M_INFO,M_SHOW,"--- Adapters stopped\n"); + fprintf(stderr,"--- Adapters stopped\n"); adaptersStopped=1; } pthread_attr_init(&tattr); @@ -362,7 +363,7 @@ static void handleSigChld(int sig) } else if (testStartedProc(pid,&left)) { if (left==0) { - mlogf(M_INFO,M_SHOW,"--- Providers stopped\n"); + fprintf(stderr,"--- Providers stopped\n"); providersStopped=1; } pthread_attr_init(&tattr); @@ -379,7 +380,7 @@ static void handleSigterm(int sig) { if (!terminating) { - mlogf(M_ERROR,M_SHOW, "--- %s - %d exiting due to signal %d\n", processName, currentProc, sig); + fprintf(stderr,"--- %s - %d exiting due to signal %d\n", processName, currentProc, sig); dumpTiming(currentProc); } terminating=1; @@ -391,13 +392,13 @@ static void handleSigterm(int sig) static void handleSigSegv(int sig) { - mlogf(M_ERROR,M_SHOW, "-#- %s - %d exiting due to a SIGSEGV signal\n", + fprintf(stderr,"-#- %s - %d exiting due to a SIGSEGV signal\n", processName, currentProc); } /* static void handleSigAbort(int sig) { - mlogf(M_INFO,M_SHOW, "%s: exiting due to a SIGABRT signal - %d\n", processName, currentProc); + fprintf(stderr,"%s: exiting due to a SIGABRT signal - %d\n", processName, currentProc); kill(0, SIGTERM); } */ ++++++ 0220-2189234-minimal-provider-count-is-3-4-with-interOpProvider.patch ++++++
From cb2eefbd0510eb64c682254563c15ec39f706602 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Klaus=20K=C3=A4mpf?=
Date: Thu, 23 Oct 2008 13:37:16 +0200 Subject: [PATCH] minimal provider count is 3 (4 with interOpProvider)
--- sfcBroker.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sfcBroker.c b/sfcBroker.c index 827eb7b..74ea376 100644 --- a/sfcBroker.c +++ b/sfcBroker.c @@ -727,12 +727,12 @@ int main(int argc, char *argv[]) else exFlags = exFlags | 2; - if ((enableInterOp && pSockets < 2 ) || pSockets < 1) { + if ((enableInterOp && pSockets < 4 ) || pSockets < 3) { /* adjusting provider number */ if (enableInterOp) { - pSockets = 2; + pSockets = 4; } else { - pSockets = 1; + pSockets = 3; } mlogf(M_INFO,M_SHOW, "--- Max provider process number adjusted to %d\n", pSockets); -- 1.6.0.2 ++++++ 0230-2169807-435882-xml-char-ref.patch ++++++ diff -up ./cimXmlParser.c.orig ./cimXmlParser.c --- ./cimXmlParser.c.orig 2008-11-07 14:46:15.000000000 -0700 +++ ./cimXmlParser.c 2008-11-07 14:47:59.000000000 -0700 @@ -324,7 +324,9 @@ static struct _xmlescape { { ">", '>', 4 }, { "<", '<', 4 }, { " ", ' ', 6 }, + { " ", ' ', 5 }, { " ", '\n', 5 }, + { " ", '\n', 5 }, }; static int xmlUnescape(char *buf, char *end) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org