---
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