diff mbox

libobjc: Properly handle classes without instance variables in class_copyIvarList ().

Message ID 549AF7D6.5000708@gmail.com
State New
Headers show

Commit Message

Dimitris Papavasiliou Dec. 24, 2014, 5:28 p.m. UTC
Hello,

The attached patch fixes an issue reported a couple of years ago in Bug 
51891 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51891).  The problem 
is caused because classes without instance variables have no ivar list 
at all, so that their ivars pointer is NULL, but the code in 
class_copyIvarList () is unaware of this.

That this is in fact so can be easily verified by checking the code of 
class_addIvar in the same source file, where the ivars list is allocated 
when the first ivar is added.  The code there also checks for a NULL 
ivars pointer.

The patch also adds a simple test-case for this issue.  I think that the 
ChangeLog entry should be something along the lines of:

    2014-12-24  Dimitris Papavasiliou  <dpapavas@gmail.com>

          PR libobjc/51891
          * libobjc/ivars.c: Add a check for classes without instance
	variables, which have a NULL ivar list pointer.
          * gcc/testsuite/objc.dg/gnu-api-2-class.m: Add a test case
	for the above change.

I hope I got the formatting right.  I've run make -k check-objc and all 
tests pass without problems.

Let me know if there are any problems, or if I can do anything else to 
facilitate the acceptance of the patch.

Regards,
Dimitris

Comments

Dimitris Papavasiliou Jan. 5, 2015, 9:50 a.m. UTC | #1
Ping!

On 12/24/2014 07:28 PM, Dimitris Papavasiliou wrote:
> Hello,
>
> The attached patch fixes an issue reported a couple of years ago in Bug
> 51891 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51891).  The problem
> is caused because classes without instance variables have no ivar list
> at all, so that their ivars pointer is NULL, but the code in
> class_copyIvarList () is unaware of this.
>
> That this is in fact so can be easily verified by checking the code of
> class_addIvar in the same source file, where the ivars list is allocated
> when the first ivar is added.  The code there also checks for a NULL
> ivars pointer.
>
> The patch also adds a simple test-case for this issue.  I think that the
> ChangeLog entry should be something along the lines of:
>
>     2014-12-24  Dimitris Papavasiliou  <dpapavas@gmail.com>
>
>           PR libobjc/51891
>           * libobjc/ivars.c: Add a check for classes without instance
>      variables, which have a NULL ivar list pointer.
>           * gcc/testsuite/objc.dg/gnu-api-2-class.m: Add a test case
>      for the above change.
>
> I hope I got the formatting right.  I've run make -k check-objc and all
> tests pass without problems.
>
> Let me know if there are any problems, or if I can do anything else to
> facilitate the acceptance of the patch.
>
> Regards,
> Dimitris
>
Mike Stump Jan. 5, 2015, 9:18 p.m. UTC | #2
On Dec 24, 2014, at 9:28 AM, Dimitris Papavasiliou <dpapavas@gmail.com> wrote:
> The attached patch fixes an issue reported a couple of years ago in Bug 51891 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51891).  The problem is caused because classes without instance variables have no ivar list at all, so that their ivars pointer is NULL, but the code in class_copyIvarList () is unaware of this.
> 
> That this is in fact so can be easily verified by checking the code of class_addIvar in the same source file, where the ivars list is allocated when the first ivar is added.  The code there also checks for a NULL ivars pointer.
> 
> The patch also adds a simple test-case for this issue.  I think that the ChangeLog entry should be something along the lines of:
> 
>   2014-12-24  Dimitris Papavasiliou  <dpapavas@gmail.com>
> 
>         PR libobjc/51891
>         * libobjc/ivars.c: Add a check for classes without instance
> 	variables, which have a NULL ivar list pointer.
>         * gcc/testsuite/objc.dg/gnu-api-2-class.m: Add a test case
> 	for the above change.
> 
> I hope I got the formatting right.  I've run make -k check-objc and all tests pass without problems.
> 
> Let me know if there are any problems, or if I can do anything else to facilitate the acceptance of the patch.
> 
> Regards,
> Dimitris

So, Andrew is the reviewer for libobjc.  I’m not.  I don’t have any issue with it.

Andrew?
Jeff Law Jan. 9, 2015, 5:35 a.m. UTC | #3
On 01/05/15 14:18, Mike Stump wrote:
> On Dec 24, 2014, at 9:28 AM, Dimitris Papavasiliou <dpapavas@gmail.com> wrote:
>> The attached patch fixes an issue reported a couple of years ago in Bug 51891 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51891).  The problem is caused because classes without instance variables have no ivar list at all, so that their ivars pointer is NULL, but the code in class_copyIvarList () is unaware of this.
>>
>> That this is in fact so can be easily verified by checking the code of class_addIvar in the same source file, where the ivars list is allocated when the first ivar is added.  The code there also checks for a NULL ivars pointer.
>>
>> The patch also adds a simple test-case for this issue.  I think that the ChangeLog entry should be something along the lines of:
>>
>>    2014-12-24  Dimitris Papavasiliou  <dpapavas@gmail.com>
>>
>>          PR libobjc/51891
>>          * libobjc/ivars.c: Add a check for classes without instance
>> 	variables, which have a NULL ivar list pointer.
>>          * gcc/testsuite/objc.dg/gnu-api-2-class.m: Add a test case
>> 	for the above change.
>>
>> I hope I got the formatting right.  I've run make -k check-objc and all tests pass without problems.
>>
>> Let me know if there are any problems, or if I can do anything else to facilitate the acceptance of the patch.
>>
>> Regards,
>> Dimitris
>
> So, Andrew is the reviewer for libobjc.  I’m not.  I don’t have any issue with it.
Do you want to be a reviewer for libobjc?  I don't think the load there 
is high, but having someone else who cares about the code is always a 
good thing.

jeff
Andrew Pinski Jan. 9, 2015, 5:38 a.m. UTC | #4
On Wed, Dec 24, 2014 at 9:28 AM, Dimitris Papavasiliou
<dpapavas@gmail.com> wrote:
> Hello,
>
> The attached patch fixes an issue reported a couple of years ago in Bug
> 51891 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51891).  The problem is
> caused because classes without instance variables have no ivar list at all,
> so that their ivars pointer is NULL, but the code in class_copyIvarList ()
> is unaware of this.
>
> That this is in fact so can be easily verified by checking the code of
> class_addIvar in the same source file, where the ivars list is allocated
> when the first ivar is added.  The code there also checks for a NULL ivars
> pointer.
>
> The patch also adds a simple test-case for this issue.  I think that the
> ChangeLog entry should be something along the lines of:
>
>    2014-12-24  Dimitris Papavasiliou  <dpapavas@gmail.com>
>
>          PR libobjc/51891
>          * libobjc/ivars.c: Add a check for classes without instance
>         variables, which have a NULL ivar list pointer.
>          * gcc/testsuite/objc.dg/gnu-api-2-class.m: Add a test case
>         for the above change.
>
> I hope I got the formatting right.  I've run make -k check-objc and all
> tests pass without problems.
>
> Let me know if there are any problems, or if I can do anything else to
> facilitate the acceptance of the patch.


This is ok.

Thanks,
Andrew

>
> Regards,
> Dimitris
>
Andrew Pinski Jan. 9, 2015, 5:40 a.m. UTC | #5
On Thu, Jan 8, 2015 at 9:35 PM, Jeff Law <law@redhat.com> wrote:
> On 01/05/15 14:18, Mike Stump wrote:
>>
>> On Dec 24, 2014, at 9:28 AM, Dimitris Papavasiliou <dpapavas@gmail.com>
>> wrote:
>>>
>>> The attached patch fixes an issue reported a couple of years ago in Bug
>>> 51891 (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51891).  The problem is
>>> caused because classes without instance variables have no ivar list at all,
>>> so that their ivars pointer is NULL, but the code in class_copyIvarList ()
>>> is unaware of this.
>>>
>>> That this is in fact so can be easily verified by checking the code of
>>> class_addIvar in the same source file, where the ivars list is allocated
>>> when the first ivar is added.  The code there also checks for a NULL ivars
>>> pointer.
>>>
>>> The patch also adds a simple test-case for this issue.  I think that the
>>> ChangeLog entry should be something along the lines of:
>>>
>>>    2014-12-24  Dimitris Papavasiliou  <dpapavas@gmail.com>
>>>
>>>          PR libobjc/51891
>>>          * libobjc/ivars.c: Add a check for classes without instance
>>>         variables, which have a NULL ivar list pointer.
>>>          * gcc/testsuite/objc.dg/gnu-api-2-class.m: Add a test case
>>>         for the above change.
>>>
>>> I hope I got the formatting right.  I've run make -k check-objc and all
>>> tests pass without problems.
>>>
>>> Let me know if there are any problems, or if I can do anything else to
>>> facilitate the acceptance of the patch.
>>>
>>> Regards,
>>> Dimitris
>>
>>
>> So, Andrew is the reviewer for libobjc.  I’m not.  I don’t have any issue
>> with it.
>
> Do you want to be a reviewer for libobjc?  I don't think the load there is
> high, but having someone else who cares about the code is always a good
> thing.

I am a reviewer for libobjc, I had missed this patch when it came in
due to the low traffic of libobjc patches and working on other
projects at the time.  I had marked as something I needed to review
but I did not get around to it until now.

Thanks,
Andrew

>
> jeff
Mike Stump Jan. 9, 2015, 5:56 p.m. UTC | #6
On Jan 8, 2015, at 9:38 PM, Andrew Pinski <pinskia@gmail.com> wrote:
>>   2014-12-24  Dimitris Papavasiliou  <dpapavas@gmail.com>
>> 
>>         PR libobjc/51891
>>         * libobjc/ivars.c: Add a check for classes without instance
>>        variables, which have a NULL ivar list pointer.
>>         * gcc/testsuite/objc.dg/gnu-api-2-class.m: Add a test case
>>        for the above change.

> This is ok.

Committed revision 219396.
Mike Stump Jan. 9, 2015, 6:33 p.m. UTC | #7
On Jan 8, 2015, at 9:35 PM, Jeff Law <law@redhat.com> wrote:
> Do you want to be a reviewer for libobjc?

I think things are fine as is.  If things were pinged and there were no response, or if someone wanted to do major updated on the library to bring it up a decade, then we might want to change things.  If someone wanted to do a major update, then, I’d recommend they step forward.
diff mbox

Patch

Index: gcc/testsuite/objc.dg/gnu-api-2-class.m
===================================================================
--- gcc/testsuite/objc.dg/gnu-api-2-class.m	(revision 219054)
+++ gcc/testsuite/objc.dg/gnu-api-2-class.m	(working copy)
@@ -239,6 +239,19 @@ 
       abort ();
   }
 
+  printf ("Testing class_copyIvarList () on class with no instance variables...\n");
+  {
+    unsigned int count;
+    Ivar * list = class_copyIvarList (objc_getClass ("MyOtherSubClass"),
+                                      &count);
+
+    if (count != 0)
+      abort ();
+    
+    if (list != NULL)
+      abort ();
+  }
+
   printf ("Testing class_copyMethodList ()...\n");
   {
     unsigned int count;
Index: libobjc/ivars.c
===================================================================
--- libobjc/ivars.c	(revision 219054)
+++ libobjc/ivars.c	(working copy)
@@ -179,7 +179,7 @@ 
   struct objc_ivar **returnValue = NULL;
   struct objc_ivar_list* ivar_list;
 
-  if (class_ == Nil  ||  CLS_IS_IN_CONSTRUCTION (class_))
+  if (class_ == Nil  ||  CLS_IS_IN_CONSTRUCTION (class_) || !class_->ivars)
     {
       if (numberOfReturnedIvars)
 	*numberOfReturnedIvars = 0;