Like others, I've been bothered by the MAXFD messages. So I looked at
recent SVN history, picked up post-2.2.8 delta 594, and noticed some 
residual issues. Here are three patches, one per issue:

1) cfpclose() can and should pclose(pp) even after issuing the MAXFD warning.
2) *all* calls to pthread_mutex_unlock() need to be #ifdef'ed. Also fix
   a trivial cut-and-paste error in a CfLog() call.
3) don't let cfpopen() gratuitously fail when the MAXFD limit is exceeded:
   we've already successfully launched the child process, and there is now
   code in place to cfpwait() even when we've lost track of the child pid.
diff -ru old/src/popen.c new/src/popen.c
--- old/src/popen.c	2008-09-07 23:29:55.000000000 +0200
+++ new/src/popen.c	2008-09-07 23:32:14.358426000 +0200
@@ -722,8 +722,7 @@
       "MAXFD, check for defunct children", fd);
    CfLog(cferror,OUTPUT,"");
    /* We can't wait for the specific pid as it isn't stored in CHILD. */
-   cfpwait(-1);
-   return -1;
+   pid = -1;
    }
 else
    {
diff -ru old/src/popen.c new/src/popen.c
--- old/src/popen.c	2008-09-07 23:32:14.000000000 +0200
+++ new/src/popen.c	2008-09-07 23:35:00.080215160 +0200
@@ -67,7 +67,7 @@
 #if defined HAVE_PTHREAD_H && (defined HAVE_LIBPTHREAD || defined BUILDTIN_GCC_THREAD)
 if (pthread_mutex_lock(&MUTEX_COUNT) != 0)
    {
-   CfLog(cferror,"pthread_mutex_unlock failed","pthread_mutex_unlock");
+   CfLog(cferror,"pthread_mutex_lock failed","pthread_mutex_lock");
    return NULL;
    }
 #endif
@@ -76,7 +76,9 @@
    {
    if ((CHILD = calloc(MAXFD,sizeof(pid_t))) == NULL)
       {
+#if defined HAVE_PTHREAD_H && (defined HAVE_LIBPTHREAD || defined BUILDTIN_GCC_THREAD)
       pthread_mutex_unlock(&MUTEX_COUNT);
+#endif
       return NULL;
       }
    }
diff -ru old/src/popen.c new/src/popen.c
--- old/src/popen.c	2008-09-07 23:38:34.000000000 +0200
+++ new/src/popen.c	2008-09-07 23:40:31.883798240 +0200
@@ -201,15 +201,12 @@
       {
       snprintf(OUTPUT,CF_BUFSIZE,"File descriptor %d of child %d higher than MAXFD, check for defunct children", fileno(pp), pid);
       CfLog(cferror,OUTPUT,"");
-      /* Don't leave zombies. */
-      cfpwait(pid);
-      return NULL;
       }
    else
       {
       CHILD[fileno(pp)] = pid;
-      return pp;
       }
+   return pp;
    }
 
 return NULL; /* Cannot reach here */
@@ -376,9 +373,6 @@
       {
       snprintf(OUTPUT,CF_BUFSIZE,"File descriptor %d of child %d higher than MAXFD, check for defunct children", fileno(pp), pid);
       CfLog(cferror,OUTPUT,"");
-      /* Don't leave zombies. */
-      cfpwait(pid);
-      return NULL;
       }
    else
       {
@@ -501,9 +495,6 @@
       {
       snprintf(OUTPUT,CF_BUFSIZE,"File descriptor %d of child %d higher than MAXFD, check for defunct children", fileno(pp), pid);
       CfLog(cferror,OUTPUT,"");
-      /* Don't leave zombies. */
-      cfpwait(pid);
-      return NULL;
       }
    else
       {
@@ -650,9 +641,6 @@
       {
       snprintf(OUTPUT,CF_BUFSIZE,"File descriptor %d of child %d higher than MAXFD, check for defunct children", fileno(pp), pid);
       CfLog(cferror,OUTPUT,"");
-      /* Don't leave zombies. */
-      cfpwait(pid);
-      return NULL;
       }
    else
       {
_______________________________________________
Bug-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/bug-cfengine

Reply via email to