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
This commit is contained in:
Colin Cross 2013-01-29 14:58:57 -08:00
parent 9f5af63501
commit 88ac54a4e8
2 changed files with 18 additions and 2 deletions

View file

@ -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);
}

View file

@ -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 */