From e1513e2d3cc199654dbdfba8773d2476b6819538 Mon Sep 17 00:00:00 2001
From: Rachel Blackman <[EMAIL REDACTED]>
Date: Wed, 6 May 2026 15:14:09 -0700
Subject: [PATCH] Ensure Android hidapi does not drop the report byte (#15527)
(cherry picked from commit f8c364ae7432bc8efee0914734d3afb18458f394)
---
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 e9a1945b5d44a..2827305b3738e 100644
--- a/src/hidapi/android/hid.cpp
+++ b/src/hidapi/android/hid.cpp
@@ -716,9 +716,27 @@ class CHIDDevice
}
}
- 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;