Blame malloc/tst-pvalloc.c

Packit 6c4009
/* Test for pvalloc.
Packit 6c4009
   Copyright (C) 2013-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <errno.h>
Packit 6c4009
#include <malloc.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
Packit 6c4009
static int errors = 0;
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
merror (const char *msg)
Packit 6c4009
{
Packit 6c4009
  ++errors;
Packit 6c4009
  printf ("Error: %s\n", msg);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  void *p;
Packit 6c4009
  unsigned long pagesize = getpagesize ();
Packit 6c4009
  unsigned long ptrval;
Packit 6c4009
  int save;
Packit 6c4009
Packit 6c4009
  errno = 0;
Packit 6c4009
Packit 6c4009
  /* An attempt to allocate a huge value should return NULL and set
Packit 6c4009
     errno to ENOMEM.  */
Packit 6c4009
  p = pvalloc (-1);
Packit 6c4009
Packit 6c4009
  save = errno;
Packit 6c4009
Packit 6c4009
  if (p != NULL)
Packit 6c4009
    merror ("pvalloc (-1) succeeded.");
Packit 6c4009
Packit 6c4009
  if (p == NULL && save != ENOMEM)
Packit 6c4009
    merror ("pvalloc (-1) errno is not set correctly");
Packit 6c4009
Packit 6c4009
  free (p);
Packit 6c4009
Packit 6c4009
  errno = 0;
Packit 6c4009
Packit 6c4009
  /* Test to expose integer overflow in malloc internals from BZ #15855.  */
Packit 6c4009
  p = pvalloc (-pagesize);
Packit 6c4009
Packit 6c4009
  save = errno;
Packit 6c4009
Packit 6c4009
  if (p != NULL)
Packit 6c4009
    merror ("pvalloc (-pagesize) succeeded.");
Packit 6c4009
Packit 6c4009
  if (p == NULL && save != ENOMEM)
Packit 6c4009
    merror ("pvalloc (-pagesize) errno is not set correctly");
Packit 6c4009
Packit 6c4009
  free (p);
Packit 6c4009
Packit 6c4009
  /* A zero-sized allocation should succeed with glibc, returning a
Packit 6c4009
     non-NULL value.  */
Packit 6c4009
  p = pvalloc (0);
Packit 6c4009
Packit 6c4009
  if (p == NULL)
Packit 6c4009
    merror ("pvalloc (0) failed.");
Packit 6c4009
Packit 6c4009
  free (p);
Packit 6c4009
Packit 6c4009
  /* Check the alignment of the returned pointer is correct.  */
Packit 6c4009
  p = pvalloc (32);
Packit 6c4009
Packit 6c4009
  if (p == NULL)
Packit 6c4009
    merror ("pvalloc (32) failed.");
Packit 6c4009
Packit 6c4009
  ptrval = (unsigned long) p;
Packit 6c4009
Packit 6c4009
  if ((ptrval & (pagesize - 1)) != 0)
Packit 6c4009
    merror ("returned pointer is not page aligned.");
Packit 6c4009
Packit 6c4009
  free (p);
Packit 6c4009
Packit 6c4009
  return errors != 0;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#define TEST_FUNCTION do_test ()
Packit 6c4009
#include "../test-skeleton.c"