From 5bfa3ee8b37ef162154559575193018a6235acba Mon Sep 17 00:00:00 2001 From: Greg Hackmann Date: Thu, 20 Jun 2013 10:33:28 -0700 Subject: [PATCH] bionic: add missing memory barriers to system properties 1) Reading the value must finish before checking whether it's intact 2) Setting the serial's dirty bit must visible before modifying the value 3) The modified value must be visible before clearing the serial's dirty bit 4) New properties and their TOC entries must be visible before updating the property count Change-Id: I26c680ec025fdb72362d5f618ec0d2b93d381233 Signed-off-by: Greg Hackmann --- libc/bionic/system_properties.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libc/bionic/system_properties.c b/libc/bionic/system_properties.c index 800c8b84f..b12879e47 100644 --- a/libc/bionic/system_properties.c +++ b/libc/bionic/system_properties.c @@ -49,6 +49,7 @@ #include #include +#include struct prop_area { unsigned volatile count; @@ -315,6 +316,7 @@ int __system_property_read(const prop_info *pi, char *name, char *value) } len = SERIAL_VALUE_LEN(serial); memcpy(value, pi->value, len + 1); + ANDROID_MEMBAR_FULL(); if(serial == pi->serial) { if(name != 0) { strcpy(name, pi->name); @@ -446,7 +448,9 @@ int __system_property_update(prop_info *pi, const char *value, unsigned int len) return -1; pi->serial = pi->serial | 1; + ANDROID_MEMBAR_FULL(); memcpy(pi->value, value, len + 1); + ANDROID_MEMBAR_FULL(); pi->serial = (len << 24) | ((pi->serial + 1) & 0xffffff); __futex_wake(&pi->serial, INT32_MAX); @@ -493,6 +497,7 @@ int __system_property_add(const char *name, unsigned int namelen, memcpy(pi->value, value, valuelen + 1); pa->toc[pa->count] = (namelen << 24) | (((unsigned) pi) - ((unsigned) pa)); + ANDROID_MEMBAR_FULL(); pa->count++; pa->serial++;