/* Test for posix_memalign.
   Copyright (C) 2013-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

static int errors = 0;

static void
merror (const char *msg)
{
  ++errors;
  printf ("Error: %s\n", msg);
}

static int
do_test (void)
{
  void *p;
  int ret;
  unsigned long pagesize = getpagesize ();
  unsigned long ptrval;

  p = NULL;

  /* An attempt to allocate a huge value should return ENOMEM and
     p should remain NULL.  */
  ret = posix_memalign (&p, sizeof (void *), -1);

  if (ret != ENOMEM)
    merror ("posix_memalign (&p, sizeof (void *), -1) succeeded.");

  if (ret == ENOMEM && p != NULL)
    merror ("returned an error but pointer was modified");

  free (p);

  p = NULL;

  /* Test to expose integer overflow in malloc internals from BZ #15857.  */
  ret = posix_memalign (&p, pagesize, -pagesize);

  if (ret != ENOMEM)
    merror ("posix_memalign (&p, pagesize, -pagesize) succeeded.");

  free (p);

  p = NULL;

  /* Test to expose integer overflow in malloc internals from BZ #16038.  */
  ret = posix_memalign (&p, -1, pagesize);

  if (ret != EINVAL)
    merror ("posix_memalign (&p, -1, pagesize) succeeded.");

  free (p);

  p = NULL;

  /* A zero-sized allocation should succeed with glibc, returning zero
     and setting p to a non-NULL value.  */
  ret = posix_memalign (&p, sizeof (void *), 0);

  if (ret != 0 || p == NULL)
    merror ("posix_memalign (&p, sizeof (void *), 0) failed.");

  free (p);

  ret = posix_memalign (&p, 0x300, 10);

  if (ret != EINVAL)
    merror ("posix_memalign (&p, 0x300, 10) succeeded.");

  ret = posix_memalign (&p, 0, 10);

  if (ret != EINVAL)
    merror ("posix_memalign (&p, 0, 10) succeeded.");

  p = NULL;

  ret = posix_memalign (&p, 0x100, 10);

  if (ret != 0)
    merror ("posix_memalign (&p, 0x100, 10) failed.");

  if (ret == 0 && p == NULL)
    merror ("returned success but pointer is NULL");

  ptrval = (unsigned long) p;

  if (ret == 0 && (ptrval & 0xff) != 0)
    merror ("pointer is not aligned to 0x100");

  free (p);

  return errors != 0;
}

#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"
