summaryrefslogtreecommitdiff
path: root/openbsd-compat
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2017-06-01 15:25:13 +1000
committerDamien Miller <djm@mindrot.org>2017-06-01 15:25:13 +1000
commit151c6e433a5f5af761c78de87d7b5d30a453cf5e (patch)
tree77cdffcee99995b20821a8f2a957504e861475d5 /openbsd-compat
parent01e6f78924da308447e71e9a32c8a6104ef4e888 (diff)
add recallocarray replacement and dependency
recallocarray() needs getpagesize() so add a tiny replacement for that.
Diffstat (limited to 'openbsd-compat')
-rw-r--r--openbsd-compat/Makefile.in4
-rw-r--r--openbsd-compat/bsd-getpagesize.c23
-rw-r--r--openbsd-compat/openbsd-compat.h8
-rw-r--r--openbsd-compat/recallocarray.c88
4 files changed, 121 insertions, 2 deletions
diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in
index d51eacf65..b5088c479 100644
--- a/openbsd-compat/Makefile.in
+++ b/openbsd-compat/Makefile.in
@@ -16,9 +16,9 @@ RANLIB=@RANLIB@
16INSTALL=@INSTALL@ 16INSTALL=@INSTALL@
17LDFLAGS=-L. @LDFLAGS@ 17LDFLAGS=-L. @LDFLAGS@
18 18
19OPENBSD=base64.o basename.o bcrypt_pbkdf.o bindresvport.o blowfish.o daemon.o dirname.o fmt_scaled.o getcwd.o getgrouplist.o getopt_long.o getrrsetbyname.o glob.o inet_aton.o inet_ntoa.o inet_ntop.o mktemp.o pwcache.o readpassphrase.o reallocarray.o realpath.o rresvport.o setenv.o setproctitle.o sha1.o sha2.o rmd160.o md5.o sigact.o strcasestr.o strlcat.o strlcpy.o strmode.o strnlen.o strptime.o strsep.o strtonum.o strtoll.o strtoul.o strtoull.o timingsafe_bcmp.o vis.o blowfish.o bcrypt_pbkdf.o explicit_bzero.o 19OPENBSD=base64.o basename.o bcrypt_pbkdf.o bindresvport.o blowfish.o daemon.o dirname.o fmt_scaled.o getcwd.o getgrouplist.o getopt_long.o getrrsetbyname.o glob.o inet_aton.o inet_ntoa.o inet_ntop.o mktemp.o pwcache.o readpassphrase.o reallocarray.o realpath.o recallocarray.o rresvport.o setenv.o setproctitle.o sha1.o sha2.o rmd160.o md5.o sigact.o strcasestr.o strlcat.o strlcpy.o strmode.o strnlen.o strptime.o strsep.o strtonum.o strtoll.o strtoul.o strtoull.o timingsafe_bcmp.o vis.o blowfish.o bcrypt_pbkdf.o explicit_bzero.o
20 20
21COMPAT=arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o getrrsetbyname-ldns.o bsd-err.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-setres_id.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xcrypt.o kludge-fd_set.o 21COMPAT=arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o getrrsetbyname-ldns.o bsd-err.o bsd-getpagesize.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-setres_id.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xcrypt.o kludge-fd_set.o
22 22
23PORTS=port-aix.o port-irix.o port-linux.o port-solaris.o port-tun.o port-uw.o 23PORTS=port-aix.o port-irix.o port-linux.o port-solaris.o port-tun.o port-uw.o
24 24
diff --git a/openbsd-compat/bsd-getpagesize.c b/openbsd-compat/bsd-getpagesize.c
new file mode 100644
index 000000000..9daddfbd3
--- /dev/null
+++ b/openbsd-compat/bsd-getpagesize.c
@@ -0,0 +1,23 @@
1/* Placed in the public domain */
2
3#ifndef HAVE_GETPAGESIZE
4
5#include <unistd.h>
6#include <limits.h>
7
8int
9getpagesize(void)
10{
11#if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
12 long r = sysconf(_SC_PAGESIZE);
13 if (r > 0 && r < INT_MAX)
14 return (int)r;
15#endif
16 /*
17 * This is at the lower end of common values and appropriate for
18 * our current use of getpagesize() in recallocarray().
19 */
20 return 4096;
21}
22
23#endif /* HAVE_GETPAGESIZE */
diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h
index cff547745..a741bc23e 100644
--- a/openbsd-compat/openbsd-compat.h
+++ b/openbsd-compat/openbsd-compat.h
@@ -60,6 +60,10 @@ int bindresvport_sa(int sd, struct sockaddr *sa);
60void closefrom(int); 60void closefrom(int);
61#endif 61#endif
62 62
63#ifndef HAVE_GETPAGESIZE
64int getpagesize(void);
65#endif
66
63#ifndef HAVE_GETCWD 67#ifndef HAVE_GETCWD
64char *getcwd(char *pt, size_t size); 68char *getcwd(char *pt, size_t size);
65#endif 69#endif
@@ -68,6 +72,10 @@ char *getcwd(char *pt, size_t size);
68void *reallocarray(void *, size_t, size_t); 72void *reallocarray(void *, size_t, size_t);
69#endif 73#endif
70 74
75#ifndef HAVE_RECALLOCARRAY
76void *recallocarray(void *, size_t, size_t, size_t);
77#endif
78
71#if !defined(HAVE_REALPATH) || defined(BROKEN_REALPATH) 79#if !defined(HAVE_REALPATH) || defined(BROKEN_REALPATH)
72/* 80/*
73 * glibc's FORTIFY_SOURCE can redefine this and prevent us picking up the 81 * glibc's FORTIFY_SOURCE can redefine this and prevent us picking up the
diff --git a/openbsd-compat/recallocarray.c b/openbsd-compat/recallocarray.c
new file mode 100644
index 000000000..506741708
--- /dev/null
+++ b/openbsd-compat/recallocarray.c
@@ -0,0 +1,88 @@
1/* $OpenBSD: recallocarray.c,v 1.1 2017/03/06 18:44:21 otto Exp $ */
2/*
3 * Copyright (c) 2008, 2017 Otto Moerbeek <otto@drijf.net>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18/* OPENBSD ORIGINAL: lib/libc/stdlib/recallocarray.c */
19
20#include "includes.h"
21#ifndef HAVE_RECALLOCARRAY
22
23#include <errno.h>
24#include <stdlib.h>
25#include <stdint.h>
26#include <string.h>
27#include <unistd.h>
28
29/*
30 * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
31 * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
32 */
33#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
34
35void *
36recallocarray(void *ptr, size_t oldnmemb, size_t newnmemb, size_t size)
37{
38 size_t oldsize, newsize;
39 void *newptr;
40
41 if (ptr == NULL)
42 return calloc(newnmemb, size);
43
44 if ((newnmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
45 newnmemb > 0 && SIZE_MAX / newnmemb < size) {
46 errno = ENOMEM;
47 return NULL;
48 }
49 newsize = newnmemb * size;
50
51 if ((oldnmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
52 oldnmemb > 0 && SIZE_MAX / oldnmemb < size) {
53 errno = EINVAL;
54 return NULL;
55 }
56 oldsize = oldnmemb * size;
57
58 /*
59 * Don't bother too much if we're shrinking just a bit,
60 * we do not shrink for series of small steps, oh well.
61 */
62 if (newsize <= oldsize) {
63 size_t d = oldsize - newsize;
64
65 if (d < oldsize / 2 && d < getpagesize()) {
66 memset((char *)ptr + newsize, 0, d);
67 return ptr;
68 }
69 }
70
71 newptr = malloc(newsize);
72 if (newptr == NULL)
73 return NULL;
74
75 if (newsize > oldsize) {
76 memcpy(newptr, ptr, oldsize);
77 memset((char *)newptr + oldsize, 0, newsize - oldsize);
78 } else
79 memcpy(newptr, ptr, newsize);
80
81 explicit_bzero(ptr, oldsize);
82 free(ptr);
83
84 return newptr;
85}
86/* DEF_WEAK(recallocarray); */
87
88#endif /* HAVE_RECALLOCARRAY */