1 /* Test for pvalloc. 2 Copyright (C) 2013-2022 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 merror(const char * msg)29merror (const char *msg) 30 { 31 ++errors; 32 printf ("Error: %s\n", msg); 33 } 34 35 static int do_test(void)36do_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" 110