You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@mesos.apache.org by "Neil Conway (JIRA)" <ji...@apache.org> on 2015/08/30 03:46:45 UTC

[jira] [Created] (MESOS-3335) FlagsBase copy-ctor leads to dangling pointer

Neil Conway created MESOS-3335:
----------------------------------

             Summary: FlagsBase copy-ctor leads to dangling pointer
                 Key: MESOS-3335
                 URL: https://issues.apache.org/jira/browse/MESOS-3335
             Project: Mesos
          Issue Type: Bug
            Reporter: Neil Conway
            Priority: Minor


Per [#3328], ubsan detects the following problem:

[ RUN ] FaultToleranceTest.ReregisterCompletedFrameworks
/mesos/3rdparty/libprocess/3rdparty/stout/include/stout/flags/flags.hpp:303:25: runtime error: load of value 33, which is not a valid value for type 'bool'

I believe what is going on here is the following:
* The test calls StartMaster(), which does MesosTest::CreateMasterFlags()
* MesosTest::CreateMasterFlags() allocates a new master::Flags on the stack, which is subsequently copy-constructed back to StartMaster()
* The FlagsBase constructor is:
bq. {{FlagsBase() { add(&help, "help", "...", false); }}}
where "help" is a member variable -- i.e., it is allocated on the stack in this case.
* {{FlagsBase()::add}} captures {{&help}}, e.g.:
{noformat}
flag.stringify = [t1](const FlagsBase&) -> Option<std::string> {
    return stringify(*t1);
  };}}
{noformat}
* The implicit copy constructor for FlagsBase is just going to copy the lambda above, i.e., the result of the copy constructor will have a lambda that points into MesosTest::CreateMasterFlags()'s stack frame, which is bad news.

Not sure the right fix -- comments welcome. You could define a copy-ctor for FlagsBase that does something gross (basically remove the old help flag and define a new one that points into the target of the copy), but that seems less, well, gross.

Probably not a pressing-problem to fix -- AFAICS worst symptom is that we end up reading one byte from some random stack location when serving {{state.json}}, for example.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)