Closed
Bug 67068
Opened 24 years ago
Closed 24 years ago
Need a SECMOD_Shutdown
Categories
(NSS :: Libraries, defect)
Tracking
(Not tracked)
RESOLVED
FIXED
3.2
People
(Reporter: javi, Assigned: rrelyea)
References
Details
Attachments
(4 files)
(deleted),
patch
|
Details | Diff | Splinter Review | |
(deleted),
patch
|
Details | Diff | Splinter Review | |
(deleted),
patch
|
Details | Diff | Splinter Review | |
(deleted),
patch
|
Details | Diff | Splinter Review |
This is related to Bug 66939.
Client embedding groups are supporting switching profiles without exiting the
application. NSS 3.2 uses a loadable PKCS11 module for its list of trusted
roots. When shutting down NSS, that shared library is not unloaded and then the
next time NSS is initialized, the PKCS11 libraries fail to initialize because
the root certs module was never un-loaded.
PSM bundles the PKCS11 module in the same directory as the executable because we
can't guess the user profile directory before run-time, so every profile that
gets run will be pointed to the same shared library.
I worked around this by calling SECMOD_DeleteModule for the loadable root certs
module before shutting down NSS. In order to make smart cards useable with such
products in the future, we need to have NSS shut down the PKCS11 libraries when
we shut down NSS.
Reporter | ||
Comment 1•24 years ago
|
||
I should add that implementing SECMOD_Shutdown and then calling it from within
NSS_Shutdown would solve this problem as well.
Reporter | ||
Comment 2•24 years ago
|
||
I just did some more investigation and realized PSM 2.0 will need this in NSS3.2
What happens is that the SECMOD libraries keep a global modules variable around.
When you try to re-initialize NSS, the modules variable is already defined so
the new secmod.db is not read/created.
This will mean any embedding app that uses PSM 2.0 will only use the first
semod.db that was loaded for all profiles that get launced. That may be OK, but
is that we want?
Assignee | ||
Comment 3•24 years ago
|
||
I can work on a SECMOD_Shutdown, but
1) I'm not sure we can support a full nss shutdown and restart in the 3.2 time
frame (Mostly because NSS has never been designed to shutdown and restart. This
is a Feature request that needs to be started *BEFORE* we ship betas). 3.2 RTM's
in 2 weeks.
2) You definately won't be able to run two different profiles at the same time.
That is a Stan feature which requires a line in a PRD and a major release to
fulfill.
Reporter | ||
Comment 4•24 years ago
|
||
We don't want to run 2 profiles at the same time. We need to shut one down, and
the initialize another one. cert and key db's are currently working on the Mac,
it's just secmod that can't handle another initialization.
Comment 5•24 years ago
|
||
Right, we certainly don't need two profiles at the same time.
In terms of the time frame, note that this blocks bug 64833. I'm sorry about the
short notice, but at some point in the past month or so, this was working with
profile switching and the problem showed up farily recently.
Assignee | ||
Comment 6•24 years ago
|
||
Assignee | ||
Comment 7•24 years ago
|
||
wtc can you review the patch.
javi. can you try the patch in psm and see if it does in fact allow NSS to be
called and initialized again.
bob
Reporter | ||
Comment 8•24 years ago
|
||
It'll be a day or so before I can get around to applying and testing this patch.
Comment 9•24 years ago
|
||
Bob, your patch is good. By the way, the code in SECMOD_Shutdown
seems to be indented with a tab (or 8 spaces).
Assignee | ||
Comment 10•24 years ago
|
||
Oops. That's now fixed.
BTW, This code assumes that NSS calls have quiessed.... that is if you have an
open encryption or SSL session still running unexpected behavior may result.
Nelson, is it necessary to flush the SSL cache as well (I think it's safest if
you do, and after shutdown nothing in the cashe will be usable as the empheral
wrapping key will have disappeared when the internal token gets closed.
Comment 11•24 years ago
|
||
Nelson, Bob has a question for you in this bug report.
Comment 12•24 years ago
|
||
Yes, The client must call SSL_ClearSessionCache()
any time it changes the SSL configuration (e.g. the
enabled ciphersuites, or versions of SSL/TLS, or if
it wants to shutdown NSS.
Assignee | ||
Comment 13•24 years ago
|
||
OK, SDR wasn't happy last night. Turns out there were a couple of potential
problems: 1) NSS_Shutdown can be called in the middle of NSS_Init if the db's
don't initialize. SECMOD_Init is now tolerant of being called even if the
security module hasn't been initialized. 2) The keys on the slot free list do
not have a slot value in them (since we've freed the reference. Everything
handled this case except when we freed up the slot, when we go to destroy all
the keys were were trying to use symkey->slot which doesn't exit (this one was
the real crash in sdrtest).
Also NOTE: sdrtest does '-d' does not work. I have a separate patch for this
which I'll file under a separate bug.
Assignee | ||
Comment 14•24 years ago
|
||
Comment 15•24 years ago
|
||
Instead of eliminating the call to SECU_ConfigDirectory in
case 'd',
why not change the NSS_Init call to
< rv = NSS_Init(certDir);
> rv = NSS_Init(SECU_ConfigDirectory(NULL));
Assignee | ||
Comment 16•24 years ago
|
||
I also wanted to do the strdup of the parameters as well. With the new
Initialize sequence the SetConfigDirectory stuff really isn't needed anymore.
Assignee | ||
Comment 17•24 years ago
|
||
Assignee | ||
Comment 18•24 years ago
|
||
Comment 19•24 years ago
|
||
The stack trace in the core file generated by sdr.sh is:
(dbx on Solaris 2.6)
detected a multithreaded program
dbx: program is not active
t@1 (l@1) terminated by signal SEGV (no mapping at the fault address)
Current function is SECMOD_DestroyListLock
73 PK11_USE_THREADS(PZ_DestroyMonitor(lock->monitor);)
(dbx) print lock
lock = (nil)
(dbx) where
current thread: t@1
=>[1] SECMOD_DestroyListLock(lock = (nil)), line 73 in "pk11list.c"
[2] SECMOD_Shutdown(), line 179 in "pk11util.c"
[3] NSS_Shutdown(), line 292 in "nssinit.c"
[4] nss_Init(configdir = 0x2b508 ".", certPrefix = 0xef675ea8 "", keyPrefix =
0xef675eac "", secmodName = 0xef675eb0 "secmod.db", readOnly = 1, nodb = 0),
line 237 in "nssinit.c"
[5] NSS_Init(configdir = 0x2b508 "."), line 244 in "nssinit.c"
[6] main(argc = 7, argv = 0xeffff78c), line 163 in "sdrtest.c"
(dbx) up
Current function is SECMOD_Shutdown
179 SECMOD_DestroyListLock(moduleLock);
(dbx) print moduleLock
moduleLock = (nil)
(dbx) list
179 SECMOD_DestroyListLock(moduleLock);
180 moduleLock = NULL;
181 /* free the internal module */
182 SECMOD_DestroyModule(internalModule);
183 internalModule = NULL;
184 /* destroy the list */
185 SECMOD_DestroyModuleList(modules);
186 modules = NULL;
187
188 /* make all the slots and the lists go away */
(dbx)
This particular crash is fixed by Bob's change to pk11util.c.
Bob, your changes to pk11util.c and pk11slot.c are fine.
You can check them in to fix the crash in our test suite.
I don't understand your change to pk11skey.c. You might
want to have Terry or Nelson review it.
Comment 20•24 years ago
|
||
SECU_ConfigDirectory makes a copy of the input arguments, obviating
the strdup. And it handled the logic of defaulting to $HOME in the
absense of a -d option. Most of our commands do this. Should our
commands be consistent about this?
Assignee | ||
Comment 21•24 years ago
|
||
I probably requires looking at more context, so I'll put verbage here to help
whoever reviews it, BTW it's the change the is necessary if sdrtest is actually
ran with a real database. (Wah-Teh's traceback is a case where the database
wasn't available and NSS_Init call NSS_Shutdown before SECMOD_Init is called --
thus the null pointers for the lock.
The change is in the PK11_CleanKeyList() function. This function is only called
when you destroy a Slot (which only happens 1) at shutdown or 2) when you delete
a module). The KeyList is a cache of keys we build up as your system runs so
that we aren't pounding malloc all the time. Each slot has his own list of key
structures that get recycled. One of the expenses of creating a key is creating
a PKCS#11 session object with the key. The cache reuses these sessions as well.
Now when the key for is put on this list, the key's pointer to the slot is
release and the zero'ed. (PK11_FreeSymKey()). When the key is restored, that
slot pointer is restored (PK11_NewSymKey()). When we destroy a slot structure,
all the 'empty' key structures that have been cached in that slot are freed, and
the PKCS #11 sessions associated with them are closed. It's this close step that
was trying to dereference symKey->slot for a key on this list. Fortunately we
know what slot this session belongs to -- it's the slot we are trying to free,
so we use that pointer to tell the PKCS #11 code what slot and session to close.
bob
Comment 22•24 years ago
|
||
OK, Bob, after reading your explanations a few times
I finally got it. Patch reviewed.
Comment 23•24 years ago
|
||
Mozilla 0.8 builds started today. We would consider taking reviewed low risk
fixes if they are available today (Wednesday, 7/Feb/01) or tomorrow (Thursday,
8/Feb/01). Otherwise, please set the target milestone to Mozilla 0.9. Thanks.
Reporter | ||
Comment 24•24 years ago
|
||
This will not make it into 0.8 since it would require picking up a new version
of NSS that has not been officially released yet.
The current implementation will not allow you to open 2 Security Module
databases on the Mac iff the user(s) switch profiles. Embedding projects will
not care about this limitation unless they want to allow different users to use
different sets of smart cards on the Mac.
I
Assignee | ||
Comment 26•24 years ago
|
||
Javi, I'm going to close this bug now. NSS_Shutdown() seems to work in the
contexts that we currently call it. If you have any problems with PSM use then
open a new bug on that problem.
Status: NEW → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
Assignee | ||
Comment 27•24 years ago
|
||
*** Bug 69470 has been marked as a duplicate of this bug. ***
You need to log in
before you can comment on or make changes to this bug.
Description
•