Usb: Add status check to prevent NPE

This patch prevents a Null Pointer Exception in
queryMoistureDetectionStatus() when getPortStatusHelper() fails to open
the /sys/class/typec file. The failure results in an empty
currentPortStatus vector, causing the NPE when accessing its first
element.

Bug: 361097811
Flag: EXEMPT bugfix
Test: NPE does not occur when getPortStatusHelper() fails
Change-Id: I2cbe70d3b00cb2cf8c28a28d91a18fbf7c326ea7
Signed-off-by: Kuen-Han Tsai <khtsai@google.com>
This commit is contained in:
Kuen-Han Tsai 2024-10-09 15:59:20 +08:00
parent c730474f5e
commit 23cee311f9

View file

@ -1090,26 +1090,30 @@ void queryVersionHelper(android::hardware::usb::Usb *usb,
pthread_mutex_lock(&usb->mLock); pthread_mutex_lock(&usb->mLock);
status = getPortStatusHelper(usb, currentPortStatus); status = getPortStatusHelper(usb, currentPortStatus);
queryMoistureDetectionStatus(currentPortStatus); if (status == Status::SUCCESS && currentPortStatus->size() > 0) {
queryPowerTransferStatus(currentPortStatus); queryMoistureDetectionStatus(currentPortStatus);
queryNonCompliantChargerStatus(currentPortStatus); queryPowerTransferStatus(currentPortStatus);
queryUsbDataSession(usb, currentPortStatus); queryNonCompliantChargerStatus(currentPortStatus);
pthread_mutex_lock(&usb->mDisplayPortLock); queryUsbDataSession(usb, currentPortStatus);
if (!usb->mDisplayPortFirstSetupDone && pthread_mutex_lock(&usb->mDisplayPortLock);
usb->getDisplayPortUsbPathHelper(&displayPortUsbPath) == Status::SUCCESS) { if (!usb->mDisplayPortFirstSetupDone &&
usb->getDisplayPortUsbPathHelper(&displayPortUsbPath) == Status::SUCCESS) {
ALOGI("usbdp: boot with display connected or usb hal restarted"); ALOGI("usbdp: boot with display connected or usb hal restarted");
usb->setupDisplayPortPoll(); usb->setupDisplayPortPoll();
} }
pthread_mutex_unlock(&usb->mDisplayPortLock); pthread_mutex_unlock(&usb->mDisplayPortLock);
queryDisplayPortStatus(usb, currentPortStatus); queryDisplayPortStatus(usb, currentPortStatus);
if (usb->mCallback != NULL) { if (usb->mCallback != NULL) {
ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus, ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus,
status); status);
if (!ret.isOk()) if (!ret.isOk())
ALOGE("queryPortStatus error %s", ret.getDescription().c_str()); ALOGE("queryPortStatus error %s", ret.getDescription().c_str());
} else {
ALOGI("Notifying userspace skipped. Callback is NULL");
}
} else { } else {
ALOGI("Notifying userspace skipped. Callback is NULL"); ALOGI("%s skipped. currentPortStatus is empty", __func__);
} }
pthread_mutex_unlock(&usb->mLock); pthread_mutex_unlock(&usb->mLock);
} }