diff --git a/libbpf_android/Loader.cpp b/libbpf_android/Loader.cpp index 18dabba..1c27f9e 100644 --- a/libbpf_android/Loader.cpp +++ b/libbpf_android/Loader.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -411,7 +412,11 @@ static int createMaps(const char* elfPath, ifstream& elfFile, vector& if (!reuse) { ret = bpf_obj_pin(fd, mapPinLoc.c_str()); - if (ret < 0) return ret; + if (ret) return -errno; + ret = chown(mapPinLoc.c_str(), (uid_t)md[i].uid, (gid_t)md[i].gid); + if (ret) return -errno; + ret = chmod(mapPinLoc.c_str(), md[i].mode); + if (ret) return -errno; } mapFds.push_back(std::move(fd)); diff --git a/progs/include/bpf_helpers.h b/progs/include/bpf_helpers.h index 825947f..ac08649 100644 --- a/progs/include/bpf_helpers.h +++ b/progs/include/bpf_helpers.h @@ -53,16 +53,16 @@ static int (*bpf_map_delete_elem_unsafe)(const void* map, const void* key) = (void*)BPF_FUNC_map_delete_elem; /* type safe macro to declare a map and related accessor functions */ -#define DEFINE_BPF_MAP_NO_ACCESSORS(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries) \ - const struct bpf_map_def SEC("maps") the_map = { \ - .type = BPF_MAP_TYPE_##TYPE, \ - .key_size = sizeof(TypeOfKey), \ - .value_size = sizeof(TypeOfValue), \ - .max_entries = (num_entries), \ - }; - -#define DEFINE_BPF_MAP(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries) \ - DEFINE_BPF_MAP_NO_ACCESSORS(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries) \ +#define DEFINE_BPF_MAP_UGM(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, usr, grp, md) \ + const struct bpf_map_def SEC("maps") the_map = { \ + .type = BPF_MAP_TYPE_##TYPE, \ + .key_size = sizeof(TypeOfKey), \ + .value_size = sizeof(TypeOfValue), \ + .max_entries = (num_entries), \ + .uid = (usr), \ + .gid = (grp), \ + .mode = (md), \ + }; \ \ static inline __always_inline __unused TypeOfValue* bpf_##the_map##_lookup_elem( \ const TypeOfKey* k) { \ @@ -78,6 +78,15 @@ static int (*bpf_map_delete_elem_unsafe)(const void* map, return bpf_map_delete_elem_unsafe(&the_map, k); \ }; +#define DEFINE_BPF_MAP(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries) \ + DEFINE_BPF_MAP_UGM(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, AID_ROOT, AID_ROOT, 0600) + +#define DEFINE_BPF_MAP_GRO(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, gid) \ + DEFINE_BPF_MAP_UGM(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, AID_ROOT, gid, 0640) + +#define DEFINE_BPF_MAP_GRW(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, gid) \ + DEFINE_BPF_MAP_UGM(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, AID_ROOT, gid, 0660) + static int (*bpf_probe_read)(void* dst, int size, void* unsafe_ptr) = (void*) BPF_FUNC_probe_read; static int (*bpf_probe_read_str)(void* dst, int size, void* unsafe_ptr) = (void*) BPF_FUNC_probe_read_str; static unsigned long long (*bpf_ktime_get_ns)(void) = (void*) BPF_FUNC_ktime_get_ns; diff --git a/progs/include/bpf_map_def.h b/progs/include/bpf_map_def.h index 89a96d4..b233dc9 100644 --- a/progs/include/bpf_map_def.h +++ b/progs/include/bpf_map_def.h @@ -62,4 +62,8 @@ struct bpf_map_def { // The following are not supported by the Android bpfloader: // unsigned int inner_map_idx; // unsigned int numa_node; + + unsigned int uid; // uid_t + unsigned int gid; // gid_t + unsigned int mode; // mode_t };