Skip to content

Commit 11b58b6

Browse files
garydgregoryluben
authored andcommitted
Fix segmentation fault when calling Zstd.loadDictCompress(...)
1 parent 93ed992 commit 11b58b6

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

src/main/native/jni_zstd.c

+1
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ JNIEXPORT jint JNICALL Java_com_github_luben_zstd_Zstd_loadFastDictDecompress
271271
*/
272272
JNIEXPORT jint JNICALL Java_com_github_luben_zstd_Zstd_loadDictCompress
273273
(JNIEnv *env, jclass obj, jlong stream, jbyteArray dict, jint dict_size) {
274+
if (dict == NULL) return -ZSTD_error_dictionary_wrong;
274275
size_t size = -ZSTD_error_memory_allocation;
275276
void *dict_buff = (*env)->GetPrimitiveArrayCritical(env, dict, NULL);
276277
if (dict_buff == NULL) goto E1;

src/test/scala/Zstd.scala

+10-3
Original file line numberDiff line numberDiff line change
@@ -932,18 +932,25 @@ class ZstdSpec extends AnyFlatSpec with ScalaCheckPropertyChecks {
932932
zin.setDict(null.asInstanceOf[ZstdDictDecompress])
933933
}
934934
// Avoid:
935-
// 0 0x0000000103a067c8 AccessInternal::PostRuntimeDispatch<G1BarrierSet::AccessBarrier<548964ull, G1BarrierSet>, (AccessInternal::BarrierType)2, 548964ull>::oop_access_barrier(void*) + 8 in libjvm.dylib
936-
// 1 0x0000000103daa0f8 jni_GetObjectClass + 184 in libjvm.dylib
935+
// 0 0x0000000103a067c8 AccessInternal::PostRuntimeDispatch<G1BarrierSet::AccessBarrier<548964ull, G1BarrierSet>, (AccessInternal::BarrierType)2, 548964ull>::oop_access_barrier(void*) + 8 in libjvm.dylib
936+
// 1 0x0000000103daa0f8 jni_GetObjectClass + 184 in libjvm.dylib
937937
assert(Zstd.loadFastDictDecompress(0, null.asInstanceOf[ZstdDictDecompress]) == -32)
938938
}
939939

940940
"Zstd" should s"do not cause a segmentation fault in loadDictDecompress()" in {
941941
// Avoid:
942-
// 0 0x000000010185e7c8 AccessInternal::PostRuntimeDispatch<G1BarrierSet::AccessBarrier<548964ull, G1BarrierSet>, (AccessInternal::BarrierType)2, 548964ull>::oop_access_barrier(void*) + 8 in libjvm.dylib
942+
// 0 0x000000010185e7c8 AccessInternal::PostRuntimeDispatch<G1BarrierSet::AccessBarrier<548964ull, G1BarrierSet>, (AccessInternal::BarrierType)2, 548964ull>::oop_access_barrier(void*) + 8 in libjvm.dylib
943943
// 1 0x0000000101c17ca8 jni_GetPrimitiveArrayCritical + 340 in libjvm.dylib
944944
assert(Zstd.loadDictDecompress(0, null , 0) == -32)
945945
}
946946

947+
"Zstd" should s"do not cause a segmentation fault in loadDictCompress()" in {
948+
// Avoid:
949+
// 0 0x000000010152a7c8 AccessInternal::PostRuntimeDispatch<G1BarrierSet::AccessBarrier<548964ull, G1BarrierSet>, (AccessInternal::BarrierType)2, 548964ull>::oop_access_barrier(void*) + 8 in libjvm.dylib
950+
// 1 0x00000001018e3ca8 jni_GetPrimitiveArrayCritical + 340 in libjvm.dylib
951+
assert(Zstd.loadDictCompress(0, null , 0) == -32)
952+
}
953+
947954
"ZstdDirectBufferCompressingStream" should s"do nothing on double close but throw on writing on closed stream" in {
948955
val os = ByteBuffer.allocateDirect(100)
949956
val zos = new ZstdDirectBufferCompressingStream(os, 1)

0 commit comments

Comments
 (0)