-1

I created a process which calls mmap with MAP_SHARED flag set,when i attempt to copy a string to that address i receive Bus error core dumped,could some one please explain the reason behind it and how to fix it. Following is my code

    int main()
{
    int fd=0;
    char* ret = NULL;
    void *map_addr = NULL;

    fd = open("./shared_file.txt", O_RDWR, S_IRUSR | S_IWUSR);

    if(fd == -1) {
        printf("errno = %d\n",errno);
        printf("Aborting process1###########\n");
        abort();
    }

    map_addr = mmap(NULL, 5*sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    if(map_addr == MAP_FAILED) {
        printf("mmap failed error no =%d\n",errno);
        close(fd);
        return -1;
    }

    printf("map_addr = %p#################\n",(int*)map_addr);
    printf("processid = %d#################\n",(int)getpid());

    ret = strcpy((char*)map_addr,"Stack Overflow");

    if(ret == (char*)map_addr)
        printf("strcpy success\n");

    /*if(msync(map_addr, sizeof(int), MS_SYNC))
        printf("msync failed errno = %d\n",errno);*/

   close(fd);

   sleep(120);

   return (0);
}
user2972122
  • 161
  • 8

1 Answers1

3

The cause of a bus error is usually an attempt to dereference a pointer that has not been initialized properly and contains junk data that are not accessible in a multiple of 4 or 1 or as related to datatype sizes.

First you should check if the shared_file.txt file size is >= 20 bytes(assuming sizeof int is 4 bytes) as specified in the mmap() length argument(where you put 5*(sizeof(int))) in the line below:

map_addr = mmap(NULL, 5*sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

If file size is less than 20 bytes, you could use fallocate call to pre allocate the memory.

If shared_file.txt file size is <= 20 bytes and then you ask mmap to map 20 bytes, it could cause a bus error when you write beyond the actual no. of bytes available in file, because that would be access to an undefined portion of a memory. MMAP_FAILED will not be returned in this case, during memory initialization.

A quick check is to see if you can write a single character in the mmap char* pointer. If you can't( you will get a SIGBUS), that means file size is zero.

askmish
  • 6,464
  • 23
  • 42