updater: Do not null terminate mount_flags_list array

mount_flags_list is a c-style NULL terminated array, but when
iterating over it via
    for (const auto& [name, value] : mount_flags_list)
the last { 0, 0 } is considered a valid entry.
Then `name` is NULL but checked with (flag == name),
which causes SIGSEGV.

Also move the definition to within setMountFlag()
and make it an std::pair array

Change-Id: Ia6670113620c6e8f95151fda764c3ab40bc2d67e
This commit is contained in:
Alessandro Astone 2021-02-16 20:03:54 +01:00
parent 1055a2f07a
commit 1dfb086ca8

View file

@ -44,10 +44,8 @@ std::string UpdaterRuntime::FindBlockDeviceName(const std::string_view name) con
return std::string(name);
}
static struct {
const char* name;
unsigned flag;
} mount_flags_list[] = {
static bool setMountFlag(const std::string& flag, unsigned* mount_flags) {
static constexpr std::pair<const char*, unsigned> mount_flags_list[] = {
{ "noatime", MS_NOATIME },
{ "noexec", MS_NOEXEC },
{ "nosuid", MS_NOSUID },
@ -63,10 +61,8 @@ static struct {
{ "slave", MS_SLAVE },
{ "shared", MS_SHARED },
{ "defaults", 0 },
{ 0, 0 },
};
static bool setMountFlag(const std::string& flag, unsigned* mount_flags) {
for (const auto& [name, value] : mount_flags_list) {
if (flag == name) {
*mount_flags |= value;