This fixes a bug introduced by I81b6bd984aad8f7ddec93ce74f4543e4f71be508
In the original CL, setting a sysprop `next_boot.<name>` and then
rebooting the device could remove all the persistent properties stored
in /data/property/persistent_properties. It happened because the
function `WritePersistentProperty` is called with a properties set which
is initialized as an empty set and then added with the properties which
had the next_boot prefix.
As a result...
Before the boot:
* persist.a = 1
* next_boot.b = 2
* next_boot.persist.c = 3
After the reboot:
* b = 2
* persist.c = 3
persist.a gets lost.
This change fixes the issue by populating properties set from the memory
and then save it to the file.
Bug: 306062513
Bug: 300111812
Test: do the following.
$ adb root
$ adb shell setprop persist.a 1
$ adb shell setprop next_boot.b 1
$ adb shell setprop next_boot.persist.c 1
$ adb reboot
$ adb shell getprop persist.a
1 // was (none) before this change
$ adb shell getprop b
1
$ adb shell getprop persist.c
1
$ adb reboot
$ adb shell getprop persist.a
1 // was (none) before this change
$ adb shell getprop b
// (none) because b isn't persisted. WAI.
$ adb shell getprop persist.c
1
Change-Id: I85d3777f9b32523b010e49b8ca53f4319dd2ce05
42 lines
1.4 KiB
C++
42 lines
1.4 KiB
C++
/*
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef _INIT_PERSISTENT_PROPERTIES_H
|
|
#define _INIT_PERSISTENT_PROPERTIES_H
|
|
|
|
#include <string>
|
|
|
|
#include "result.h"
|
|
#include "system/core/init/persistent_properties.pb.h"
|
|
|
|
namespace android {
|
|
namespace init {
|
|
|
|
void AddPersistentProperty(const std::string& name, const std::string& value,
|
|
PersistentProperties* persistent_properties);
|
|
PersistentProperties LoadPersistentProperties();
|
|
void WritePersistentProperty(const std::string& name, const std::string& value);
|
|
PersistentProperties LoadPersistentPropertiesFromMemory();
|
|
|
|
// Exposed only for testing
|
|
Result<PersistentProperties> LoadPersistentPropertyFile();
|
|
Result<void> WritePersistentPropertyFile(const PersistentProperties& persistent_properties);
|
|
extern std::string persistent_property_filename;
|
|
|
|
} // namespace init
|
|
} // namespace android
|
|
|
|
#endif
|