diff dyncallback/dyncall_args_x64.c @ 551:eef302b7a58d

- amendment fix for buffer overflow (see commit 0455834d29a1), to also handle non-standard struct packing, + better asserts - changelog wording tweaks for clarity - comment tweaks for clarity - (mostly pointless) microoptimization in aggr alignment calculation, avoiding a modulo, as alignment always a power of 2 - cleanups
author Tassilo Philipp
date Mon, 20 Jun 2022 14:57:49 +0200
parents 0455834d29a1
children 4d87bd4890b0
line wrap: on
line diff
--- a/dyncallback/dyncall_args_x64.c	Mon Jun 20 14:24:37 2022 +0200
+++ b/dyncallback/dyncall_args_x64.c	Mon Jun 20 14:57:49 2022 +0200
@@ -106,26 +106,30 @@
   {
     for(i=0; ag->sysv_classes[i] && i<DC_SYSV_MAX_NUM_CLASSES; ++i)
     {
+      size_t s = ag->size - i*8;
+      s = s<8?s:8;
+
       switch (ag->sysv_classes[i])
       {
         case SYSVC_INTEGER:
-          switch (ag->size - i*8) {
-            case 1:  *(DCchar *)(((DClonglong*)target) + i) = dcbArgChar    (p); break;
-            case 2:  *(DCshort*)(((DClonglong*)target) + i) = dcbArgShort   (p); break;
-            case 4:  *(DCint  *)(((DClonglong*)target) + i) = dcbArgInt     (p); break;
-            default: *          (((DClonglong*)target) + i) = dcbArgLongLong(p); break;
+          {
+            DClonglong l = dcbArgLongLong(p);
+            memcpy((DClonglong*)target + i, &l, s);
           }
           break;
 
         case SYSVC_SSE:
-          switch (ag->size - i*8) {
-            case 4:  *(DCfloat*)(((DCdouble*)target) + i) = dcbArgFloat (p); break;
-            default: *          (((DCdouble*)target) + i) = dcbArgDouble(p); break;
-          }
+          if(s == 8)
+            *(((DCdouble*)target) + i) = dcbArgDouble(p);
+          else if(s == 4)
+            *(DCfloat*)(((DCdouble*)target) + i) = dcbArgFloat (p);
+          else
+            assert(DC_FALSE && "SYSV aggregate floating point slot mismatch (unexpected size of fp field)");
           break;
+
         /* @@@AGGR implement when implementing x87 types */
         default:
-            assert(DC_FALSE && "Should never be reached because we check for unupported classes earlier");
+            assert(DC_FALSE && "unsupported SYSV aggregate slot classification"); /* shouldn't be reached, as we check for unupported classes earlier */
       }
     }
   }