@@ -3072,10 +3072,11 @@ FD_ZERO(&read_fdset); FD_SET(fd, &read_fdset); select_ret = select(fd + 1, &read_fdset, NULL, NULL, &select_timeout); + if (select_ret == 0) { /* On timeout, terminate starting process */ child_pgid = getpgid(child); if (child_pgid != -1) { kill(-child_pgid, SIGKILL); @@ -3090,15 +3091,19 @@ snprintf(logmsg, sizeof(logmsg), "Method \"start\" timed out after %i seconds ]\n", (int) timeout_val); write(log_fd, logmsg, strlen(logmsg)); close(log_fd); + waitpid(child, NULL, WNOHANG); + return(TCL_ERROR); } if (select_ret > 0) { read_ret = read(fd, &child_pgid, sizeof(child_pgid)); + } else { + read_ret = -1; } /* 4.parent.d. Close read end of pipe */ close(fd); @@ -3113,10 +3118,12 @@ snprintf(logmsg, sizeof(logmsg), "Method \"start\" failed: communication with started service broken ]\n"); write(log_fd, logmsg, strlen(logmsg)); close(log_fd); + waitpid(child, NULL, WNOHANG); + return(TCL_ERROR); } /* 4.parent.f. If the PGID given is actually an error, return error */ if (child_pgid == -1) { @@ -3129,10 +3136,12 @@ snprintf(logmsg, sizeof(logmsg), "Method \"start\" failed ]\n"); write(log_fd, logmsg, strlen(logmsg)); close(log_fd); + waitpid(child, NULL, WNOHANG); + return(TCL_ERROR); } /* 4.parent.g. Return PGID to Tcl */ Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt) child_pgid)); @@ -3143,10 +3152,12 @@ snprintf(logmsg, sizeof(logmsg), "Method \"start\" completed, process group = %lu ]\n", (unsigned long) child_pgid); write(log_fd, logmsg, strlen(logmsg)); close(log_fd); + + waitpid(child, NULL, 0); return(TCL_OK); } /* 4.child.a. Close read end of pipe -- we only write to it */ @@ -3276,11 +3287,11 @@ int Tuapi_Init(Tcl_Interp *interp) { #ifdef USE_TCL_STUBS const char *tclInitStubs_ret; /* Initialize Stubs */ - tclInitStubs_ret = Tcl_InitStubs(interp, "8.4", 0); + tclInitStubs_ret = Tcl_InitStubs(interp, TCL_PATCH_LEVEL, 0); if (!tclInitStubs_ret) { return(TCL_ERROR); } #endif