Hi, While going through fixing memory leaks in CHASM[1], I fixed some leaks within NSPR and NSS. Here's a list of the leaks that CHASM exposed (doing minimal things with NSS, basically just hashing):
* The error tables are not cleaned up. This is the most invasive
change since it adds a new public function
(nspr_CleanupPRErrorTables) which cleans up *all* error tables. This
means that anything that calls this cleans up every error table that
has been installed. Unfortunately, I see no better way of handling
this since everything is already not threadsafe. This is then called
in PR_Cleanup (The positioning may be too early, but I put it in
reverse order that PR_InitStuff does). A note was also added to the
PR_Cleanup comment.
* Clean up the TPD pointer within _PR_CleanupTPD.
* Call PL_ArenaFinish when cleaning up the arenas.
These patches have made CHASM run silently (as far as NSS/NSPR are
concerned, glibc has a leak in it yet) under valgrind.
I ran the tests, but many failed due to my machine not having a fully
qualified domain name. Since these changes affect cleanup, they
*probably* don't affect other things, but I can set up a machine with a
proper fqdn and rerun the tests (with and without my patches). Thanks.
--Ben
[1]http://chasmd.org
Index: nsprpub/pr/include/prerr.h
===================================================================
RCS file: /cvsroot/mozilla/nsprpub/pr/include/prerr.h,v
retrieving revision 3.10
diff -u -r3.10 prerr.h
--- nsprpub/pr/include/prerr.h 10 May 2007 01:21:41 -0000 3.10
+++ nsprpub/pr/include/prerr.h 7 Apr 2010 20:03:17 -0000
@@ -276,6 +276,7 @@
#define PR_MAX_ERROR (-5924L)
extern void nspr_InitializePRErrorTable(void);
+extern void nspr_CleanupPRErrorTables(void);
#define ERROR_TABLE_BASE_nspr (-6000L)
#endif /* prerr_h___ */
Index: nsprpub/pr/include/prerror.h
===================================================================
RCS file: /cvsroot/mozilla/nsprpub/pr/include/prerror.h,v
retrieving revision 3.14
diff -u -r3.14 prerror.h
--- nsprpub/pr/include/prerror.h 28 May 2007 14:48:26 -0000 3.14
+++ nsprpub/pr/include/prerror.h 7 Apr 2010 20:03:17 -0000
@@ -304,6 +304,17 @@
/***********************************************************************
+** FUNCTION: PR_ErrorCleanupTables
+** DESCRIPTION:
+** Unregisters all error tables with NSPR.
+**
+** NOT THREAD SAFE!
+**
+***********************************************************************/
+NSPR_API(void) PR_ErrorCleanupTables();
+
+
+/***********************************************************************
** FUNCTION: PR_ErrorInstallCallback
** DESCRIPTION:
** Registers an error localization plugin with NSPR. May be called
Index: nsprpub/pr/src/linking/prlink.c
===================================================================
RCS file: /cvsroot/mozilla/nsprpub/pr/src/linking/prlink.c,v
retrieving revision 3.108
diff -u -r3.108 prlink.c
--- nsprpub/pr/src/linking/prlink.c 30 Mar 2010 19:01:52 -0000 3.108
+++ nsprpub/pr/src/linking/prlink.c 7 Apr 2010 20:03:18 -0000
@@ -249,8 +249,6 @@
*/
void _PR_ShutdownLinker(void)
{
- /* FIXME: pr_exe_loadmap should be destroyed. */
-
PR_DestroyMonitor(pr_linker_lock);
pr_linker_lock = NULL;
@@ -258,6 +256,9 @@
free(_pr_currentLibPath);
_pr_currentLibPath = NULL;
}
+
+ PR_FREEIF(pr_exe_loadmap->name);
+ PR_FREEIF(pr_exe_loadmap);
}
/******************************************************************************/
Index: nsprpub/pr/src/misc/prerr.c
===================================================================
RCS file: /cvsroot/mozilla/nsprpub/pr/src/misc/prerr.c,v
retrieving revision 3.11
diff -u -r3.11 prerr.c
--- nsprpub/pr/src/misc/prerr.c 10 May 2007 01:21:41 -0000 3.11
+++ nsprpub/pr/src/misc/prerr.c 7 Apr 2010 20:03:18 -0000
@@ -127,3 +127,7 @@
void nspr_InitializePRErrorTable(void) {
PR_ErrorInstallTable(&et);
}
+
+void nspr_CleanupPRErrorTables(void) {
+ PR_ErrorCleanupTables();
+}
Index: nsprpub/pr/src/misc/prerrortable.c
===================================================================
RCS file: /cvsroot/mozilla/nsprpub/pr/src/misc/prerrortable.c,v
retrieving revision 3.8
diff -u -r3.8 prerrortable.c
--- nsprpub/pr/src/misc/prerrortable.c 25 Apr 2004 15:01:01 -0000 3.8
+++ nsprpub/pr/src/misc/prerrortable.c 7 Apr 2010 20:03:18 -0000
@@ -217,6 +217,26 @@
}
PR_IMPLEMENT(void)
+PR_ErrorCleanupTables()
+{
+ struct PRErrorTableList *et;
+
+ et = Table_List;
+
+ while (et) {
+ struct PRErrorTableList *cet;
+
+ cet = et->next;
+
+ PR_FREEIF(et);
+
+ et = cet;
+ }
+
+ Table_List = NULL;
+}
+
+PR_IMPLEMENT(void)
PR_ErrorInstallCallback(const char * const * languages,
PRErrorCallbackLookupFn *lookup,
PRErrorCallbackNewTableFn *newtable,
Index: nsprpub/pr/src/misc/prinit.c
===================================================================
RCS file: /cvsroot/mozilla/nsprpub/pr/src/misc/prinit.c,v
retrieving revision 3.54
diff -u -r3.54 prinit.c
--- nsprpub/pr/src/misc/prinit.c 3 Apr 2010 18:16:24 -0000 3.54
+++ nsprpub/pr/src/misc/prinit.c 7 Apr 2010 20:03:18 -0000
@@ -365,6 +365,9 @@
* PR_Cleanup() only responds when it is called by the primordial
* thread. Calls by any other thread are silently ignored.
*
+ * PR_Cleanup() calls nspr_CleanupPRErrorTables() which invalidates
+ * all error tables that have been installed.
+ *
* See also: PR_ExitProcess()
*
*----------------------------------------------------------------------
@@ -411,6 +414,8 @@
_PR_MD_EARLY_CLEANUP();
+ nspr_CleanupPRErrorTables();
+
_PR_CleanupMW();
_PR_CleanupTime();
_PR_CleanupDtoa();
Index: nsprpub/pr/src/pthreads/ptthread.c
===================================================================
RCS file: /cvsroot/mozilla/nsprpub/pr/src/pthreads/ptthread.c,v
retrieving revision 3.86
diff -u -r3.86 ptthread.c
--- nsprpub/pr/src/pthreads/ptthread.c 3 Apr 2010 18:16:25 -0000 3.86
+++ nsprpub/pr/src/pthreads/ptthread.c 7 Apr 2010 20:03:18 -0000
@@ -1048,6 +1048,8 @@
_PR_MD_EARLY_CLEANUP();
+ nspr_CleanupPRErrorTables();
+
_PR_CleanupMW();
_PR_CleanupTime();
_PR_CleanupDtoa();
@@ -1080,6 +1082,7 @@
#ifdef _PR_ZONE_ALLOCATOR
_PR_DestroyZones();
#endif
+ _PR_CleanupTPD();
_pr_initialized = PR_FALSE;
return PR_SUCCESS;
}
Index: nsprpub/pr/src/threads/prtpd.c
===================================================================
RCS file: /cvsroot/mozilla/nsprpub/pr/src/threads/prtpd.c,v
retrieving revision 3.13
diff -u -r3.13 prtpd.c
--- nsprpub/pr/src/threads/prtpd.c 3 Apr 2010 18:16:25 -0000 3.13
+++ nsprpub/pr/src/threads/prtpd.c 7 Apr 2010 20:03:18 -0000
@@ -104,6 +104,7 @@
*/
void _PR_CleanupTPD(void)
{
+ PR_FREEIF(_pr_tpd_destructors);
} /* _PR_CleanupTPD */
/*
Index: security/nss/lib/base/arena.c
===================================================================
RCS file: /cvsroot/mozilla/security/nss/lib/base/arena.c,v
retrieving revision 1.13
diff -u -r1.13 arena.c
--- security/nss/lib/base/arena.c 15 Mar 2010 08:29:31 -0000 1.13
+++ security/nss/lib/base/arena.c 7 Apr 2010 20:03:20 -0000
@@ -1154,5 +1154,6 @@
#ifdef DEBUG
rv = nssPointerTracker_finalize(&arena_pointer_tracker);
#endif
+ PL_ArenaFinish();
return rv;
}
pgpO1zUNiko1x.pgp
Description: PGP signature
-- dev-tech-crypto mailing list [email protected] https://lists.mozilla.org/listinfo/dev-tech-crypto

