Print this page
10880 posix_memalign() should avoid clobbering return parameter on failure

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/gen/posix_memalign.c
          +++ new/usr/src/lib/libc/port/gen/posix_memalign.c
↓ open down ↓ 16 lines elided ↑ open up ↑
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
  25   25   */
  26   26  
  27      -#pragma ident   "%Z%%M% %I%     %E% SMI"
  28      -
  29   27  #include "lint.h"
       28 +
       29 +#include <sys/sysmacros.h>
       30 +
  30   31  #include <stdlib.h>
  31   32  #include <errno.h>
  32   33  
  33   34  /*
  34   35   * SUSv3 - aligned memory allocation
  35   36   *
  36   37   * From the SUSv3 specification:
  37   38   *    The value of alignment shall be a power
  38   39   *    of two multiple of sizeof (void *).
  39   40   * This is enforced below.
↓ open down ↓ 2 lines elided ↑ open up ↑
  42   43   *    If the size of the space requested is 0, the behavior
  43   44   *    is implementation-defined; the value returned in memptr
  44   45   *    shall be either a null pointer or a unique pointer.
  45   46   * We choose always to return a null pointer in this case.
  46   47   * (Not all implementations of memalign() behave this way.)
  47   48   */
  48   49  int
  49   50  posix_memalign(void **memptr, size_t alignment, size_t size)
  50   51  {
  51   52          void *ptr = NULL;
  52      -        int error = 0;
  53      -
  54      -        if (alignment == 0 ||
  55      -            (alignment & (sizeof (void *) - 1)) != 0 ||
  56      -            (alignment & (alignment - 1)) != 0)
  57      -                error = EINVAL;
  58      -        else if (size != 0 &&
  59      -            (ptr = memalign(alignment, size)) == NULL)
  60      -                error = ENOMEM;
  61   53  
  62      -        *memptr = ptr;
  63      -        return (error);
       54 +        if ((alignment == 0) || !ISP2(alignment) ||
       55 +            (alignment & (sizeof (void *) - 1)) != 0) {
       56 +                return (EINVAL);
       57 +        } else if (size == 0) {
       58 +                *memptr = NULL;
       59 +                return (0);
       60 +        } else {
       61 +                if ((ptr = memalign(alignment, size)) == NULL) {
       62 +                        return (ENOMEM);
       63 +                } else {
       64 +                        *memptr = ptr;
       65 +                        return (0);
       66 +                }
       67 +        }
  64   68  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX