@@ -276,17 +276,33 @@ JNIEXPORT jbyteArray JNICALL Java_jssc_SerialNativeInterface_readBytes
276276 HANDLE hComm = (HANDLE)portHandle;
277277 DWORD lpNumberOfBytesTransferred;
278278 DWORD lpNumberOfBytesRead;
279+ jbyteArray returnArray = NULL ;
279280 jbyte *lpBuffer = NULL ;
281+ OVERLAPPED *overlapped = NULL ;
280282
281- jbyteArray returnArray = env->NewByteArray (byteCount);
283+ if ( byteCount < 0 ){
284+ /* Negative byteCount makes no sense -> Report to caller by exception. */
285+ char exMsg[48 ]; exMsg[0 ] = ' \0 ' ;
286+ snprintf (exMsg, sizeof exMsg, " byteCount %d" , byteCount);
287+ jclass exClz = env->FindClass (" java/lang/IllegalArgumentException" );
288+ if ( exClz != NULL ) env->ThrowNew (exClz, exMsg);
289+ goto Finally;
290+ }
291+
292+ returnArray = env->NewByteArray (byteCount);
293+ if ( returnArray == NULL ) goto Finally;
282294
283295 lpBuffer = (jbyte *)malloc (byteCount * sizeof (jbyte));
284296 if (lpBuffer == NULL ){
285- // return an empty array
286- return returnArray;
297+ /* Whops. Not enough memory. Let caller know through exception. */
298+ char exMsg[32 ]; exMsg[0 ] = ' \0 ' ;
299+ snprintf (exMsg, sizeof exMsg, " malloc(%d)" , byteCount);
300+ jclass exClz = env->FindClass (" java/lang/OutOfMemoryError" );
301+ if ( exClz != NULL ) env->ThrowNew (exClz, exMsg);
302+ goto Finally;
287303 }
288304
289- OVERLAPPED * overlapped = new OVERLAPPED ();
305+ overlapped = new OVERLAPPED ();
290306 overlapped->hEvent = CreateEventA (NULL , true , false , NULL );
291307 if (ReadFile (hComm, lpBuffer, (DWORD)byteCount, &lpNumberOfBytesRead, overlapped)){
292308 env->SetByteArrayRegion (returnArray, 0 , byteCount, lpBuffer);
@@ -302,9 +318,12 @@ JNIEXPORT jbyteArray JNICALL Java_jssc_SerialNativeInterface_readBytes
302318 jclass exClz = env->FindClass (" java/lang/IllegalArgumentException" );
303319 if ( exClz != NULL ) env->ThrowNew (exClz, " EBADF" );
304320 }
305- CloseHandle (overlapped->hEvent );
306- delete overlapped;
307- free (lpBuffer);
321+ Finally:
322+ if ( overlapped != NULL ){
323+ CloseHandle (overlapped->hEvent );
324+ delete overlapped;
325+ }
326+ if ( lpBuffer != NULL ) free (lpBuffer);
308327 return returnArray;
309328}
310329
0 commit comments