On 29/01/2020 17:44, Thomas Schwinge wrote:
@@ -1513,6 +1518,23 @@ init_hsa_context (void)

+  size_t len = sizeof hsa_context.driver_version_s;
+  int printed = snprintf (hsa_context.driver_version_s, len,
+                         "HSA Runtime %hu.%hu", (unsigned short int)major,
+                         (unsigned short int)minor);
+  if (printed >= len)
+    GCN_WARNING ("HSA runtime version string was truncated."
+                "Version %hu.%hu is too long.", (unsigned short int)major,
+                (unsigned short int)minor);

(Can it actually happen that 'snprintf' returns 'printed > len' --
meaning that it's written into random memory?  I thought 'snprintf' has a
hard stop at 'len'?  Or does this indicate the amount of memory it
would've written?  I should re-read the manpage at some point...)  ;-)

snprintf returns the length it would have been, if not truncated.

For 'printed = len' does or doesn't 'snprintf' store the terminating
'NUL' character, or do we manually have to set:

     hsa_context.driver_version_s[len - 1] = '\0';

... in that case?

It does the right thing already, hence why printed == len is an overflow: the last character will be missing.


@@ -3410,15 +3432,19 @@ GOMP_OFFLOAD_init_device (int n)

-  char buf[64];
    status = hsa_fns.hsa_agent_get_info_fn (agent->id, HSA_AGENT_INFO_NAME,
-                                         &buf);
+                                         &agent->name);
    if (status != HSA_STATUS_SUCCESS)
      return hsa_error ("Error querying the name of the agent", status);

(That's of course pre-existing, but) this looks like a dangerous API,
given that 'hsa_agent_get_info_fn' doesn't know 'sizeof agent->name' (or
'sizeof buf' before)...

Those ones are written into the HSA documentation. They are fixed-sized fields, so there must be 64 bytes regardless of the actual name of the agent.

+  status = hsa_fns.hsa_agent_get_info_fn (agent->id, 
HSA_AGENT_INFO_VENDOR_NAME,
+                                         &agent->vendor_name);
+  if (status != HSA_STATUS_SUCCESS)
+    return hsa_error ("Error querying the vendor name of the agent", status);

Similar here.

Same reason.

--- a/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_get_property.c
+++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/acc_get_property.c
@@ -3,8 +3,7 @@
     of all device types mentioned in the OpenACC standard.
See also acc_get_property.f90. */
-/* { dg-do run { target { { ! { openacc_host_selected } } && { ! { 
openacc_amdgcn_accel_selected } } } } } */
-/* FIXME: This test does not work with the GCN implementation stub yet.  */

(I had wondered why 'host' was disabled here; now I don't need to wonder
any longer.)  ;-)

+/* { dg-do run } */

This one is not actually needed, is the default.  (But no reason to
remove it.)

--- a/libgomp/testsuite/libgomp.oacc-fortran/acc_get_property.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/acc_get_property.f90
@@ -3,8 +3,6 @@
  ! of all device types mentioned in the OpenACC standard.
  !
  ! See also acc_get_property.c
-! { dg-do run { target { { ! { openacc_host_selected } } && { ! { 
openacc_amdgcn_accel_selected } } } } }
-! FIXME: This test does not work with the GCN implementation stub yet.

..., but here, with 'dg-do run' removed, this is no longer doing "torture
testing" (cycle through optimization levels/flags).  (See the rationale
in 'libgomp/testsuite/libgomp.oacc-fortran/fortran.exp'.)

... but that should actually be OK given that we're really only testing
the 'acc_get_property'/'acc_get_property_string' API calls, no other
Fortran extravaganza.

Thanks for the additional review, Thomas.

Andrew

Reply via email to