bug-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Serious bug in NSTextView (and a fix)


From: Ludovic Marcotte
Subject: Serious bug in NSTextView (and a fix)
Date: Fri, 19 Oct 2001 10:24:54 -0400 (EDT)

In NSTextView: -_updateMultipleTextViews, we have:

if ([[_layoutManager textContainers] count] > 1)
  {
     _tvf.multiple_textviews = YES;
     _notifObject = [_layoutManager firstTextView];
  }
else
  {
     _tvf.multiple_textviews = NO;
     _notifObject = self;
  }  

So, _notifObject can be equal to self (our NSTextView instance). 
When -dealloc is called on NSTextView, -dealloc is called on 
NSText and on NSView.

In NSView -dealloc, we call NSView: -_unregisterDraggedTypes. This 
method calls _removeDragTypes from 
xgps/Source/SharedX/XGContextEvent.m.

The problem here is that we can have a crash in _removeDragTypes 
since  "self" (our NSTextView object) can still be referenced by 
an object in the autorelease pool and get released.

The object itself, is a NSNotification object created when we post
five critical notifications those NSTextView's methods:

NSTextView: -setRulerVisible
NSTextView: -shouldChangeTextInRange: replacementString
NSTextView: -didChangeText
NSTextView: -resignFirstResponder
NSTextView: -_illegalMovement:

Actually, IMO, only -resignFirstResponder can be problematic. We
can safely replace in NSTextView.m:

- (BOOL) resignFirstResponder
{
  ...
  ...
  [nc postNotificationName: NSTextDidEndEditingNotification  
      object: _notifObject];
  
  return YES;
}

by:

- (BOOL) resignFirstResponder
{
  NSNotification *aNotification;
  ..
  aNotification = [[NSNotification alloc]
initWithName: NSTextDidEndEditingNotification
                                          object: _notifObject
                                          userInfo: nil];
  [nc postNotification: aNotification];
  RELEASE(aNotification);

  return YES;
}

To be *sure* that our NSTextView object won't be retained by an object
(a NSNotification object) in an autorelease pool.

I've done extensive testing for that with GNUMail.app and I can tell
that it works and solve the problem.

Thanks a lot,

Ludo

-- 
Live as if you were to die tomorrow.
Learn as if you were to live forever.
 - Gandhi




reply via email to

[Prev in Thread] Current Thread [Next in Thread]