(root)/
glibc-2.38/
malloc/
tst-pvalloc.c
       1  /* Test for pvalloc.
       2     Copyright (C) 2013-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <errno.h>
      20  #include <malloc.h>
      21  #include <stdio.h>
      22  #include <string.h>
      23  #include <unistd.h>
      24  #include <libc-diag.h>
      25  
      26  static int errors = 0;
      27  
      28  static void
      29  merror (const char *msg)
      30  {
      31    ++errors;
      32    printf ("Error: %s\n", msg);
      33  }
      34  
      35  static int
      36  do_test (void)
      37  {
      38    void *p;
      39    unsigned long pagesize = getpagesize ();
      40    unsigned long ptrval;
      41    int save;
      42  
      43    errno = 0;
      44  
      45    DIAG_PUSH_NEEDS_COMMENT;
      46  #if __GNUC_PREREQ (7, 0)
      47    /* GCC 7 warns about too-large allocations; here we want to test
      48       that they fail.  */
      49    DIAG_IGNORE_NEEDS_COMMENT (7, "-Walloc-size-larger-than=");
      50  #endif
      51    /* An attempt to allocate a huge value should return NULL and set
      52       errno to ENOMEM.  */
      53    p = pvalloc (-1);
      54  #if __GNUC_PREREQ (7, 0)
      55    DIAG_POP_NEEDS_COMMENT;
      56  #endif
      57  
      58    save = errno;
      59  
      60    if (p != NULL)
      61      merror ("pvalloc (-1) succeeded.");
      62  
      63    if (p == NULL && save != ENOMEM)
      64      merror ("pvalloc (-1) errno is not set correctly");
      65  
      66    free (p);
      67  
      68    errno = 0;
      69  
      70    /* Test to expose integer overflow in malloc internals from BZ #15855.  */
      71    p = pvalloc (-pagesize);
      72  
      73    save = errno;
      74  
      75    if (p != NULL)
      76      merror ("pvalloc (-pagesize) succeeded.");
      77  
      78    if (p == NULL && save != ENOMEM)
      79      merror ("pvalloc (-pagesize) errno is not set correctly");
      80  
      81    free (p);
      82  
      83    /* A zero-sized allocation should succeed with glibc, returning a
      84       non-NULL value.  */
      85    p = pvalloc (0);
      86  
      87    if (p == NULL)
      88      merror ("pvalloc (0) failed.");
      89  
      90    free (p);
      91  
      92    /* Check the alignment of the returned pointer is correct.  */
      93    p = pvalloc (32);
      94  
      95    if (p == NULL)
      96      merror ("pvalloc (32) failed.");
      97  
      98    ptrval = (unsigned long) p;
      99  
     100    if ((ptrval & (pagesize - 1)) != 0)
     101      merror ("returned pointer is not page aligned.");
     102  
     103    free (p);
     104  
     105    return errors != 0;
     106  }
     107  
     108  #define TEST_FUNCTION do_test ()
     109  #include "../test-skeleton.c"