---
 block_to_imp.c | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/block_to_imp.c b/block_to_imp.c
index 6a7eaa8..89d8098 100644
--- a/block_to_imp.c
+++ b/block_to_imp.c
@@ -14,11 +14,6 @@
 #include "visibility.h"
 
 
-/* QNX needs a special header for asprintf() */
-#ifdef __QNXNTO__
-#include <nbutil.h>
-#endif
-
 #undef PAGE_SIZE
 #define PAGE_SIZE page_size
 
@@ -26,7 +21,8 @@ static void *executeBuffer;
 static void *writeBuffer;
 static ptrdiff_t offset;
 static mutex_t trampoline_lock;
-static char *tmpPattern;
+static const char *tmpPattern;
+static size_t tmpPatternLength;
 
 struct wx_buffer
 {
@@ -42,10 +38,15 @@ PRIVATE void init_trampolines(void)
 	{
 		tmp = "/tmp/";
 	}
-	if (0 > asprintf(&tmpPattern, "%s/objc_trampolinesXXXXXXXXXXX", tmp))
+	tmpPatternLength = strlen(tmp)+strlen("/objc_trampolinesXXXXXXXXXXX")+1;
+	tmpPattern = malloc(tmpPatternLength);
+	if (NULL == tmpPattern)
 	{
 		abort();
 	}
+	char *p = (char *)tmpPattern;
+	p = stpcpy(p, tmp);
+	p = stpcpy(p, "/objc_trampolinesXXXXXXXXXXX");
 }
 
 static struct wx_buffer alloc_buffer(size_t size)
@@ -53,8 +54,13 @@ static struct wx_buffer alloc_buffer(size_t size)
 	LOCK_FOR_SCOPE(&trampoline_lock);
 	if ((0 == offset) || (offset + size >= PAGE_SIZE))
 	{
-		int fd = mkstemp(tmpPattern);
-		unlink(tmpPattern);
+		// Duplicate pattern because mkstemp will modify it
+		char *pattern = malloc(tmpPatternLength);
+		assert(NULL != pattern);
+		memcpy(pattern, tmpPattern, tmpPatternLength);
+		int fd = mkstemp(pattern);
+		unlink(pattern);
+		free(pattern);
 		ftruncate(fd, PAGE_SIZE);
 		void *w = mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED, fd, 0);
 		executeBuffer = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_EXEC, MAP_SHARED, fd, 0);
_______________________________________________
Gnustep-dev mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to