@@ -221,7 +221,8 @@ TYPED_TEST(KernelArgImmediateTest, givenTooLargePatchSizeWhenSettingArgThenDontR
221
221
222
222
const auto memoryBeyondLimitBefore = *reinterpret_cast <TypeParam *>(memoryBeyondLimitAddress);
223
223
224
- auto retVal = pKernel->setArg (0 , sizeof (memory), memory);
224
+ this ->pKernelInfo ->argAsVal (0 ).elements [0 ].size = sizeof (TypeParam) + 1 ;
225
+ auto retVal = pKernel->setArg (0 , sizeof (TypeParam), &memory[0 ]);
225
226
226
227
const auto memoryBeyondLimitAfter = *reinterpret_cast <TypeParam *>(memoryBeyondLimitAddress);
227
228
EXPECT_EQ (memoryBeyondLimitBefore, memoryBeyondLimitAfter);
@@ -256,6 +257,43 @@ TYPED_TEST(KernelArgImmediateTest, givenNotTooLargePatchSizeWhenSettingArgThenDo
256
257
}
257
258
}
258
259
260
+ TYPED_TEST (KernelArgImmediateTest, givenMulitplePatchesAndFirstPatchSizeTooLargeWhenSettingArgThenDontReadMemoryBeyondLimit) {
261
+ if (sizeof (TypeParam) == 1 )
262
+ return ; // multiple patch chars don't make sense
263
+
264
+ for (auto &rootDeviceIndex : this ->context ->getRootDeviceIndices ()) {
265
+ auto pKernel = this ->pMultiDeviceKernel ->getKernel (rootDeviceIndex);
266
+ TypeParam memory[2 ];
267
+ std::memset (&memory[0 ], 0xaa , sizeof (TypeParam));
268
+ std::memset (&memory[1 ], 0xbb , sizeof (TypeParam));
269
+
270
+ auto &elements = this ->pKernelInfo ->argAsVal (3 ).elements ;
271
+ const auto destinationMemoryAddress1 = pKernel->getCrossThreadData () +
272
+ elements[2 ].offset ;
273
+ const auto destinationMemoryAddress2 = pKernel->getCrossThreadData () +
274
+ elements[1 ].offset ;
275
+ const auto memoryBeyondLimitAddress1 = destinationMemoryAddress1 + sizeof (TypeParam);
276
+ const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2 + sizeof (TypeParam) / 2 ;
277
+
278
+ const std::vector<unsigned char > memoryBeyondLimitBefore1 (memoryBeyondLimitAddress1, memoryBeyondLimitAddress1 + sizeof (TypeParam));
279
+ const std::vector<unsigned char > memoryBeyondLimitBefore2 (memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof (TypeParam) / 2 );
280
+
281
+ elements[2 ].sourceOffset = 0 ;
282
+ elements[1 ].sourceOffset = sizeof (TypeParam) / 2 ;
283
+ elements[2 ].size = sizeof (TypeParam);
284
+ elements[1 ].size = sizeof (TypeParam) / 2 ;
285
+ auto retVal = pKernel->setArg (3 , sizeof (TypeParam), &memory[0 ]);
286
+
287
+ EXPECT_EQ (0 , std::memcmp (memoryBeyondLimitBefore1.data (), memoryBeyondLimitAddress1, sizeof (TypeParam)));
288
+ EXPECT_EQ (0 , std::memcmp (memoryBeyondLimitBefore2.data (), memoryBeyondLimitAddress2, sizeof (TypeParam) / 2 ));
289
+
290
+ EXPECT_EQ (0 , std::memcmp (&memory[0 ], destinationMemoryAddress1, sizeof (TypeParam)));
291
+ EXPECT_EQ (0 , std::memcmp (&memory[0 ], destinationMemoryAddress2, sizeof (TypeParam) / 2 ));
292
+
293
+ EXPECT_EQ (CL_SUCCESS, retVal);
294
+ }
295
+ }
296
+
259
297
TYPED_TEST (KernelArgImmediateTest, givenMulitplePatchesAndSecondPatchSizeTooLargeWhenSettingArgThenDontReadMemoryBeyondLimit) {
260
298
if (sizeof (TypeParam) == 1 )
261
299
return ; // multiple patch chars don't make sense
@@ -272,17 +310,17 @@ TYPED_TEST(KernelArgImmediateTest, givenMulitplePatchesAndSecondPatchSizeTooLarg
272
310
const auto destinationMemoryAddress2 = pKernel->getCrossThreadData () +
273
311
elements[1 ].offset ;
274
312
const auto memoryBeyondLimitAddress1 = destinationMemoryAddress1 + sizeof (TypeParam) / 2 ;
275
- const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2 + sizeof (TypeParam);
313
+ const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2 + sizeof (TypeParam) / 2 ;
276
314
277
315
const std::vector<unsigned char > memoryBeyondLimitBefore1 (memoryBeyondLimitAddress1, memoryBeyondLimitAddress1 + sizeof (TypeParam) / 2 );
278
- const std::vector<unsigned char > memoryBeyondLimitBefore2 (memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof (TypeParam));
316
+ const std::vector<unsigned char > memoryBeyondLimitBefore2 (memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof (TypeParam) / 2 );
279
317
280
318
elements[0 ].size = 0 ;
281
319
elements[2 ].sourceOffset = 0 ;
282
320
elements[1 ].sourceOffset = sizeof (TypeParam) / 2 ;
283
321
elements[2 ].size = sizeof (TypeParam) / 2 ;
284
322
elements[1 ].size = sizeof (TypeParam);
285
- auto retVal = pKernel->setArg (3 , sizeof (memory ), memory);
323
+ auto retVal = pKernel->setArg (3 , sizeof (TypeParam ), & memory[ 0 ] );
286
324
287
325
EXPECT_EQ (0 , std::memcmp (memoryBeyondLimitBefore1.data (), memoryBeyondLimitAddress1, sizeof (TypeParam) / 2 ));
288
326
EXPECT_EQ (0 , std::memcmp (memoryBeyondLimitBefore2.data (), memoryBeyondLimitAddress2, sizeof (TypeParam) / 2 ));
@@ -295,9 +333,6 @@ TYPED_TEST(KernelArgImmediateTest, givenMulitplePatchesAndSecondPatchSizeTooLarg
295
333
}
296
334
297
335
TYPED_TEST (KernelArgImmediateTest, givenMultiplePatchesAndOneSourceOffsetBeyondArgumentWhenSettingArgThenDontCopyThisPatch) {
298
- if (sizeof (TypeParam) == 1u ) {
299
- GTEST_SKIP ();
300
- }
301
336
for (auto &rootDeviceIndex : this ->context ->getRootDeviceIndices ()) {
302
337
auto pKernel = this ->pMultiDeviceKernel ->getKernel (rootDeviceIndex);
303
338
TypeParam memory[2 ];
@@ -310,23 +345,22 @@ TYPED_TEST(KernelArgImmediateTest, givenMultiplePatchesAndOneSourceOffsetBeyondA
310
345
const auto destinationMemoryAddress2 = pKernel->getCrossThreadData () +
311
346
elements[2 ].offset ;
312
347
const auto memoryBeyondLimitAddress1 = destinationMemoryAddress1 + sizeof (TypeParam);
313
- const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2 + 1 ;
348
+ const auto memoryBeyondLimitAddress2 = destinationMemoryAddress2;
314
349
315
350
const std::vector<unsigned char > memoryBeyondLimitBefore1 (memoryBeyondLimitAddress1, memoryBeyondLimitAddress1 + sizeof (TypeParam));
316
- const std::vector<unsigned char > memoryBeyondLimitBefore2 (memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof (TypeParam) - 1 );
351
+ const std::vector<unsigned char > memoryBeyondLimitBefore2 (memoryBeyondLimitAddress2, memoryBeyondLimitAddress2 + sizeof (TypeParam));
317
352
318
353
elements[0 ].size = 0 ;
319
354
elements[1 ].sourceOffset = 0 ;
320
355
elements[1 ].size = sizeof (TypeParam);
321
356
elements[2 ].sourceOffset = sizeof (TypeParam);
322
357
elements[2 ].size = 1 ;
323
- auto retVal = pKernel->setArg (3 , sizeof (memory ), memory);
358
+ auto retVal = pKernel->setArg (3 , sizeof (TypeParam ), & memory[ 0 ] );
324
359
325
360
EXPECT_EQ (0 , std::memcmp (memoryBeyondLimitBefore1.data (), memoryBeyondLimitAddress1, memoryBeyondLimitBefore1.size ()));
326
361
EXPECT_EQ (0 , std::memcmp (memoryBeyondLimitBefore2.data (), memoryBeyondLimitAddress2, memoryBeyondLimitBefore2.size ()));
327
362
328
363
EXPECT_EQ (0 , std::memcmp (&memory[0 ], destinationMemoryAddress1, sizeof (TypeParam)));
329
- EXPECT_EQ (0 , std::memcmp (&memory[1 ], destinationMemoryAddress2, 1 ));
330
364
331
365
EXPECT_EQ (CL_SUCCESS, retVal);
332
366
}
0 commit comments