From 04ea820b91d40ed30eed4b56ad2f4a12a552cb3f Mon Sep 17 00:00:00 2001 From: hobbs Date: Wed, 13 Oct 1999 00:32:49 +0000 Subject: * unix/Makefile.in: purify has to use -best-effort to instrument * unix/tclAppInit.c: identified potential mem leak when compiling tcltest (not critical) * unix/tclUnixPipe.c: fixed mem leak in TclpCreateProcess when doing alloc between vfork and execvp. * unix/tclUnixTest.c: fixed mem leak in findexecutable test command --- unix/Makefile.in | 10 +++++----- unix/tclAppInit.c | 5 ++++- unix/tclUnixInit.c | 4 ++-- unix/tclUnixPipe.c | 49 ++++++++++++++++++++++++++++--------------------- unix/tclUnixTest.c | 5 ++++- 5 files changed, 43 insertions(+), 30 deletions(-) diff --git a/unix/Makefile.in b/unix/Makefile.in index ab8b03f..a36f5bb 100644 --- a/unix/Makefile.in +++ b/unix/Makefile.in @@ -5,7 +5,7 @@ # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # -# RCS: @(#) $Id: Makefile.in,v 1.47 1999/09/21 06:37:29 hobbs Exp $ +# RCS: @(#) $Id: Makefile.in,v 1.48 1999/10/13 00:32:49 hobbs Exp $ VERSION = @TCL_VERSION@ @@ -213,7 +213,7 @@ DLTEST_DIR = @TCL_SRC_DIR@/unix/dltest # Must be absolute to so the corresponding tcltest's tcl_library is absolute. TCL_BUILDTIME_LIBRARY= @TCL_SRC_DIR@/library -#CC = purify @CC@ +#CC = purify -best-effort @CC@ CC = @CC@ #---------------------------------------------------------------- @@ -460,7 +460,7 @@ topDirName: gendate: yacc -l $(GENERIC_DIR)/tclGetDate.y sed -e 's/yy/TclDate/g' -e '/^#include /d' \ - -e 's/SCCSID/RCS: @(#) $$Id: Makefile.in,v 1.47 1999/09/21 06:37:29 hobbs Exp $$/' \ + -e 's?SCCSID?RCS: @(#) $$Id: Makefile.in,v 1.48 1999/10/13 00:32:49 hobbs Exp $$?' \ -e '/#ifdef __STDC__/,/#endif/d' -e '/TclDateerrlab:/d' \ -e '/TclDatenewstate:/d' -e '/#pragma/d' \ -e '/#include /d' \ @@ -1064,8 +1064,8 @@ dist: $(UNIX_DIR)/configure cp -p $(GENERIC_DIR)/*.decls $(DISTDIR)/generic cp -p $(GENERIC_DIR)/README $(DISTDIR)/generic cp -p $(GENERIC_DIR)/tclGetDate.y $(DISTDIR)/generic - cp -p $(TOP_DIR)/changes $(TOP_DIR)/README* $(TOP_DIR)/license.terms \ - $(DISTDIR) + cp -p $(TOP_DIR)/changes $(TOP_DIR)/ChangeLog $(TOP_DIR)/README* \ + $(TOP_DIR)/license.terms $(DISTDIR) mkdir $(DISTDIR)/library cp -p $(TOP_DIR)/license.terms $(TOP_DIR)/library/*.tcl \ $(TOP_DIR)/library/tclIndex $(DISTDIR)/library diff --git a/unix/tclAppInit.c b/unix/tclAppInit.c index e452705..45d86eb 100644 --- a/unix/tclAppInit.c +++ b/unix/tclAppInit.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclAppInit.c,v 1.6 1999/05/14 02:18:32 stanton Exp $ + * RCS: @(#) $Id: tclAppInit.c,v 1.7 1999/10/13 00:32:49 hobbs Exp $ */ #include "tcl.h" @@ -69,6 +69,9 @@ main(argc, argv) #ifdef TCL_TEST /* * Pass the build time location of the tcl library (to find init.tcl) + * + * This causes a 2400b "potential" mem leak, according to purify + * (the obj allocation that never seems to gets deallocated) */ Tcl_Obj *path; path = Tcl_NewStringObj(TCL_BUILDTIME_LIBRARY, -1); diff --git a/unix/tclUnixInit.c b/unix/tclUnixInit.c index b0ca270..ca1d357 100644 --- a/unix/tclUnixInit.c +++ b/unix/tclUnixInit.c @@ -7,7 +7,7 @@ * Copyright (c) 1999 by Scriptics Corporation. * All rights reserved. * - * RCS: @(#) $Id: tclUnixInit.c,v 1.17 1999/07/22 21:50:56 redman Exp $ + * RCS: @(#) $Id: tclUnixInit.c,v 1.18 1999/10/13 00:32:49 hobbs Exp $ */ #include "tclInt.h" @@ -604,7 +604,7 @@ TclpSetVariables(interp) * TclpFindVariable -- * * Locate the entry in environ for a given name. On Unix this - * routine is case sensetive, on Windows this matches mioxed case. + * routine is case sensetive, on Windows this matches mixed case. * * Results: * The return value is the index in environ of an entry with the diff --git a/unix/tclUnixPipe.c b/unix/tclUnixPipe.c index b78715c..f140555 100644 --- a/unix/tclUnixPipe.c +++ b/unix/tclUnixPipe.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixPipe.c,v 1.3 1999/04/16 00:48:05 stanton Exp $ + * RCS: @(#) $Id: tclUnixPipe.c,v 1.4 1999/10/13 00:32:50 hobbs Exp $ */ #include "tclInt.h" @@ -333,7 +333,9 @@ TclpCreateProcess(interp, argc, argv, inputFile, outputFile, errorFile, TclFile errPipeIn, errPipeOut; int joinThisError, count, status, fd; char errSpace[200 + TCL_INTEGER_SPACE]; - int pid; + Tcl_DString *dsArray; + char **newArgv; + int pid, i; errPipeIn = NULL; errPipeOut = NULL; @@ -350,13 +352,20 @@ TclpCreateProcess(interp, argc, argv, inputFile, outputFile, errorFile, goto error; } + /* + * We need to allocate and convert this before the (v)fork + * so it is properly deallocated later + */ + dsArray = (Tcl_DString *) ckalloc(argc * sizeof(Tcl_DString)); + newArgv = (char **) ckalloc((argc+1) * sizeof(char *)); + newArgv[argc] = NULL; + for (i = 0; i < argc; i++) { + newArgv[i] = Tcl_UtfToExternalDString(NULL, argv[i], -1, &dsArray[i]); + } + joinThisError = (errorFile == outputFile); pid = vfork(); if (pid == 0) { - Tcl_DString *dsArray; - char *oldArgv0; - int i; - fd = GetFd(errPipeOut); /* @@ -370,8 +379,7 @@ TclpCreateProcess(interp, argc, argv, inputFile, outputFile, errorFile, ((dup2(1,2) == -1) || (fcntl(2, F_SETFD, 0) != 0)))) { sprintf(errSpace, - "%dforked process couldn't set up input/output: ", - errno); + "%dforked process couldn't set up input/output: ", errno); write(fd, errSpace, (size_t) strlen(errSpace)); _exit(1); } @@ -381,22 +389,21 @@ TclpCreateProcess(interp, argc, argv, inputFile, outputFile, errorFile, */ RestoreSignals(); - for (i = 0; argv[i] != NULL; i++) { - /* - * How many arguments? - */ - } - oldArgv0 = argv[0]; - dsArray = (Tcl_DString *) ckalloc(i * sizeof(Tcl_DString)); - for (i = 0; argv[i] != NULL; i++) { - argv[i] = Tcl_UtfToExternalDString(NULL, argv[i], -1, &dsArray[i]); - } - execvp(argv[0], argv); /* INTL: Native. */ - sprintf(errSpace, "%dcouldn't execute \"%.150s\": ", errno, - oldArgv0); + execvp(newArgv[0], newArgv); /* INTL: Native. */ + sprintf(errSpace, "%dcouldn't execute \"%.150s\": ", errno, argv[0]); write(fd, errSpace, (size_t) strlen(errSpace)); _exit(1); } + + /* + * Free the mem we used for the fork + */ + for (i = 0; i < argc; i++) { + Tcl_DStringFree(&dsArray[i]); + } + ckfree((char *) dsArray); + ckfree((char *) newArgv); + if (pid == -1) { Tcl_AppendResult(interp, "couldn't fork child process: ", Tcl_PosixError(interp), (char *) NULL); diff --git a/unix/tclUnixTest.c b/unix/tclUnixTest.c index 7c7559b..d556a2b 100644 --- a/unix/tclUnixTest.c +++ b/unix/tclUnixTest.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixTest.c,v 1.10 1999/04/16 00:48:05 stanton Exp $ + * RCS: @(#) $Id: tclUnixTest.c,v 1.11 1999/10/13 00:32:50 hobbs Exp $ */ #include "tclInt.h" @@ -465,6 +465,9 @@ TestfindexecutableCmd(clientData, interp, argc, argv) Tcl_SetResult(interp, tclExecutableName, TCL_VOLATILE); ckfree(tclExecutableName); } + if (tclNativeExecutableName != NULL) { + ckfree(tclNativeExecutableName); + } tclExecutableName = oldName; tclNativeExecutableName = oldNativeName; -- cgit v0.12