bug#47429: Re 47429:allocating JIT code buffer failed: Permission denied

Jeffrey Walton <[email protected]>
Newsgroups gmane.lisp.guile.bugs
Message-ID <CAH8yC8maA0wHnchfMnmX4uGhevMXrbu3sRenYPjg9aA7to60pg@mail.gmail.com>
I'm looking at OS X's man page on mmap. The EACCES does not seem to
fit one of the stated reasons in the man page. Also see
https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/mmap.2.html.

I have two theories, both of which are guesses. Neither seems to be
very good. First, this may be related to W^X pages on OS X.

Second, the size is 0 but the wrong error code is returned. For the
second case, size=0 should result in EINVAL. I don't know what size is
so this is probably a bad guess.

I'm not sure how to get this under a debugger.

Here's a test of the first theory:

% cat mmap-test.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>

int main(int argc, char* argv[])
{
    size_t len = 10;
    int prot = PROT_EXEC | PROT_READ | PROT_WRITE;
    int flags = MAP_PRIVATE | MAP_ANONYMOUS;

    void *p = mmap (NULL, len, prot, flags, -1, 0);
    int err = errno;

    if (p) {
        printf("p is good\n");
        munmap(p, len);
    }
    else {
        printf("p is bad (%d)\n", err);
    }

    return 0;
}

% clang -Wall mmap-test.c -o mmap-test.exe
% ./mmap-test.exe
p is good

Here's a test of the second theory with len = 0:

% ./mmap-test.exe
p is good

I'm out of ideas...

=========================

This is the relevant part of libguile/jit.c:

  1330  static struct code_arena *
  1331  allocate_code_arena (size_t size, struct code_arena *prev)
  1332  {
  1333    struct code_arena *ret = malloc (sizeof (struct code_arena));
  1334
  1335    if (!ret) return NULL;
  1336
  1337    memset (ret, 0, sizeof (*ret));
  1338    ret->used = 0;
  1339    ret->size = size;
  1340    ret->prev = prev;
  1341    ret->base = mmap (NULL, ret->size,
  1342                      PROT_EXEC | PROT_READ | PROT_WRITE,
  1343                      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  1344
  1345    if (ret->base == MAP_FAILED)
  1346      {
  1347        perror ("allocating JIT code buffer failed");
  1348        free (ret);
  1349        return NULL;
  1350      }
  1351
  1352    INFO ("allocated code arena, %p-%p\n", ret->base, ret->base
+ ret->size);
  1353
  1354    return ret;
  1355  }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.