diff options
| author | Mitch Phillips <mitchp@google.com> | 2022-04-21 19:20:07 +0000 |
|---|---|---|
| committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-04-21 19:20:07 +0000 |
| commit | de31754be1afe3bbe797b3aaec6f124452564aec (patch) | |
| tree | 83444dc13350002b184abc67dfe911475f675b7e /libc/bionic/sysprop_helpers.cpp | |
| parent | f53427e386a4327ee80222149d24a05e6f36e180 (diff) | |
| parent | 99422461a786a6720886c498e6b86063b27342cb (diff) | |
Merge "[GWP-ASan] Provide runtime configuration through an env var + sysprop." am: 3865c8f942 am: a6b526a12d am: 75011e6012 am: 99422461a7
Original change: https://android-review.googlesource.com/c/platform/bionic/+/2038947
Change-Id: I5966a332dcdee19d6b933a359c9037eea5069797
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'libc/bionic/sysprop_helpers.cpp')
| -rw-r--r-- | libc/bionic/sysprop_helpers.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/libc/bionic/sysprop_helpers.cpp b/libc/bionic/sysprop_helpers.cpp new file mode 100644 index 000000000..edae6cc84 --- /dev/null +++ b/libc/bionic/sysprop_helpers.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "sysprop_helpers.h" + +#include <assert.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include "sys/system_properties.h" + +static bool get_property_value(const char* property_name, char* dest, size_t dest_size) { + assert(property_name && dest && dest_size != 0); + const prop_info* prop = __system_property_find(property_name); + if (!prop) return false; + + struct PropCbCookie { + char* dest; + size_t size; + }; + *dest = '\0'; + PropCbCookie cb_cookie = {dest, dest_size}; + + __system_property_read_callback( + prop, + [](void* cookie, const char* /* name */, const char* value, uint32_t /* serial */) { + auto* cb_cookie = reinterpret_cast<PropCbCookie*>(cookie); + strncpy(cb_cookie->dest, value, cb_cookie->size); + }, + &cb_cookie); + if (*dest != '\0' && *dest != '0') return true; + + return false; +} + +bool get_config_from_env_or_sysprops(const char* env_var_name, const char* const* sys_prop_names, + size_t sys_prop_names_size, char* options, + size_t options_size) { + const char* env = getenv(env_var_name); + if (env && *env != '\0') { + strncpy(options, env, options_size); + options[options_size - 1] = '\0'; // Ensure null-termination. + return true; + } + + for (size_t i = 0; i < sys_prop_names_size; ++i) { + if (sys_prop_names[i] == nullptr) continue; + if (get_property_value(sys_prop_names[i], options, options_size)) return true; + } + return false; +} |
