PAL: Check if stream_handle is valid before accessing
Check the stream_handle before accessing to avoid fault addr issue.
crash exception will happen if stream handle is invalid though
address of stream handle is not null.
Change-Id: I2d21587758524d69274dc7e3fabcf426d816f8a5
diff --git a/Pal.cpp b/Pal.cpp
index 71d94ed..c18f4dd 100644
--- a/Pal.cpp
+++ b/Pal.cpp
@@ -399,11 +399,23 @@
{
Stream *s = NULL;
int status;
- if (!stream_handle || !buf) {
+ std::shared_ptr<ResourceManager> rm = NULL;
+
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ status = -EINVAL;
+ return status;
+ }
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle) || !buf) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
+ rm->unlockActiveStream();
+
PAL_VERBOSE(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->write(buf);
@@ -419,11 +431,23 @@
{
Stream *s = NULL;
int status;
- if (!stream_handle || !buf) {
+ std::shared_ptr<ResourceManager> rm = NULL;
+
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ status = -EINVAL;
+ return status;
+ }
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle) || !buf) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
+ rm->unlockActiveStream();
+
PAL_VERBOSE(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->read(buf);
@@ -440,11 +464,24 @@
{
Stream *s = NULL;
int status;
- if (!stream_handle) {
+ std::shared_ptr<ResourceManager> rm = NULL;
+
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ status = -EINVAL;
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ return status;
+ }
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
+ rm->unlockActiveStream();
+
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->getParameters(param_id, (void **)param_payload);
@@ -463,11 +500,22 @@
int status;
std::shared_ptr<ResourceManager> rm = NULL;
- if (!stream_handle) {
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ status = -EINVAL;
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ return status;
+ }
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle, status %d", status);
return status;
}
+ rm->unlockActiveStream();
+
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK param_id %d", stream_handle,
param_id);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -480,12 +528,7 @@
PAL_ERR(LOG_TAG, "set parameters failed status %d param_id %u", status, param_id);
return status;
}
- rm = ResourceManager::getInstance();
- if (!rm) {
- status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid resource manager");
- return status;
- }
+
if (param_id == PAL_PARAM_ID_STOP_BUFFERING) {
PAL_DBG(LOG_TAG, "Buffering stopped, handle deferred LPI<->NLPI switch");
rm->handleDeferredSwitch();
@@ -603,11 +646,24 @@
{
Stream *s = NULL;
int status;
- if (!stream_handle) {
+ std::shared_ptr<ResourceManager> rm = NULL;
+
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ status = -EINVAL;
+ return status;
+ }
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
+ rm->unlockActiveStream();
+
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->pause();
@@ -623,12 +679,23 @@
{
Stream *s = NULL;
int status;
+ std::shared_ptr<ResourceManager> rm = NULL;
- if (!stream_handle) {
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ status = -EINVAL;
+ return status;
+ }
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
+ rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -699,12 +766,23 @@
{
Stream *s = NULL;
int status;
+ std::shared_ptr<ResourceManager> rm = NULL;
- if (!stream_handle) {
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ status = -EINVAL;
+ return status;
+ }
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
+ rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -723,12 +801,23 @@
{
Stream *s = NULL;
int status;
+ std::shared_ptr<ResourceManager> rm = NULL;
- if (!stream_handle) {
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ status = -EINVAL;
+ return status;
+ }
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
+ rm->unlockActiveStream();
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -748,12 +837,24 @@
{
Stream *s = NULL;
int status;
+ std::shared_ptr<ResourceManager> rm = NULL;
- if (!stream_handle) {
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
return status;
}
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
+ status = -EINVAL;
+ PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
+ return status;
+ }
+ rm->unlockActiveStream();
+
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -812,12 +913,24 @@
{
Stream *s = NULL;
int status = 0;
+ std::shared_ptr<ResourceManager> rm = NULL;
- if (!stream_handle) {
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ status = -EINVAL;
+ return status;
+ }
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
+ rm->unlockActiveStream();
+
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -1017,12 +1130,24 @@
{
int status = 0;
Stream *s = NULL;
+ std::shared_ptr<ResourceManager> rm = NULL;
- if (!stream_handle) {
+ rm = ResourceManager::getInstance();
+ if (!rm) {
+ status = -EINVAL;
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
+ return status;
+ }
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
status = -EINVAL;
PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
return status;
}
+ rm->unlockActiveStream();
+
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
@@ -1081,13 +1206,26 @@
int32_t pal_stream_get_mmap_position(pal_stream_handle_t *stream_handle,
struct pal_mmap_position *position)
{
- Stream *s = NULL;
- int status;
- if (!stream_handle) {
+ Stream *s = NULL;
+ int status;
+ std::shared_ptr<ResourceManager> rm = NULL;
+
+ rm = ResourceManager::getInstance();
+ if (!rm) {
status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
return status;
}
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
+ status = -EINVAL;
+ PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
+ return status;
+ }
+ rm->unlockActiveStream();
+
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->GetMmapPosition(position);
@@ -1105,11 +1243,24 @@
{
Stream *s = NULL;
int status;
- if (!stream_handle) {
+ std::shared_ptr<ResourceManager> rm = NULL;
+
+ rm = ResourceManager::getInstance();
+ if (!rm) {
status = -EINVAL;
- PAL_ERR(LOG_TAG, "Invalid input parameters status %d", status);
+ PAL_ERR(LOG_TAG, "Invalid resource manager");
return status;
}
+
+ rm->lockActiveStream();
+ if (!stream_handle || !rm->isActiveStream(stream_handle)) {
+ rm->unlockActiveStream();
+ status = -EINVAL;
+ PAL_ERR(LOG_TAG, "Invalid stream handle status %d", status);
+ return status;
+ }
+ rm->unlockActiveStream();
+
PAL_DBG(LOG_TAG, "Enter. Stream handle :%pK", stream_handle);
s = reinterpret_cast<Stream *>(stream_handle);
status = s->createMmapBuffer(min_size_frames, info);