From 88ac54a4e8d2a63e4fd9c465e115795ace316776 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 29 Jan 2013 14:58:57 -0800 Subject: init: verify size of property buffers passed to property_get Verify that the buffer passed as the value parameter to property_get is always big enough. Change-Id: Ie5b6fcd94bb908215cfd55d0c9b07f717ddb70b1 --- init/property_service.c | 2 +- init/property_service.h | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'init') diff --git a/init/property_service.c b/init/property_service.c index 79ff6c0..846a0a3 100644 --- a/init/property_service.c +++ b/init/property_service.c @@ -272,7 +272,7 @@ static int check_perms(const char *name, unsigned int uid, unsigned int gid, cha return 0; } -int property_get(const char *name, char value[PROP_VALUE_MAX]) +int __property_get(const char *name, char *value) { return __system_property_get(name, value); } diff --git a/init/property_service.h b/init/property_service.h index b08c118..46cbd8f 100644 --- a/init/property_service.h +++ b/init/property_service.h @@ -26,9 +26,25 @@ extern void property_load_boot_defaults(void); extern void load_persist_props(void); extern void start_property_service(void); void get_property_workspace(int *fd, int *sz); -extern int property_get(const char *name, char value[PROP_VALUE_MAX]); +extern int __property_get(const char *name, char *value); extern int property_set(const char *name, const char *value); extern int properties_inited(); int get_property_set_fd(void); +extern void __property_get_size_error() + __attribute__((__error__("property_get called with too small buffer"))); + +static inline +__attribute__ ((always_inline)) +__attribute__ ((gnu_inline)) +__attribute__ ((artificial)) +int property_get(const char *name, char *value) +{ + size_t value_len = __builtin_object_size(value, 0); + if (value_len != PROP_VALUE_MAX) + __property_get_size_error(); + + return __property_get(name, value); +} + #endif /* _INIT_PROPERTY_H */ -- cgit v1.1