There are a few issues with the native memory allocation in share/native/sun/security/smartcardio/pcsc.c: 1) readerState = calloc(readers, sizeof(SCARD_READERSTATE)); if (readerState == NULL) { throwOutOfMemoryError(env, NULL); calloc() can return NULL due to readers be zero. In this case OOM would be confusing. 2) for (i = 0; i < readers; i++) { free((char *)readerState[i].szReader); } We can get here upon an error, so readerState[i].szReader may not be initialized. 3) mszReaders = malloc(size); if (mszReaders == NULL) { throwOutOfMemoryError(env, NULL); return NULL; } If size happens to be zero, we'll get a confusing OOM. 4) tab = (char **)malloc(cnt * sizeof(char *)); if (tab == NULL) { throwOutOfMemoryError(env, NULL); return NULL; } Again, we can get NULL from malloc, if cnt == 0.