diff --git a/src/main/cpp/_nix_based/jssc.cpp b/src/main/cpp/_nix_based/jssc.cpp index f0d77d437..87fb1a753 100644 --- a/src/main/cpp/_nix_based/jssc.cpp +++ b/src/main/cpp/_nix_based/jssc.cpp @@ -530,8 +530,18 @@ JNIEXPORT jboolean JNICALL Java_jssc_SerialNativeInterface_setDTR */ JNIEXPORT jboolean JNICALL Java_jssc_SerialNativeInterface_writeBytes (JNIEnv *env, jobject, jlong portHandle, jbyteArray buffer){ + if( buffer == NULL ){ + jclass exClz = env->FindClass("java/lang/NullPointerException"); + if( exClz != NULL ) env->ThrowNew(exClz, "buffer"); + return 0; + } jboolean ret = JNI_FALSE; jbyte* jBuffer = env->GetByteArrayElements(buffer, JNI_FALSE); + if( jBuffer == NULL ){ + jclass exClz = env->FindClass("java/lang/RuntimeException"); + if( exClz != NULL ) env->ThrowNew(exClz, "jni->GetByteArrayElements() failed"); + return 0; + } jint bufferSize = env->GetArrayLength(buffer); jint result = write(portHandle, jBuffer, (size_t)bufferSize); if( result == -1 ){ diff --git a/src/main/cpp/windows/jssc.cpp b/src/main/cpp/windows/jssc.cpp index e608e060e..6c9f298b0 100644 --- a/src/main/cpp/windows/jssc.cpp +++ b/src/main/cpp/windows/jssc.cpp @@ -236,9 +236,19 @@ JNIEXPORT jboolean JNICALL Java_jssc_SerialNativeInterface_writeBytes HANDLE hComm = (HANDLE)portHandle; DWORD lpNumberOfBytesTransferred; DWORD lpNumberOfBytesWritten; - OVERLAPPED *overlapped = new OVERLAPPED(); jboolean returnValue = JNI_FALSE; + if( buffer == NULL ){ + jclass exClz = env->FindClass("java/lang/NullPointerException"); + if( exClz != NULL ) env->ThrowNew(exClz, "buffer"); + return 0; + } jbyte* jBuffer = env->GetByteArrayElements(buffer, JNI_FALSE); + if( jBuffer == NULL ){ + jclass exClz = env->FindClass("java/lang/RuntimeException"); + if( exClz != NULL ) env->ThrowNew(exClz, "jni->GetByteArrayElements() failed"); + return 0; + } + OVERLAPPED *overlapped = new OVERLAPPED(); overlapped->hEvent = CreateEventA(NULL, true, false, NULL); if(WriteFile(hComm, jBuffer, (DWORD)env->GetArrayLength(buffer), &lpNumberOfBytesWritten, overlapped)){ returnValue = JNI_TRUE; diff --git a/src/test/java/jssc/SerialNativeInterfaceTest.java b/src/test/java/jssc/SerialNativeInterfaceTest.java index 541e2f753..5bbcb2c1f 100644 --- a/src/test/java/jssc/SerialNativeInterfaceTest.java +++ b/src/test/java/jssc/SerialNativeInterfaceTest.java @@ -88,4 +88,9 @@ public void throwsIllegalArgumentExceptionIfPortHandleIllegalOsx() throws Except } } + @Test(expected = java.lang.NullPointerException.class) + public void throwsNpeIfPassedBufferIsNull() throws Exception { + new SerialNativeInterface().writeBytes(1, null); + } + }