[PATCH] posix: Only check shm_unlink obj_err if necessary

Will nyphbl8d at gmail.com
Sun Jun 28 00:23:54 UTC 2020


Ticket 4016 opened for 5.1 and patch sent with appropriate close tag.

On Sat, Jun 27, 2020 at 4:30 PM Gedare Bloom <gedare at rtems.org> wrote:

> This needs a ticket now to apply to 5, and we'll want to apply to 6 also.
> Can you open a ticket and post a patch for 5.1?
>
> On Thu, Jun 25, 2020, 5:49 PM Kinsey Moore <kinsey.moore at oarcorp.com>
> wrote:
>
>> Hey Gedare,
>> Setting obj_err to 0 would get the desired outcome, but the logic as it
>> exists now is faulty. Setting obj_err to a value that can't be produced by
>> _POSIX_Shm_Get_by_name would be a better option, but it would still be
>> checking an error value after successful execution. _POSIX_Shm_Get_by_name
>> relies on _Objects_Get_by_name internally which states about obj_err: The
>> error indication in case of failure. If _POSIX_Shm_Get_by_name returns
>> OBJECTS_GET_BY_NAME_NO_OBJECT (which it can), the current logic treats that
>> as a success and operates on a NULL pointer.
>>
>> -----Original Message-----
>> From: Gedare Bloom <gedare at rtems.org>
>> Sent: Thursday, June 25, 2020 16:49
>> To: Kinsey Moore <kinsey.moore at oarcorp.com>
>> Cc: devel at rtems.org
>> Subject: Re: [PATCH] posix: Only check shm_unlink obj_err if necessary
>>
>> Hi Kinsey,
>>
>> I missed seeing this. Two quick questions for you.
>>
>> 1. does it also work to initialize obj_err to 0? that would be simpler
>> code.
>>
>> 2. I see the error handling logic changes slightly, with
>> OBJECTS_GET_BY_NAME_NO_OBJECT now returning ENOENT. I guess if it works to
>> init obj_err to 0, this case should be merged back to the
>> OBJECTS_GET_BY_NAME_INVALID_NAME case?
>>
>> On Thu, Jun 25, 2020 at 2:21 PM Kinsey Moore <kinsey.moore at oarcorp.com>
>> wrote:
>> >
>> > Is there anything stopping this from being merged? I just ran into this
>> bug again on the current project I'm working on.
>> >
>> > Kinsey
>> >
>> > -----Original Message-----
>> > From: Kinsey Moore <kinsey.moore at oarcorp.com>
>> > Sent: Tuesday, January 28, 2020 12:37
>> > To: devel at rtems.org
>> > Cc: Kinsey Moore <kinsey.moore at oarcorp.com>
>> > Subject: [PATCH] posix: Only check shm_unlink obj_err if necessary
>> >
>> > In the nominal case checked by spsysinit01, obj_err is unmodified if
>> _POSIX_Shm_Get_by_name returns non-NULL. In the case of shm_unlink, this
>> means an uninitialized value is passed into the switch and it appears this
>> test was passing by virtue of the stack having the right value on it in
>> most cases. This now checks obj_err only if _POSIX_Shm_Get_by_name returns
>> NULL.
>> > ---
>> >  cpukit/posix/src/shmunlink.c | 45
>> > ++++++++++++++++++------------------
>> >  1 file changed, 23 insertions(+), 22 deletions(-)
>> >
>> > diff --git a/cpukit/posix/src/shmunlink.c
>> > b/cpukit/posix/src/shmunlink.c index 00d743ac80..39c2ba0d87 100644
>> > --- a/cpukit/posix/src/shmunlink.c
>> > +++ b/cpukit/posix/src/shmunlink.c
>> > @@ -29,28 +29,29 @@ int shm_unlink( const char *name )
>> >    _Objects_Allocator_lock();
>> >
>> >    shm = _POSIX_Shm_Get_by_name( name, 0, &obj_err );
>> > -  switch ( obj_err ) {
>> > -    case OBJECTS_GET_BY_NAME_INVALID_NAME:
>> > -      err = ENOENT;
>> > -      break;
>> > -
>> > -    case OBJECTS_GET_BY_NAME_NAME_TOO_LONG:
>> > -      err = ENAMETOOLONG;
>> > -      break;
>> > -
>> > -    case OBJECTS_GET_BY_NAME_NO_OBJECT:
>> > -    default:
>> > -      _Objects_Namespace_remove_string(
>> > -        &_POSIX_Shm_Information,
>> > -        &shm->Object
>> > -      );
>> > -
>> > -      if ( shm->reference_count == 0 ) {
>> > -        /* Only remove the shm object if no references exist to it.
>> Otherwise,
>> > -         * the shm object will be freed later in
>> _POSIX_Shm_Attempt_delete */
>> > -        _POSIX_Shm_Free( shm );
>> > -      }
>> > -      break;
>> > +  if ( shm ) {
>> > +    _Objects_Namespace_remove_string(
>> > +      &_POSIX_Shm_Information,
>> > +      &shm->Object
>> > +    );
>> > +
>> > +    if ( shm->reference_count == 0 ) {
>> > +      /* Only remove the shm object if no references exist to it.
>> Otherwise,
>> > +       * the shm object will be freed later in
>> _POSIX_Shm_Attempt_delete */
>> > +      _POSIX_Shm_Free( shm );
>> > +    }
>> > +  } else {
>> > +    switch ( obj_err ) {
>> > +      case OBJECTS_GET_BY_NAME_NAME_TOO_LONG:
>> > +        err = ENAMETOOLONG;
>> > +        break;
>> > +
>> > +      case OBJECTS_GET_BY_NAME_INVALID_NAME:
>> > +      case OBJECTS_GET_BY_NAME_NO_OBJECT:
>> > +      default:
>> > +        err = ENOENT;
>> > +        break;
>> > +    }
>> >    }
>> >
>> >    _Objects_Allocator_unlock();
>> > --
>> > 2.20.1
>> >
>> > _______________________________________________
>> > devel mailing list
>> > devel at rtems.org
>> > http://lists.rtems.org/mailman/listinfo/devel
>>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200627/718dfb5e/attachment.html>


More information about the devel mailing list