From 23cee311f910d19118407efac0474b0e1fd04ec0 Mon Sep 17 00:00:00 2001 From: Kuen-Han Tsai Date: Wed, 9 Oct 2024 15:59:20 +0800 Subject: [PATCH] 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 --- usb/usb/Usb.cpp | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp index 4f6d1272..10422f6c 100644 --- a/usb/usb/Usb.cpp +++ b/usb/usb/Usb.cpp @@ -1090,26 +1090,30 @@ void queryVersionHelper(android::hardware::usb::Usb *usb, pthread_mutex_lock(&usb->mLock); status = getPortStatusHelper(usb, currentPortStatus); - queryMoistureDetectionStatus(currentPortStatus); - queryPowerTransferStatus(currentPortStatus); - queryNonCompliantChargerStatus(currentPortStatus); - queryUsbDataSession(usb, currentPortStatus); - pthread_mutex_lock(&usb->mDisplayPortLock); - if (!usb->mDisplayPortFirstSetupDone && - usb->getDisplayPortUsbPathHelper(&displayPortUsbPath) == Status::SUCCESS) { + if (status == Status::SUCCESS && currentPortStatus->size() > 0) { + queryMoistureDetectionStatus(currentPortStatus); + queryPowerTransferStatus(currentPortStatus); + queryNonCompliantChargerStatus(currentPortStatus); + queryUsbDataSession(usb, currentPortStatus); + pthread_mutex_lock(&usb->mDisplayPortLock); + if (!usb->mDisplayPortFirstSetupDone && + usb->getDisplayPortUsbPathHelper(&displayPortUsbPath) == Status::SUCCESS) { - ALOGI("usbdp: boot with display connected or usb hal restarted"); - usb->setupDisplayPortPoll(); - } - pthread_mutex_unlock(&usb->mDisplayPortLock); - queryDisplayPortStatus(usb, currentPortStatus); - if (usb->mCallback != NULL) { - ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus, - status); - if (!ret.isOk()) - ALOGE("queryPortStatus error %s", ret.getDescription().c_str()); + ALOGI("usbdp: boot with display connected or usb hal restarted"); + usb->setupDisplayPortPoll(); + } + pthread_mutex_unlock(&usb->mDisplayPortLock); + queryDisplayPortStatus(usb, currentPortStatus); + if (usb->mCallback != NULL) { + ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus, + status); + if (!ret.isOk()) + ALOGE("queryPortStatus error %s", ret.getDescription().c_str()); + } else { + ALOGI("Notifying userspace skipped. Callback is NULL"); + } } else { - ALOGI("Notifying userspace skipped. Callback is NULL"); + ALOGI("%s skipped. currentPortStatus is empty", __func__); } pthread_mutex_unlock(&usb->mLock); }