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

Commit 436f1368 authored by Zhi Dou's avatar Zhi Dou
Browse files

flush mmap file to disk after updating

The change was applied in the file in memory. Without explicitly calling
msync, there is no guarantee that the changes are written back to disk.
Thus the flag value may not be changed.

Bug: b/348693143
Test: atest aconfig_storage_write_api.test.cpp
aconfig_storage_write_api.test.rust

Change-Id: I8b1e0cbbb90bcb3c2e5bbf418a6a1a9cd047c81b
parent 4c47a892
Loading
Loading
Loading
Loading
+22 −12
Original line number Diff line number Diff line

#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/unique_fd.h>

#include <sys/mman.h>
#include <sys/stat.h>
@@ -26,13 +27,13 @@ android::base::Result<MutableMappedStorageFile*> map_mutable_storage_file(

  size_t file_size = file_stat.st_size;

  const int fd = open(file.c_str(), O_RDWR | O_NOFOLLOW | O_CLOEXEC);
  if (fd == -1) {
  android::base::unique_fd ufd(open(file.c_str(), O_RDWR | O_NOFOLLOW | O_CLOEXEC));
  if (ufd.get() == -1) {
    return android::base::ErrnoError() << "failed to open " << file;
  };

  void *const map_result =
      mmap(nullptr, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
      mmap(nullptr, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, ufd.get(), 0);
  if (map_result == MAP_FAILED) {
    return android::base::ErrnoError() << "mmap failed";
  }
@@ -55,6 +56,9 @@ android::base::Result<void> set_boolean_flag_value(
  if (!update_cxx.update_success) {
    return android::base::Error() << update_cxx.error_message.c_str();
  }
  if (!msync(static_cast<uint8_t *>(file.file_ptr) + update_cxx.offset, 1, MS_SYNC)) {
    return android::base::ErrnoError() << "msync failed";
  }
  return {};
}

@@ -71,6 +75,9 @@ android::base::Result<void> set_flag_has_server_override(
  if (!update_cxx.update_success) {
    return android::base::Error() << update_cxx.error_message.c_str();
  }
  if (!msync(static_cast<uint8_t *>(file.file_ptr) + update_cxx.offset, 1, MS_SYNC)) {
    return android::base::ErrnoError() << "msync failed";
  }
  return {};
}

@@ -87,6 +94,9 @@ android::base::Result<void> set_flag_has_local_override(
  if (!update_cxx.update_success) {
    return android::base::Error() << update_cxx.error_message.c_str();
  }
  if (!msync(static_cast<uint8_t *>(file.file_ptr) + update_cxx.offset, 1, MS_SYNC)) {
    return android::base::ErrnoError() << "msync failed";
  }
  return {};
}

+4 −4
Original line number Diff line number Diff line
@@ -67,13 +67,13 @@ pub fn update_flag_has_server_override(
    flag_type: FlagValueType,
    flag_index: u32,
    value: bool,
) -> Result<(), AconfigStorageError> {
) -> Result<usize, AconfigStorageError> {
    let (attribute, head) = get_flag_attribute_and_offset(buf, flag_type, flag_index)?;
    let has_override = (attribute & (FlagInfoBit::HasServerOverride as u8)) != 0;
    if has_override != value {
        buf[head] = (attribute ^ FlagInfoBit::HasServerOverride as u8).to_le_bytes()[0];
    }
    Ok(())
    Ok(head)
}

/// Set if flag has local override
@@ -82,13 +82,13 @@ pub fn update_flag_has_local_override(
    flag_type: FlagValueType,
    flag_index: u32,
    value: bool,
) -> Result<(), AconfigStorageError> {
) -> Result<usize, AconfigStorageError> {
    let (attribute, head) = get_flag_attribute_and_offset(buf, flag_type, flag_index)?;
    let has_override = (attribute & (FlagInfoBit::HasLocalOverride as u8)) != 0;
    if has_override != value {
        buf[head] = (attribute ^ FlagInfoBit::HasLocalOverride as u8).to_le_bytes()[0];
    }
    Ok(())
    Ok(head)
}

#[cfg(test)]
+2 −2
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ pub fn update_boolean_flag_value(
    buf: &mut [u8],
    flag_index: u32,
    flag_value: bool,
) -> Result<(), AconfigStorageError> {
) -> Result<usize, AconfigStorageError> {
    let interpreted_header = FlagValueHeader::from_bytes(buf)?;
    if interpreted_header.version > FILE_VERSION {
        return Err(AconfigStorageError::HigherStorageFileVersion(anyhow!(
@@ -43,7 +43,7 @@ pub fn update_boolean_flag_value(
    }

    buf[head] = u8::from(flag_value).to_le_bytes()[0];
    Ok(())
    Ok(head)
}

#[cfg(test)]
+17 −5
Original line number Diff line number Diff line
@@ -194,18 +194,21 @@ mod ffi {
    // Flag value update return for cc interlop
    pub struct BooleanFlagValueUpdateCXX {
        pub update_success: bool,
        pub offset: usize,
        pub error_message: String,
    }

    // Flag has server override update return for cc interlop
    pub struct FlagHasServerOverrideUpdateCXX {
        pub update_success: bool,
        pub offset: usize,
        pub error_message: String,
    }

    // Flag has local override update return for cc interlop
    pub struct FlagHasLocalOverrideUpdateCXX {
        pub update_success: bool,
        pub offset: usize,
        pub error_message: String,
    }

@@ -251,11 +254,14 @@ pub(crate) fn update_boolean_flag_value_cxx(
    value: bool,
) -> ffi::BooleanFlagValueUpdateCXX {
    match crate::flag_value_update::update_boolean_flag_value(file, offset, value) {
        Ok(()) => {
            ffi::BooleanFlagValueUpdateCXX { update_success: true, error_message: String::from("") }
        }
        Ok(head) => ffi::BooleanFlagValueUpdateCXX {
            update_success: true,
            offset: head,
            error_message: String::from(""),
        },
        Err(errmsg) => ffi::BooleanFlagValueUpdateCXX {
            update_success: false,
            offset: usize::MAX,
            error_message: format!("{:?}", errmsg),
        },
    }
@@ -272,18 +278,21 @@ pub(crate) fn update_flag_has_server_override_cxx(
            match crate::flag_info_update::update_flag_has_server_override(
                file, value_type, offset, value,
            ) {
                Ok(()) => ffi::FlagHasServerOverrideUpdateCXX {
                Ok(head) => ffi::FlagHasServerOverrideUpdateCXX {
                    update_success: true,
                    offset: head,
                    error_message: String::from(""),
                },
                Err(errmsg) => ffi::FlagHasServerOverrideUpdateCXX {
                    update_success: false,
                    offset: usize::MAX,
                    error_message: format!("{:?}", errmsg),
                },
            }
        }
        Err(errmsg) => ffi::FlagHasServerOverrideUpdateCXX {
            update_success: false,
            offset: usize::MAX,
            error_message: format!("{:?}", errmsg),
        },
    }
@@ -300,18 +309,21 @@ pub(crate) fn update_flag_has_local_override_cxx(
            match crate::flag_info_update::update_flag_has_local_override(
                file, value_type, offset, value,
            ) {
                Ok(()) => ffi::FlagHasLocalOverrideUpdateCXX {
                Ok(head) => ffi::FlagHasLocalOverrideUpdateCXX {
                    update_success: true,
                    offset: head,
                    error_message: String::from(""),
                },
                Err(errmsg) => ffi::FlagHasLocalOverrideUpdateCXX {
                    update_success: false,
                    offset: usize::MAX,
                    error_message: format!("{:?}", errmsg),
                },
            }
        }
        Err(errmsg) => ffi::FlagHasLocalOverrideUpdateCXX {
            update_success: false,
            offset: usize::MAX,
            error_message: format!("{:?}", errmsg),
        },
    }
+6 −0
Original line number Diff line number Diff line
@@ -39,4 +39,10 @@ cc_test {
        "general-tests",
    ],
    ldflags: ["-Wl,--allow-multiple-definition"],
        generated_headers: [
        "cxx-bridge-header",
        "libcxx_aconfig_storage_read_api_bridge_header",
    ],
    generated_sources: ["libcxx_aconfig_storage_read_api_bridge_code"],
    whole_static_libs: ["libaconfig_storage_read_api_cxx_bridge"],
}
Loading