Closed
      
        Bug 226692
      
      
        Opened 21 years ago
          Closed 21 years ago
      
        
    
  
[FIXr]mXBLDocInfoWeak (on nsXBLPrototypeBinding) could probably just be a raw ptr     
    Categories
(Core :: XBL, defect, P1)
        Core
          
        
        
      
        
    
        XBL
          
        
        
      
        
    Tracking
()
        RESOLVED
        FIXED
        
    
  
        
            mozilla1.7alpha
        
    
  
People
(Reporter: bzbarsky, Assigned: bzbarsky)
References
Details
Attachments
(1 file, 1 obsolete file)
| 17.02 KB,
          patch         | timeless
:
              
              review+ bryner
:
              
              superreview+ brendan
:
              
              approval1.7a+ | Details | Diff | Splinter Review | 
As it is, the code assumes that it'll be non-null (the retval of
GetXBLDocumentInfo is not really checked).  I don't see any circumstances under
which it could really become null, short of someone holding on to prototype
bindings or bindings outside XBL past document info destruction and then trying
to do something with them...
| Comment 1•21 years ago
           | ||
Surprise.
We're seeing a crash in GKLAYOUT on the GCC OS/2 build.
In particular here:
http://lxr.mozilla.org/seamonkey/source/content/xbl/src/nsXBLPrototypeBinding.cpp#332
332   nsCOMPtr<nsIXBLDocumentInfo> info = GetXBLDocumentInfo(nsnull);
333   
334   return info->DocumentURI();
info is null....
This is after going to  a particular preference page, changing a preference and
clicking OK.
| Comment 2•21 years ago
           | ||
Here's what the patch looks like that works around the crash.
I had to null check in two places.
|   | Assignee | |
| Comment 3•21 years ago
           | ||
mkaply, which preference page and which preference?  That function should never
be returning null (or we need to rename it back and fix all its callers to
null-check (which they currently do not)).
| Comment 4•21 years ago
           | ||
Here's the scenario (it seems to happen mostly with a new profile)
Go to preferences->Debug->Networking
Change Diretcory Listing format from HTML to XUL. Then click OK.
On the OS/2 GCC build, we then crash. 
Doesn't happen on the OS/2 VACPP build.
I can't figure out why this would be compiler specific, except GCC is more
sensitive about uninitialized variables.
|   | Assignee | |
| Comment 5•21 years ago
           | ||
Ok, thanks.  I'll try to debug that when I get back (3 weeks or so).  Either I
will need to change some teardown order somewhere, or the ownership model here
will change.
|   | Assignee | |
| Comment 6•21 years ago
           | ||
I thought about this some more, and it's safest to change the ownership model as
follows:
1)  nsXBLDocumentInfo holds strong refs to the prototype bindings via
    mBindingTable
2)  The prototype bindings hold strong refs to the nsXBLDocumentInfo
3)  nsXBLDocumentInfo::Release checks whether the new refcount is equal to the
    number of objects in mBindingTable; if it is, it clears mBindingTable.
That should make sure things stay alive for the right length of time, and
shouldn't leak.
|   | ||
| Comment 7•21 years ago
           | ||
I have a simpler model that I've implemented in Safari.  The simplification could be applied to Gecko.
(1) Instead of having an nsXBLDocInfo object in Safari, I just made an XBLDocument class that 
subclasses XMLDocument.  The XBLDocument is reference-counted.
(2) A memory cache can addref the XBLDocument to pin it.  This would be somewhat analogous to 
Gecko's chrome cache (which would cache XBL documents).
(3) The XBLDocument owns all the prototype bindings.  The prototype bindings are not reference 
counted.  They die when the XBLDocument dies.
(4) XBLBindings (real bindings, not prototypes) then add refs to the XBLDocument.
With this model, prototype bindings needn't be reference counted, and the XBLDocument can be pulled 
out of a memory cache safely even if XBL bindings are still referencing the document.
|   | Assignee | |
| Comment 8•21 years ago
           | ||
This is more or less hyatt's suggestion, except I kept nsIXBLDocumentInfo,
since we have no sane way to create different document types based on root
namespace.
So the model this patch implents is:
1)  nsXLBDocumentInfo owns all prototype bindings and deletes them in its
    destructor
2)  Everyone else just has weak refs to prototype bindings
3)  nsXBLBinding holds a weak ref to the proto binding and a strong ref to the
    document info
4)  The document info is what's stored in the chrome cache.
        Attachment #137262 -
        Attachment is obsolete: true
|   | Assignee | |
| Comment 9•21 years ago
           | ||
Comment on attachment 140790 [details] [diff] [review]
Proposed fix
Thoughts?  mkaply, does this fix your crash?
        Attachment #140790 -
        Flags: superreview?(bryner)
        Attachment #140790 -
        Flags: review?(timeless)
|   | Assignee | |
| Updated•21 years ago
           | 
Status: NEW → ASSIGNED
Priority: -- → P1
Summary: mXBLDocInfoWeak (on nsXBLPrototypeBinding) could probably just be a raw ptr → [FIX]mXBLDocInfoWeak (on nsXBLPrototypeBinding) could probably just be a raw ptr
Target Milestone: --- → mozilla1.7alpha
|   | ||
| Updated•21 years ago
           | 
        Attachment #140790 -
        Flags: superreview?(bryner) → superreview+
| Comment 10•21 years ago
           | ||
Yes, this fixes the OS/2 crash.
Ganesh - we need this for the OS/2 IWB build.
| Comment 11•21 years ago
           | ||
Comment on attachment 140790 [details] [diff] [review]
Proposed fix
I think I flagged the unchecked new in nsXBLDocumentInfo::SetPrototypeBinding
as an OOM concern, but otherwise this looks fine :)
        Attachment #140790 -
        Flags: review?(timeless) → review+
|   | Assignee | |
| Comment 12•21 years ago
           | ||
Comment on attachment 140790 [details] [diff] [review]
Proposed fix
Could this possibly be approved for 1.7a?  Fixes some crashes by changing the
ownership model around	a bit...
        Attachment #140790 -
        Flags: approval1.7a?
|   | Assignee | |
| Updated•21 years ago
           | 
Summary: [FIX]mXBLDocInfoWeak (on nsXBLPrototypeBinding) could probably just be a raw ptr → [FIXr]mXBLDocInfoWeak (on nsXBLPrototypeBinding) could probably just be a raw ptr
|   | ||
| Comment 13•21 years ago
           | ||
Comment on attachment 140790 [details] [diff] [review]
Proposed fix
a=brendan@mozilla.org for 1.7a.
/be
        Attachment #140790 -
        Flags: approval1.7a? → approval1.7a+
|   | Assignee | |
| Comment 14•21 years ago
           | ||
Checked in for 1.7a
|   | Assignee | |
| Updated•21 years ago
           | 
Status: ASSIGNED → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
|   | ||
| Comment 15•21 years ago
           | ||
<OT>
Wouah. 
David (from Apple) proposes an implementation.
Michael (from IBM) helps investigation.
Boris (from MIT) fixes it.
Ian (from Opera) is QA contact.
This is sooooo open source. Thank you guys!
This was my first and last post off topic on that system, but I couldn't find a
better way to thank you all for your work.
</OT>
          You need to log in
          before you can comment on or make changes to this bug.
        
Description
•