swapcontext and free memory

[email protected]
Newsgroups org.kernel.vger.linux-c-programming
Message-ID <18142048.1237399551641.JavaMail.ngmail@webmail17.arcor-online.net>
Hi all,
I have written a small test case which simply creates a new context, swaps to it and returns to the main function. I am allocating memory for the ucontext_t structures and the stack on which the context is executed using malloc. Because of this I also want to deallocate the memory again using free. The problem is I can't deallocate the memory after swapping back. It runs only if all three free() calls are commented out. Otherwise a segmentation fault occurs. Does swapcontext handle this on its own? Can anyone explain this behavior? I didn't find anything concerning this problem in the web.
I am running this program on Ubuntu 8.04 with the following system information: Linux ubuntu8041 2.6.24-23-generic #1 SMP i686 GNU/Linux

The test program is the following one:
---
#include <stdlib.h>
#include <stdio.h>

#include <ucontext.h>

#define STACKSIZE 4096

void thread_function() {
	printf("\nthread_function was called...");
}

int main(int argc, char** argv) {
	printf("\nStart");

	ucontext_t *main_context, *thread_context;

	main_context = (ucontext*) malloc(sizeof(ucontext));
	thread_context = (ucontext*) malloc(sizeof(ucontext));

	void* thread_stack = malloc(STACKSIZE);

	printf("\n\nAllocated memory:\n\tmain_context:\t%p\n\tthread_context:\t%p\n\tthread_stack:\t%p", main_context, thread_context, thread_stack);

	getcontext(thread_context);
	thread_context->uc_stack.ss_sp = thread_stack;
	thread_context->uc_stack.ss_size = sizeof(thread_stack);
	thread_context->uc_stack.ss_flags = 0;
	thread_context->uc_flags = 0;
	thread_context->uc_link = main_context;
	sigemptyset(&(thread_context->uc_sigmask));
	makecontext(thread_context, thread_function, 0);

	swapcontext(main_context, thread_context);

	printf("\n\nswapcontext() returned. Freeing memory starts now...");

	free(thread_stack);
	printf("\nthread_stack was deallocated...");

	free(thread_context);
	printf("\nthread_context was deallocated...");

	free(main_context);
	printf("\nmain_context was deallocated...");

	printf("\n\nEnd");
}
---

Best,
Matthias :-)

Zerreißen Sie die Netze der Phisher, Hacker und Betrüger!
Ihre Internet-Sicherheits-Seiten auf Arcor.de bieten alle Infos und Hilfsmittel, die Sie zum sicheren Surfen brauchen! Play it safe!
http://www.arcor.de/footer-sicherheit/
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
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.