16

I have allocated code using mmap, but unable to free it because of segmentation fault. I have done mprotect - PROT_WRITE to make it writable, but still, I am unable to free it. My code:

 1 #include <stdio.h> 2 #include <memory.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <sys/mman.h> 6 #include <sys/types.h> 7 #include <fcntl.h> 8 9 int main() 10 { 11 void * allocation; 12 size_t size; 13 static int devZerofd = -1; 14 15 if ( devZerofd == -1 ) { 16 devZerofd = open("/dev/zero", O_RDWR); 17 if ( devZerofd < 0 ) 18 perror("open() on /dev/zero failed"); 19 } 20 21 allocation = (caddr_t) mmap(0, 5000, PROT_READ|PROT_NONE, MAP_PRIVATE, devZerofd, 0); 22 23 if ( allocation == (caddr_t)-1 ) 24 fprintf(stderr, "mmap() failed "); 25 26 if ( mprotect((caddr_t)allocation, 5000, PROT_WRITE) < 0 ) 27 fprintf(stderr, "mprotect failed"); 28 else 29 printf("mprotect done: memory allocated at address %u\n",allocation); 30 31 strcpy(allocation,"Hello, how are you"); 32 puts(allocation); 33 34 if ( mprotect((caddr_t)allocation, 5000, PROT_WRITE) < 0 ) 35 fprintf(stderr, "mprotect failed"); 36 37 free(allocation); 38 39 } 40 41 
1
  • use munmap function its syntex is " int munmap(void *addr, size_t len);" Commented Aug 8, 2011 at 9:15

1 Answer 1

28

You need to use munmap for that. You don't need to do anything else (change protection bits etc). But you should check the return code of munmap.

munmap(allocation, 5000); 

free(3) can only be used to free memory allocated via malloc(3).

Sign up to request clarification or add additional context in comments.

3 Comments

If i use munmap, the last 2 lines, mprotect - PROT_WRITE is also not needed, right? I mean can munmap be done on protected memory?
Can you please tell me if I can use free to free the memory allocated by mmap.
@Bionix1441 In general, no. It is only safe to call free for memory allocated using malloc or realloc.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.