diff options
author | Praveen Chavan <pchavan@codeaurora.org> | 2018-07-06 18:19:46 -0700 |
---|---|---|
committer | Pawin Vongmasa <pawin@google.com> | 2018-07-13 00:48:26 -0700 |
commit | 131781fd12dd775dfaa2bbad95cf57079a945ca3 (patch) | |
tree | e5e9797d157d694b9522b1809730ddc6db7b6734 /libqdutils | |
parent | 856f4d3d0545aff003ddcee300f622a92961469b (diff) | |
download | display-131781fd12dd775dfaa2bbad95cf57079a945ca3.tar.gz |
qdMetaData: Add get/setMetaData variants that unmap metadata
Add get/setMetaDataAndUnmap(..) api that remove the meta-data
mapping and reset the mapped pointer in handle.
Use these versions in setMetaData called during alloc to
ensure allocating process does not duplicate invalid
base address of metadata (i.e when native_handle is copied
without importing)
CRs-Fixed: 2265196
Bug: 111274566
Change-Id: I0481ad8d59950256723871a089aeb3d143afac5a
Diffstat (limited to 'libqdutils')
-rw-r--r-- | libqdutils/qdMetaData.cpp | 22 | ||||
-rw-r--r-- | libqdutils/qdMetaData.h | 8 |
2 files changed, 30 insertions, 0 deletions
diff --git a/libqdutils/qdMetaData.cpp b/libqdutils/qdMetaData.cpp index 3259ee23..a40ea629 100644 --- a/libqdutils/qdMetaData.cpp +++ b/libqdutils/qdMetaData.cpp @@ -64,6 +64,13 @@ static int validateAndMap(private_handle_t* handle) { return 0; } +static void unmapAndReset(private_handle_t *handle) { + if (private_handle_t::validate(handle) == 0 && handle->base_metadata) { + munmap(reinterpret_cast<void *>(handle->base_metadata), getMetaDataSize()); + handle->base_metadata = 0; + } +} + int setMetaData(private_handle_t *handle, DispParamType paramType, void *param) { auto err = validateAndMap(handle); @@ -346,3 +353,18 @@ int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) { return 0; } +int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType, + void *param) { + auto ret = setMetaData(handle, paramType, param); + unmapAndReset(handle); + return ret; +} + +int getMetaDataAndUnmap(struct private_handle_t *handle, + enum DispFetchParamType paramType, + void *param) { + auto ret = getMetaData(handle, paramType, param); + unmapAndReset(handle); + return ret; +} + diff --git a/libqdutils/qdMetaData.h b/libqdutils/qdMetaData.h index 195fdd20..5739ceea 100644 --- a/libqdutils/qdMetaData.h +++ b/libqdutils/qdMetaData.h @@ -208,6 +208,14 @@ int clearMetaDataVa(struct MetaData_t *data, enum DispParamType paramType); unsigned long getMetaDataSize(); +// Map, access metadata and unmap. Used by clients that do not import/free but +// clone and delete native_handle +int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType, + void *param); +int getMetaDataAndUnmap(struct private_handle_t *handle, + enum DispFetchParamType paramType, + void *param); + #ifdef __cplusplus } #endif |