comparison 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
comparison
equal deleted inserted replaced
550:5e1002095afa 551:eef302b7a58d
104 } 104 }
105 else 105 else
106 { 106 {
107 for(i=0; ag->sysv_classes[i] && i<DC_SYSV_MAX_NUM_CLASSES; ++i) 107 for(i=0; ag->sysv_classes[i] && i<DC_SYSV_MAX_NUM_CLASSES; ++i)
108 { 108 {
109 size_t s = ag->size - i*8;
110 s = s<8?s:8;
111
109 switch (ag->sysv_classes[i]) 112 switch (ag->sysv_classes[i])
110 { 113 {
111 case SYSVC_INTEGER: 114 case SYSVC_INTEGER:
112 switch (ag->size - i*8) { 115 {
113 case 1: *(DCchar *)(((DClonglong*)target) + i) = dcbArgChar (p); break; 116 DClonglong l = dcbArgLongLong(p);
114 case 2: *(DCshort*)(((DClonglong*)target) + i) = dcbArgShort (p); break; 117 memcpy((DClonglong*)target + i, &l, s);
115 case 4: *(DCint *)(((DClonglong*)target) + i) = dcbArgInt (p); break;
116 default: * (((DClonglong*)target) + i) = dcbArgLongLong(p); break;
117 } 118 }
118 break; 119 break;
119 120
120 case SYSVC_SSE: 121 case SYSVC_SSE:
121 switch (ag->size - i*8) { 122 if(s == 8)
122 case 4: *(DCfloat*)(((DCdouble*)target) + i) = dcbArgFloat (p); break; 123 *(((DCdouble*)target) + i) = dcbArgDouble(p);
123 default: * (((DCdouble*)target) + i) = dcbArgDouble(p); break; 124 else if(s == 4)
124 } 125 *(DCfloat*)(((DCdouble*)target) + i) = dcbArgFloat (p);
126 else
127 assert(DC_FALSE && "SYSV aggregate floating point slot mismatch (unexpected size of fp field)");
125 break; 128 break;
129
126 /* @@@AGGR implement when implementing x87 types */ 130 /* @@@AGGR implement when implementing x87 types */
127 default: 131 default:
128 assert(DC_FALSE && "Should never be reached because we check for unupported classes earlier"); 132 assert(DC_FALSE && "unsupported SYSV aggregate slot classification"); /* shouldn't be reached, as we check for unupported classes earlier */
129 } 133 }
130 } 134 }
131 } 135 }
132 136
133 return target; 137 return target;