Skip to content
  • Ömer Sinan Ağacan's avatar
    Fix uninitialized field read in Linker.c · 67336a67
    Ömer Sinan Ağacan authored
    Valgrind report of the bug when running the test `linker_unload`:
    
        ==29666== Conditional jump or move depends on uninitialised value(s)
        ==29666==    at 0x369C5B4: setOcInitialStatus (Linker.c:1305)
        ==29666==    by 0x369C6C5: mkOc (Linker.c:1347)
        ==29666==    by 0x36C027A: loadArchive_ (LoadArchive.c:522)
        ==29666==    by 0x36C0600: loadArchive (LoadArchive.c:626)
        ==29666==    by 0x2C144CD: ??? (in /home/omer/haskell/ghc_2/testsuite/tests/rts/linker/linker_unload.run/linker_unload)
        ==29666==
        ==29666== Conditional jump or move depends on uninitialised value(s)
        ==29666==    at 0x369C5B4: setOcInitialStatus (Linker.c:1305)
        ==29666==    by 0x369C6C5: mkOc (Linker.c:1347)
        ==29666==    by 0x369C9F6: preloadObjectFile (Linker.c:1507)
        ==29666==    by 0x369CA8D: loadObj_ (Linker.c:1536)
        ==29666==    by 0x369CB17: loadObj (Linker.c:1557)
        ==29666==    by 0x3866BC: main (linker_unload.c:33)
    
    The problem is `mkOc` allocates a new `ObjectCode` and calls
    `setOcInitialStatus` without initializing the `status` field.
    `setOcInitialStatus` reads the field as first thing:
    
        static void setOcInitialStatus(ObjectCode* oc) {
            if (oc->status == OBJECT_DONT_RESOLVE)
              return;
    
            if (oc->archiveMemberName == NULL) {
                oc->status = OBJECT_NEEDED;
            } else {
                oc->status = OBJECT_LOADED;
            }
        }
    
    `setOcInitialStatus` is unsed in two places for two different purposes:
    in `mkOc` where we don't have the `status` field initialized yet (`mkOc`
    is supposed to initialize it), and `loadOc` where we do have `status`
    field initialized and we want to update it. Instead of splitting the
    function into two functions which are both called just once I inline the
    functions in the use sites and remove it.
    
    Fixes #18342
    67336a67