Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1dfb086c authored by Alessandro Astone's avatar Alessandro Astone
Browse files

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
parent 1055a2f0
Loading
Loading
Loading
Loading
+18 −22
Original line number Diff line number Diff line
@@ -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;