svn commit: r493985 - head/devel/ElectricFence/files

Kurt Jaeger pi at FreeBSD.org
Tue Feb 26 22:28:54 UTC 2019


Author: pi
Date: Tue Feb 26 22:28:52 2019
New Revision: 493985
URL: https://svnweb.freebsd.org/changeset/ports/493985

Log:
  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 at gmx.net
  Obtained from:	https://bugzilla.redhat.com/show_bug.cgi?id=603075
  		https://launchpad.net/ubuntu/+source/electric-fence/+changelog

Modified:
  head/devel/ElectricFence/files/patch-efence.c

Modified: head/devel/ElectricFence/files/patch-efence.c
==============================================================================
--- head/devel/ElectricFence/files/patch-efence.c	Tue Feb 26 22:24:15 2019	(r493984)
+++ head/devel/ElectricFence/files/patch-efence.c	Tue Feb 26 22:28:52 2019	(r493985)
@@ -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;
+ }
+ 
+ /*


More information about the svn-ports-all mailing list