Hi,

On Fri, Dec 09, 2016 at 06:49:56AM +0000, Yang, Rong R wrote:

> The change is for the case that param_value_size > sizeof(device->FIELD).
> For example:
>   cl_ulong max_alloc_size;
>   clGetDeviceInfo(device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, 
> sizeof(max_alloc_size), &max_alloc_size, NULL);

> param_value_size is 8, if beignet's device->max_alloc_size is size_t, 
> sizeof(device->max_alloc_size) is 4 in i386 systems.

Yes, but this has been fixed now.

> Because max_alloc_size hasn't been initialized, is garbage, and 
> memcpy(param_value, &device->FIELD, sizeof device->FIELD); 
> only copy the low 4 bytes, the high 4 bytes is still garbage.
> For example max_alloc_size is 0xdeaddeaddeaddead before call clGetDeviceInfo, 
> and device-> max_alloc_size is 0x40000000,
> After clGetDeviceInfo, max_alloc_size's value is 0xdeaddead40000000.

Right, but the returned size value is 4, so the program should know that
there was a communication error, and bail out anyway, because if Beignet
doesn't return sizeof(cl_ulong) there, then obviously it hasn't stored a
cl_ulong, so the result cannot be interpreted that way.

If a program doesn't do that check, it is broken. I cannot expect

  __uint128_t max_alloc_size;
  clGetDeviceInfo(device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(max_alloc_size), 
&max_alloc_size, NULL);

to work either. People need to write this out completely, as

  __uint128_t max_alloc_size;
  cl_uint max_alloc_size_size;
  int error = clGetDeviceInfo(device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof 
max_alloc_size, &max_alloc_size, &max_alloc_size_size);
  if(error != CL_SUCCESS)
    goto error;
  if(max_alloc_size_size != sizeof max_alloc_size)
    goto error;

and if they don't, I want valgrind to say "btw, they are using a value with
uninitialized bits here."

> So add memset(param_value, 0, param_value_size) to clear param_value, the 
> param_value's size is param_value_size, I think it is safe.

Safe, yes, because the spec doesn't say what should happen to the rest of
the buffer (so overwriting with zeros is fine), but also unnecessary.

   Simon
_______________________________________________
Beignet mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to