diff --git a/ChangeLog b/ChangeLog index 5bf6e0933..fdfcab717 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-04-23 Matthieu Herrb + * hw/xfree86/dummylib/xalloc.c + * hw/xfree86/loader/loader.c\ + Don't access free memory after unloading a module. + Bugzilla #4168. + 2006-04-22 Benjamin Herrenschmidt * hw/xfree86/os-support/linux/lnx_KbdMap.c: diff --git a/hw/xfree86/dummylib/xalloc.c b/hw/xfree86/dummylib/xalloc.c index a78250f2b..7131dc5e6 100644 --- a/hw/xfree86/dummylib/xalloc.c +++ b/hw/xfree86/dummylib/xalloc.c @@ -94,3 +94,19 @@ Xstrdup(const char *s) strcpy(sd, s); return sd; } + +char * +XNFstrdup(const char *s) +{ + char *sd; + size_t len; + + if (s == NULL) + return NULL; + + len = strlen(s) + 1; + sd = (char *)XNFalloc(len); + strlcpy(sd, s, len); + return sd; +} + diff --git a/hw/xfree86/loader/loader.c b/hw/xfree86/loader/loader.c index 30f151a4c..4c904128e 100644 --- a/hw/xfree86/loader/loader.c +++ b/hw/xfree86/loader/loader.c @@ -818,7 +818,9 @@ static void AppendSymbol(symlist * list, const char *sym) { list->list = xnfrealloc(list->list, (list->num + 1) * sizeof(char **)); - list->list[list->num] = sym; + /* copy the symbol, since it comes from a module + that can be unloaded later */ + list->list[list->num] = xnfstrdup(sym); list->num++; }