Mercurial > pub > dyncall > dyncall
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 */ } } }