mmap for write under MacOSX 10.8.2 with XCode 4.6 will make program crash
Asked Answered
M

3

3

I try to run a simple test of mmap under MacOSX 10.8.2, with XCode 4.6. This program is as follows, the file mapped for read is OK while the access to the write pointer "target" will make the program crash. Error message is "EXC_BAD_ACCESS".

Does anyone have the same case with me ? Thanks a lot.

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, const char * argv[]) {
int input, output;
size_t size;

char *source, *target;

input = open("SEK2.txt", O_RDONLY);
if (input == -1) {
    printf("Open source file failed");
    return -1;
}
output = open("test.txt", O_RDWR|O_CREAT|O_TRUNC);
if (output == -1) {
    printf("Open Output file failed");
    return -1;
}

size = lseek(input, 0, SEEK_END);
printf("File size = %d\n", size);

source = (char*)mmap(0, size, PROT_READ, MAP_PRIVATE, input, 0);
if ( source == (void*)-1) {
    printf("Source MMap Error\n");
    return -1;
}

target = (char*)mmap(0, size, PROT_EXEC, MAP_PRIVATE, output, 0);
if ( target == (void*)-1 ) {
    printf( "Target MMap Error\n");
    return -1;
}

memcpy(target, source, size); // EXC_BAD_ACCESS to "target"
munmap(source, size);
munmap(target, size);

close(input);
close(output);

printf("Successed");
return 0;

}

Modestine answered 27/4, 2013 at 17:2 Comment(0)
S
3

I think you need to ftruncate(output, size); to make the output file large enough. I don't believe the kernel with automatically grow a file to accommodate data written to the mapped addresses.

Sphacelus answered 27/4, 2013 at 18:38 Comment(2)
This is one of the problems. The other is that using MAP_PRIVATE means that once the mapping has been deleted then the change goes away and are not persisted back to diskMoonlit
I assume that's what he wanted.Riddick
R
2

You can't write to a memory map with only PROT_EXEC. You need PROT_READ|PROT_WRITE, and I don't see why you want PROT_EXEC at all.

Riddick answered 27/4, 2013 at 17:5 Comment(0)
M
0

Under mac, you cannot use PROT_EXEC, so you cannot use named pthread mutex, cond or etc.

use only PROT_READ | PROT_WRITE flag

Mainz answered 24/10, 2018 at 17:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.