1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-28 01:06:17 +00:00

devel/ElectricFence: add missing posix_memalign()

The current implementation did not handle posix_memalign().

Programs using posix_memalign() to allocate memory effectively
silently fall back to the standard implementation. Whenever the
program calls free() to release the memory, the efence implementation
is called and barfs that the memory is unknown, leading to a core
dump.

Sadly, many programs use posix_memalign and thus could not be debugged
with efence.

Example use case: See nginx, PR#235296

PR:		235297
Submitted by:	topical@gmx.net
Obtained from:	https://bugzilla.redhat.com/show_bug.cgi?id=603075
		https://launchpad.net/ubuntu/+source/electric-fence/+changelog
This commit is contained in:
Kurt Jaeger 2019-02-26 22:28:52 +00:00
parent 967d42cb82
commit 83423db06d
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=493985

View File

@ -1,12 +1,38 @@
--- efence.c.orig Mon Jan 13 17:24:08 2003
+++ efence.c Mon Jan 13 17:22:50 2003
@@ -271,7 +271,9 @@
char * string;
Slot * slot;
--- efence.c.orig 2019-02-26 17:53:52.941236000 +0100
+++ efence.c 2019-02-26 17:56:18.688752000 +0100
@@ -38,6 +38,7 @@
# include <pthread.h>
# include <semaphore.h>
#endif
+#include <errno.h>
+#if 0
EF_Print(version);
+#endif
#ifdef malloc
#undef malloc
@@ -670,6 +671,27 @@
release();
#ifdef USE_SEMAPHORE
if (sem_init(&EF_sem, 0, 1) >= 0) {
return address;
+}
+
+extern C_LINKAGE int
+posix_memalign(void **memptr, size_t alignment, size_t userSize)
+{
+ /*
+ * Per standard, posix_memalign returns EINVAL when alignment
+ * is not a power of two or power of sizeof(void*). efence
+ * doesn't check the value of alignment in memalign, but then
+ * again, memalign was never specified very well, and on some
+ * systems odd alignments could indeed have been allowed.
+ */
+ if ((alignment & (alignment - 1))
+ || alignment % sizeof (void *))
+ return EINVAL;
+
+ void *ptr = memalign (alignment, userSize);
+ if (ptr == NULL)
+ return ENOMEM;
+ *memptr = ptr;
+ return 0;
}
/*