require a bpf program definition
(it should always be present with current tooling)
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ib7ec357cc63d8db251abdf7f7d4b41bb2aabe104
diff --git a/libbpf_android/Loader.cpp b/libbpf_android/Loader.cpp
index d987f2e..4c0f5c7 100644
--- a/libbpf_android/Loader.cpp
+++ b/libbpf_android/Loader.cpp
@@ -995,33 +995,35 @@
unsigned kvers = kernelVersion();
int ret, fd;
- if (!kvers) return -1;
+ if (!kvers) {
+ ALOGE("unable to get kernel version");
+ return -EINVAL;
+ }
string objName = pathToObjName(string(elfPath));
for (int i = 0; i < (int)cs.size(); i++) {
string name = cs[i].name;
- unsigned bpfMinVer = DEFAULT_BPFLOADER_MIN_VER; // v0.0
- unsigned bpfMaxVer = DEFAULT_BPFLOADER_MAX_VER; // v1.0
- domain selinux_context = domain::unspecified;
- domain pin_subdir = domain::unspecified;
- if (cs[i].prog_def.has_value()) {
- unsigned min_kver = cs[i].prog_def->min_kver;
- unsigned max_kver = cs[i].prog_def->max_kver;
- ALOGD("cs[%d].name:%s min_kver:%x .max_kver:%x (kvers:%x)", i, name.c_str(), min_kver,
- max_kver, kvers);
- if (kvers < min_kver) continue;
- if (kvers >= max_kver) continue;
-
- bpfMinVer = cs[i].prog_def->bpfloader_min_ver;
- bpfMaxVer = cs[i].prog_def->bpfloader_max_ver;
- selinux_context = getDomainFromSelinuxContext(cs[i].prog_def->selinux_context);
- pin_subdir = getDomainFromPinSubdir(cs[i].prog_def->pin_subdir);
- // Note: make sure to only check for unrecognized *after* verifying bpfloader
- // version limits include this bpfloader's version.
+ if (!cs[i].prog_def.has_value()) {
+ ALOGE("[%d] '%s' missing program definition! bad bpf.o build?", i, name.c_str());
+ return -EINVAL;
}
+ unsigned min_kver = cs[i].prog_def->min_kver;
+ unsigned max_kver = cs[i].prog_def->max_kver;
+ ALOGD("cs[%d].name:%s min_kver:%x .max_kver:%x (kvers:%x)", i, name.c_str(), min_kver,
+ max_kver, kvers);
+ if (kvers < min_kver) continue;
+ if (kvers >= max_kver) continue;
+
+ unsigned bpfMinVer = cs[i].prog_def->bpfloader_min_ver;
+ unsigned bpfMaxVer = cs[i].prog_def->bpfloader_max_ver;
+ domain selinux_context = getDomainFromSelinuxContext(cs[i].prog_def->selinux_context);
+ domain pin_subdir = getDomainFromPinSubdir(cs[i].prog_def->pin_subdir);
+ // Note: make sure to only check for unrecognized *after* verifying bpfloader
+ // version limits include this bpfloader's version.
+
ALOGD("cs[%d].name:%s requires bpfloader version [0x%05x,0x%05x)", i, name.c_str(),
bpfMinVer, bpfMaxVer);
if (BPFLOADER_VERSION < bpfMinVer) continue;
@@ -1089,7 +1091,7 @@
for (const auto& line : lines) ALOGW("%s", line.c_str());
ALOGW("bpf_prog_load - END log_buf contents.");
- if (cs[i].prog_def.has_value() && cs[i].prog_def->optional) {
+ if (cs[i].prog_def->optional) {
ALOGW("failed program is marked optional - continuing...");
continue;
}
@@ -1130,14 +1132,12 @@
ALOGE("chmod %s 0440 -> [%d:%s]", progPinLoc.c_str(), err, strerror(err));
return -err;
}
- if (cs[i].prog_def.has_value()) {
- if (chown(progPinLoc.c_str(), (uid_t)cs[i].prog_def->uid,
- (gid_t)cs[i].prog_def->gid)) {
- int err = errno;
- ALOGE("chown %s %d %d -> [%d:%s]", progPinLoc.c_str(), cs[i].prog_def->uid,
- cs[i].prog_def->gid, err, strerror(err));
- return -err;
- }
+ if (chown(progPinLoc.c_str(), (uid_t)cs[i].prog_def->uid,
+ (gid_t)cs[i].prog_def->gid)) {
+ int err = errno;
+ ALOGE("chown %s %d %d -> [%d:%s]", progPinLoc.c_str(), cs[i].prog_def->uid,
+ cs[i].prog_def->gid, err, strerror(err));
+ return -err;
}
}