From f8c364ae7432bc8efee0914734d3afb18458f394 Mon Sep 17 00:00:00 2001 From: Rachel Blackman Date: Wed, 6 May 2026 15:14:09 -0700 Subject: [PATCH] Ensure Android hidapi does not drop the report byte (#15527) --- src/hidapi/android/hid.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/hidapi/android/hid.cpp b/src/hidapi/android/hid.cpp index c839906cda..15a3162387 100644 --- a/src/hidapi/android/hid.cpp +++ b/src/hidapi/android/hid.cpp @@ -725,9 +725,27 @@ public: } } - size_t uBytesToCopy = m_reportResponse.size() > nDataLen ? nDataLen : m_reportResponse.size(); - SDL_memcpy( pData, m_reportResponse.data(), uBytesToCopy ); - m_reportResponse.clear(); + size_t uBytesToCopy = 0; + + if ( m_reportResponse.size() > 0 ) + { + // Make sure we preserve the report value if it isn't already in the report. + bool bHasReportAlready = ( *pData == *m_reportResponse.data() ); + + // Make sure we only copy as much as will fit, deducting one byte for the report if we need to leave it intact. + size_t nSafeDataLen = nDataLen - ( bHasReportAlready ? 0 : 1 ); + uBytesToCopy = m_reportResponse.size() < nSafeDataLen ? m_reportResponse.size() : nSafeDataLen; + + SDL_memcpy( pData + ( bHasReportAlready ? 0 : 1 ), m_reportResponse.data(), uBytesToCopy ); + m_reportResponse.clear(); + + if ( !bHasReportAlready ) + { + // Add the report byte back on to return the real length. + uBytesToCopy++; + } + } + LOGV( "=== Got %zu bytes", uBytesToCopy ); return (int)uBytesToCopy;