Check for non-negative fd before close, dup, lseek, or read.
Bug: 24896328
Change-Id: Idd8da8cf202f51f42d0a81421a91768ec3d5f025
diff --git a/media/libmedia/MidiIoWrapper.cpp b/media/libmedia/MidiIoWrapper.cpp
index 5197ce2..faae954 100644
--- a/media/libmedia/MidiIoWrapper.cpp
+++ b/media/libmedia/MidiIoWrapper.cpp
@@ -42,7 +42,7 @@
MidiIoWrapper::MidiIoWrapper(int fd, off64_t offset, int64_t size) {
ALOGV("MidiIoWrapper(fd=%d)", fd);
- mFd = dup(fd);
+ mFd = fd < 0 ? -1 : dup(fd);
mBase = offset;
mLength = size;
}
@@ -61,7 +61,9 @@
MidiIoWrapper::~MidiIoWrapper() {
ALOGV("~MidiIoWrapper");
- close(mFd);
+ if (mFd >= 0) {
+ close(mFd);
+ }
}
int MidiIoWrapper::readAt(void *buffer, int offset, int size) {
@@ -70,6 +72,10 @@
if (mDataSource != NULL) {
return mDataSource->readAt(offset, buffer, size);
}
+ if (mFd < 0) {
+ errno = EBADF;
+ return -1; // as per failed read.
+ }
lseek(mFd, mBase + offset, SEEK_SET);
if (offset + size > mLength) {
size = mLength - offset;