Snap for 6435660 from 54a7e769ae9976690f7eb56731f87a0574540412 to sdk-release

Change-Id: I3190b181a73dd66546f2df5d75507ea90f56c3b3
diff --git a/libbpf_android/BpfUtils.cpp b/libbpf_android/BpfUtils.cpp
index 97b3363..3b6c764 100644
--- a/libbpf_android/BpfUtils.cpp
+++ b/libbpf_android/BpfUtils.cpp
@@ -138,8 +138,8 @@
     if (kver >= KVER(4, 14, 0)) return BpfLevel::EXTENDED_4_14;
 
     // Override for devices launched with O but now on a 4.9-P+ kernel.
-    bool has_ebpf = base::GetBoolProperty("ro.product.kernel_has_ebpf", false);
-    if (has_ebpf) return BpfLevel::BASIC_4_9;
+    bool ebpf_supported = base::GetBoolProperty("ro.kernel.ebpf.supported", false);
+    if (ebpf_supported) return BpfLevel::BASIC_4_9;
 
     uint64_t api_level = base::GetUintProperty<uint64_t>("ro.product.first_api_level", 0);
     if (api_level == 0) {
diff --git a/libbpf_android/Loader.cpp b/libbpf_android/Loader.cpp
index ce710a4..f808dc6 100644
--- a/libbpf_android/Loader.cpp
+++ b/libbpf_android/Loader.cpp
@@ -540,27 +540,39 @@
     string fname = pathToFilename(string(elfPath), true);
 
     for (int i = 0; i < (int)cs.size(); i++) {
-        string progPinLoc;
-        bool reuse = false;
+        string name = cs[i].name;
 
         if (cs[i].prog_def.has_value()) {
-            if (kvers < cs[i].prog_def->min_kver) continue;
-            if (kvers >= cs[i].prog_def->max_kver) continue;
+            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)\n", i, name.c_str(), min_kver,
+                  max_kver, kvers);
+            if (kvers < min_kver) continue;
+            if (kvers >= max_kver) continue;
         }
 
+        // strip any potential $foo suffix
+        // this can be used to provide duplicate programs
+        // conditionally loaded based on running kernel version
+        name = name.substr(0, name.find_last_of('$'));
+
+        bool reuse = false;
         // Format of pin location is
         // /sys/fs/bpf/prog_<filename>_<mapname>
-        progPinLoc = string(BPF_FS_PATH) + "prog_" + fname + "_" + cs[i].name;
+        string progPinLoc = BPF_FS_PATH "prog_";
+        progPinLoc += fname;
+        progPinLoc += '_';
+        progPinLoc += name;
         if (access(progPinLoc.c_str(), F_OK) == 0) {
             fd = bpf_obj_get(progPinLoc.c_str());
-            ALOGD("New bpf prog load reusing prog %s, ret: %d\n", cs[i].name.c_str(), fd);
+            ALOGD("New bpf prog load reusing prog %s, ret: %d\n", progPinLoc.c_str(), fd);
             reuse = true;
         } else {
             vector<char> log_buf(BPF_LOAD_LOG_SZ, 0);
 
-            fd = bpf_prog_load(cs[i].type, cs[i].name.c_str(), (struct bpf_insn*)cs[i].data.data(),
-                               cs[i].data.size(), license.c_str(), kvers, 0,
-                               log_buf.data(), log_buf.size());
+            fd = bpf_prog_load(cs[i].type, name.c_str(), (struct bpf_insn*)cs[i].data.data(),
+                               cs[i].data.size(), license.c_str(), kvers, 0, log_buf.data(),
+                               log_buf.size());
             ALOGD("bpf_prog_load lib call for %s (%s) returned fd: %d (%s)\n", elfPath,
                   cs[i].name.c_str(), fd, (fd < 0 ? std::strerror(errno) : "no error"));
 
diff --git a/libbpf_android/include/bpf/BpfMap.h b/libbpf_android/include/bpf/BpfMap.h
index 8c35931..c92f989 100644
--- a/libbpf_android/include/bpf/BpfMap.h
+++ b/libbpf_android/include/bpf/BpfMap.h
@@ -129,8 +129,9 @@
     const base::unique_fd& getMap() const { return mMapFd; };
 
     // Copy assignment operator
-    void operator=(const BpfMap<Key, Value>& other) {
-        mMapFd.reset(fcntl(other.mMapFd.get(), F_DUPFD_CLOEXEC, 0));
+    BpfMap<Key, Value>& operator=(const BpfMap<Key, Value>& other) {
+        if (this != &other) mMapFd.reset(fcntl(other.mMapFd.get(), F_DUPFD_CLOEXEC, 0));
+        return *this;
     }
 
     // Move constructor