[commit: ghc] master: Fix linked list manipulation code (buggy on consecutive deletion) (e3938f3)

Simon Marlow marlowsd at gmail.com
Mon Apr 14 08:23:16 UTC 2014


Thanks Edward.  Austin, can you cherry-pick this for 7.8.3 please?

Cheers,
Simon

On 13/04/2014 07:37, git at git.haskell.org wrote:
> Repository : ssh://git@git.haskell.org/ghc
>
> On branch  : master
> Link       : http://ghc.haskell.org/trac/ghc/changeset/e3938f3adac0093b23694fd347774244ce121478/ghc
>
>> ---------------------------------------------------------------
>
> commit e3938f3adac0093b23694fd347774244ce121478
> Author: Edward Z. Yang <ezyang at cs.stanford.edu>
> Date:   Sat Apr 12 23:02:13 2014 -0700
>
>      Fix linked list manipulation code (buggy on consecutive deletion)
>
>      Signed-off-by: Edward Z. Yang <ezyang at cs.stanford.edu>
>
>
>> ---------------------------------------------------------------
>
> e3938f3adac0093b23694fd347774244ce121478
>   rts/CheckUnload.c |    3 ++-
>   rts/Linker.c      |    6 ++++--
>   2 files changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/rts/CheckUnload.c b/rts/CheckUnload.c
> index f1f454c..98f184b 100644
> --- a/rts/CheckUnload.c
> +++ b/rts/CheckUnload.c
> @@ -298,7 +298,7 @@ void checkUnload (StgClosure *static_objects)
>     // marked as unreferenced can be physically unloaded, because we
>     // have no references to it.
>     prev = NULL;
> -  for (oc = unloaded_objects; oc; prev = oc, oc = next) {
> +  for (oc = unloaded_objects; oc; oc = next) {
>         next = oc->next;
>         if (oc->referenced == 0) {
>             if (prev == NULL) {
> @@ -312,6 +312,7 @@ void checkUnload (StgClosure *static_objects)
>         } else {
>             IF_DEBUG(linker, debugBelch("Object file still in use: %"
>                                         PATH_FMT "\n", oc->fileName));
> +          prev = oc;
>         }
>     }
>
> diff --git a/rts/Linker.c b/rts/Linker.c
> index af26d74..ab235e9 100644
> --- a/rts/Linker.c
> +++ b/rts/Linker.c
> @@ -3016,8 +3016,8 @@ unloadObj( pathchar *path )
>       IF_DEBUG(linker, debugBelch("unloadObj: %" PATH_FMT "\n", path));
>
>       prev = NULL;
> -    for (oc = objects; oc; prev = oc, oc = next) {
> -        next = oc->next;
> +    for (oc = objects; oc; oc = next) {
> +        next = oc->next; // oc might be freed
>
>           if (!pathcmp(oc->fileName,path)) {
>
> @@ -3075,6 +3075,8 @@ unloadObj( pathchar *path )
>               /* This could be a member of an archive so continue
>                * unloading other members. */
>               unloadedAnyObj = HS_BOOL_TRUE;
> +        } else {
> +            prev = oc;
>           }
>       }
>
>
> _______________________________________________
> ghc-commits mailing list
> ghc-commits at haskell.org
> http://www.haskell.org/mailman/listinfo/ghc-commits
>


More information about the ghc-devs mailing list