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:
parent
1055a2f07a
commit
1dfb086ca8
1 changed files with 18 additions and 22 deletions
|
@ -44,29 +44,25 @@ std::string UpdaterRuntime::FindBlockDeviceName(const std::string_view name) con
|
||||||
return std::string(name);
|
return std::string(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct {
|
|
||||||
const char* name;
|
|
||||||
unsigned flag;
|
|
||||||
} mount_flags_list[] = {
|
|
||||||
{ "noatime", MS_NOATIME },
|
|
||||||
{ "noexec", MS_NOEXEC },
|
|
||||||
{ "nosuid", MS_NOSUID },
|
|
||||||
{ "nodev", MS_NODEV },
|
|
||||||
{ "nodiratime", MS_NODIRATIME },
|
|
||||||
{ "ro", MS_RDONLY },
|
|
||||||
{ "rw", 0 },
|
|
||||||
{ "remount", MS_REMOUNT },
|
|
||||||
{ "bind", MS_BIND },
|
|
||||||
{ "rec", MS_REC },
|
|
||||||
{ "unbindable", MS_UNBINDABLE },
|
|
||||||
{ "private", MS_PRIVATE },
|
|
||||||
{ "slave", MS_SLAVE },
|
|
||||||
{ "shared", MS_SHARED },
|
|
||||||
{ "defaults", 0 },
|
|
||||||
{ 0, 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
static bool setMountFlag(const std::string& flag, unsigned* mount_flags) {
|
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 },
|
||||||
|
{ "nodev", MS_NODEV },
|
||||||
|
{ "nodiratime", MS_NODIRATIME },
|
||||||
|
{ "ro", MS_RDONLY },
|
||||||
|
{ "rw", 0 },
|
||||||
|
{ "remount", MS_REMOUNT },
|
||||||
|
{ "bind", MS_BIND },
|
||||||
|
{ "rec", MS_REC },
|
||||||
|
{ "unbindable", MS_UNBINDABLE },
|
||||||
|
{ "private", MS_PRIVATE },
|
||||||
|
{ "slave", MS_SLAVE },
|
||||||
|
{ "shared", MS_SHARED },
|
||||||
|
{ "defaults", 0 },
|
||||||
|
};
|
||||||
|
|
||||||
for (const auto& [name, value] : mount_flags_list) {
|
for (const auto& [name, value] : mount_flags_list) {
|
||||||
if (flag == name) {
|
if (flag == name) {
|
||||||
*mount_flags |= value;
|
*mount_flags |= value;
|
||||||
|
|
Loading…
Reference in a new issue