Merge cherrypicks of [6072696, 6072074, 6072757, 6072120, 6072121, 6072122, 6072123, 6072575, 6072576, 6072577, 6072578, 6072579, 6072193, 6072131, 6072194, 6072076, 6072210, 6072759, 6072760, 6072698, 6072699, 6072700, 6072701, 6072702, 6072703, 6072704, 6072905, 6072906, 6072907, 6072761] into oc-m8-release
Change-Id: Ice40444281517f12b1d86857a0df4e2b8cf54616
diff --git a/transport/HidlTransportSupport.cpp b/transport/HidlTransportSupport.cpp
index ea2e32c..a47ead9 100644
--- a/transport/HidlTransportSupport.cpp
+++ b/transport/HidlTransportSupport.cpp
@@ -28,6 +28,22 @@
joinBinderRpcThreadpool();
}
+// TODO(b/122472540): only store one data item per object
+template <typename V>
+static void pruneMapLocked(ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, V>& map) {
+ using ::android::hidl::base::V1_0::IBase;
+
+ std::vector<wp<IBase>> toDelete;
+ for (const auto& kv : map) {
+ if (kv.first.promote() == nullptr) {
+ toDelete.push_back(kv.first);
+ }
+ }
+ for (const auto& k : toDelete) {
+ map.eraseLocked(k);
+ }
+}
+
bool setMinSchedulerPolicy(const sp<::android::hidl::base::V1_0::IBase>& service,
int policy, int priority) {
if (service->isRemote()) {
@@ -53,5 +69,21 @@
return true;
}
+bool setRequestingSid(const sp<::android::hidl::base::V1_0::IBase>& service, bool requesting) {
+ if (service->isRemote()) {
+ ALOGE("Can't set requesting sid on remote service.");
+ return false;
+ }
+
+ // Due to ABI considerations, IBase cannot have a destructor to clean this up.
+ // So, because this API is so infrequently used, (expected to be usually only
+ // one time for a process, but it can be more), we are cleaning it up here.
+ std::unique_lock<std::mutex> lock = details::gServiceSidMap.lock();
+ pruneMapLocked(details::gServiceSidMap);
+ details::gServiceSidMap.setLocked(service, requesting);
+
+ return true;
+}
+
}
}
diff --git a/transport/Static.cpp b/transport/Static.cpp
index 784b835..b599c5c 100644
--- a/transport/Static.cpp
+++ b/transport/Static.cpp
@@ -35,7 +35,9 @@
ConcurrentMap<const ::android::hidl::base::V1_0::IBase*, wp<::android::hardware::BHwBinder>>
gBnMap{};
+// TODO(b/122472540): replace with single, hidden map
ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, SchedPrio> gServicePrioMap{};
+ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, bool> gServiceSidMap{};
ConcurrentMap<std::string, std::function<sp<::android::hidl::base::V1_0::IBase>(void *)>>
gBsConstructorMap;
diff --git a/transport/include/hidl/ConcurrentMap.h b/transport/include/hidl/ConcurrentMap.h
index 4066869..1b06dfd 100644
--- a/transport/include/hidl/ConcurrentMap.h
+++ b/transport/include/hidl/ConcurrentMap.h
@@ -67,6 +67,7 @@
std::unique_lock<std::mutex> lock() { return std::unique_lock<std::mutex>(mMutex); }
void setLocked(K&& k, V&& v) { mMap[std::forward<K>(k)] = std::forward<V>(v); }
+ void setLocked(K&& k, const V& v) { mMap[std::forward<K>(k)] = v; }
const V& getLocked(const K& k, const V& def) const {
const_iterator iter = mMap.find(k);
@@ -76,6 +77,14 @@
return iter->second;
}
+ size_type eraseLocked(const K& k) { return mMap.erase(k); }
+
+ // the concurrent map must be locked in order to iterate over it
+ iterator begin() { return mMap.begin(); }
+ iterator end() { return mMap.end(); }
+ const_iterator begin() const { return mMap.begin(); }
+ const_iterator end() const { return mMap.end(); }
+
private:
mutable std::mutex mMutex;
std::map<K, V> mMap;
diff --git a/transport/include/hidl/HidlTransportSupport.h b/transport/include/hidl/HidlTransportSupport.h
index d116598..6a243f9 100644
--- a/transport/include/hidl/HidlTransportSupport.h
+++ b/transport/include/hidl/HidlTransportSupport.h
@@ -71,6 +71,18 @@
return toBinder<ILeft>(left) == toBinder<IRight>(right);
}
+/**
+ * Sets whether or not this object should request security contexts to be populatd for incoming
+ * calls (e.g. with getCallingSid).
+ *
+ * This method MUST be called before passing this service to another process
+ * and/or registering it with registerAsService().
+ *
+ * @param service the service to set the policy for
+ * @param requesting whether or not to request sid (default is false)
+ */
+bool setRequestingSid(const sp<::android::hidl::base::V1_0::IBase>& service, bool requesting);
+
namespace details {
// cast the interface IParent to IChild.
diff --git a/transport/include/hidl/Static.h b/transport/include/hidl/Static.h
index 63b06fe..17db3d1 100644
--- a/transport/include/hidl/Static.h
+++ b/transport/include/hidl/Static.h
@@ -35,6 +35,7 @@
};
extern ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, SchedPrio> gServicePrioMap;
+extern ConcurrentMap<wp<::android::hidl::base::V1_0::IBase>, bool> gServiceSidMap;
// For HidlBinderSupport and autogenerated code
extern ConcurrentMap<const ::android::hidl::base::V1_0::IBase*, wp<::android::hardware::BHwBinder>>