From 666040e3e5a5ed54ec035aa7f98219d3b869bd37 Mon Sep 17 00:00:00 2001 From: Tyler Veness Date: Wed, 15 Jun 2022 21:20:52 -0700 Subject: [PATCH] [hal] Throw exceptions for invalid sizes in I2C and SPI JNI (#4312) GCC's static analyzer is correctly reporting that resize() requires an unsigned integer, but the argument provided in the JNI function could be negative since it's a signed byte. Throwing an exception if the argument is negative fixes the warning. --- hal/src/main/native/cpp/jni/I2CJNI.cpp | 15 +++++++++++++++ hal/src/main/native/cpp/jni/SPIJNI.cpp | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/hal/src/main/native/cpp/jni/I2CJNI.cpp b/hal/src/main/native/cpp/jni/I2CJNI.cpp index b605b9550a..68b844223a 100644 --- a/hal/src/main/native/cpp/jni/I2CJNI.cpp +++ b/hal/src/main/native/cpp/jni/I2CJNI.cpp @@ -64,6 +64,16 @@ Java_edu_wpi_first_hal_I2CJNI_i2CTransactionB (JNIEnv* env, jclass, jint port, jbyte address, jbyteArray dataToSend, jbyte sendSize, jbyteArray dataReceived, jbyte receiveSize) { + if (sendSize < 0) { + ThrowIllegalArgumentException(env, "I2CJNI.i2cTransactionB() sendSize < 0"); + return 0; + } + if (receiveSize < 0) { + ThrowIllegalArgumentException(env, + "I2CJNI.i2cTransactionB() receiveSize < 0"); + return 0; + } + wpi::SmallVector recvBuf; recvBuf.resize(receiveSize); jint returnValue = @@ -142,6 +152,11 @@ Java_edu_wpi_first_hal_I2CJNI_i2CReadB (JNIEnv* env, jclass, jint port, jbyte address, jbyteArray dataReceived, jbyte receiveSize) { + if (receiveSize < 0) { + ThrowIllegalArgumentException(env, "I2CJNI.i2cReadB() receiveSize < 0"); + return 0; + } + wpi::SmallVector recvBuf; recvBuf.resize(receiveSize); jint returnValue = HAL_ReadI2C(static_cast(port), address, diff --git a/hal/src/main/native/cpp/jni/SPIJNI.cpp b/hal/src/main/native/cpp/jni/SPIJNI.cpp index 67ef56df44..3c9143bbb4 100644 --- a/hal/src/main/native/cpp/jni/SPIJNI.cpp +++ b/hal/src/main/native/cpp/jni/SPIJNI.cpp @@ -63,6 +63,11 @@ Java_edu_wpi_first_hal_SPIJNI_spiTransactionB (JNIEnv* env, jclass, jint port, jbyteArray dataToSend, jbyteArray dataReceived, jbyte size) { + if (size < 0) { + ThrowIllegalArgumentException(env, "SPIJNI.spiTransactionB() size < 0"); + return 0; + } + wpi::SmallVector recvBuf; recvBuf.resize(size); jint retVal = @@ -120,6 +125,11 @@ Java_edu_wpi_first_hal_SPIJNI_spiRead (JNIEnv* env, jclass, jint port, jboolean initiate, jobject dataReceived, jbyte size) { + if (size < 0) { + ThrowIllegalArgumentException(env, "SPIJNI.spiRead() size < 0"); + return 0; + } + uint8_t* dataReceivedPtr = reinterpret_cast(env->GetDirectBufferAddress(dataReceived)); jint retVal; @@ -145,6 +155,11 @@ Java_edu_wpi_first_hal_SPIJNI_spiReadB (JNIEnv* env, jclass, jint port, jboolean initiate, jbyteArray dataReceived, jbyte size) { + if (size < 0) { + ThrowIllegalArgumentException(env, "SPIJNI.spiReadB() size < 0"); + return 0; + } + jint retVal; wpi::SmallVector recvBuf; recvBuf.resize(size); @@ -361,6 +376,12 @@ Java_edu_wpi_first_hal_SPIJNI_spiReadAutoReceivedData__I_3IID (JNIEnv* env, jclass, jint port, jintArray buffer, jint numToRead, jdouble timeout) { + if (numToRead < 0) { + ThrowIllegalArgumentException( + env, "SPIJNI.spiReadAutoReceivedData() numToRead < 0"); + return 0; + } + wpi::SmallVector recvBuf; recvBuf.resize(numToRead); int32_t status = 0;