exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit fd89c8dc8a27e53191af6c83c3b7e67e2a26a076
parent 887a01dc8c1ac7200413e2999a1f98c285284ecd
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sun, 12 Jul 2026 21:45:37 +0200

VLA-alloc after size check

Diffstat:
Msrc/util/secmod_cs.c | 41++++++++++++++++++++++-------------------
Msrc/util/secmod_rsa.c | 45++++++++++++++++++++++++---------------------
2 files changed, 46 insertions(+), 40 deletions(-)

diff --git a/src/util/secmod_cs.c b/src/util/secmod_cs.c @@ -919,7 +919,6 @@ handle_batch_sign_request (struct TES_Client *client, uint16_t size = ntohs (bsr->header.size) - sizeof (*bsr); const void *off = (const void *) &bsr[1]; unsigned int idx = 0; - struct BatchJob jobs[GNUNET_NZL (bs)]; bool failure = false; GNUNET_log (GNUNET_ERROR_TYPE_INFO, @@ -930,29 +929,33 @@ handle_batch_sign_request (struct TES_Client *client, GNUNET_break_op (0); return GNUNET_SYSERR; } - while ( (idx < bs) && - (size >= sizeof (struct TALER_CRYPTO_CsSignRequestMessage)) ) { - const struct TALER_CRYPTO_CsSignRequestMessage *sr = off; - uint16_t s = ntohs (sr->header.size); + struct BatchJob jobs[GNUNET_NZL (bs)]; - if (s != sizeof (*sr)) + while ( (idx < bs) && + (size >= sizeof (struct TALER_CRYPTO_CsSignRequestMessage)) ) { - failure = true; - bs = idx; - break; + const struct TALER_CRYPTO_CsSignRequestMessage *sr = off; + uint16_t s = ntohs (sr->header.size); + + if (s != sizeof (*sr)) + { + failure = true; + bs = idx; + break; + } + start_sign_job (sr, + &jobs[idx++]); + off += s; + size -= s; } - start_sign_job (sr, - &jobs[idx++]); - off += s; - size -= s; + GNUNET_break_op (0 == size); + bs = GNUNET_MIN (bs, + idx); + for (unsigned int i = 0; i<bs; i++) + finish_job (client, + &jobs[i]); } - GNUNET_break_op (0 == size); - bs = GNUNET_MIN (bs, - idx); - for (unsigned int i = 0; i<bs; i++) - finish_job (client, - &jobs[i]); if (failure) { struct TALER_CRYPTO_SignFailure sf = { diff --git a/src/util/secmod_rsa.c b/src/util/secmod_rsa.c @@ -748,7 +748,6 @@ handle_batch_sign_request (struct TES_Client *client, uint16_t size = ntohs (bsr->header.size) - sizeof (*bsr); const void *off = (const void *) &bsr[1]; unsigned int idx = 0; - struct BatchJob jobs[bs]; bool failure = false; if (bs > TALER_MAX_COINS) @@ -756,30 +755,34 @@ handle_batch_sign_request (struct TES_Client *client, GNUNET_break_op (0); return GNUNET_SYSERR; } - while ( (idx < bs) && - (size > sizeof (struct TALER_CRYPTO_SignRequest)) ) { - const struct TALER_CRYPTO_SignRequest *sr = off; - uint16_t s = ntohs (sr->header.size); + struct BatchJob jobs[bs]; - if ( (s > size) || - (s < sizeof (*sr)) ) + while ( (idx < bs) && + (size > sizeof (struct TALER_CRYPTO_SignRequest)) ) { - failure = true; - bs = idx; - break; + const struct TALER_CRYPTO_SignRequest *sr = off; + uint16_t s = ntohs (sr->header.size); + + if ( (s > size) || + (s < sizeof (*sr)) ) + { + failure = true; + bs = idx; + break; + } + start_job (sr, + &jobs[idx++]); + off += s; + size -= s; } - start_job (sr, - &jobs[idx++]); - off += s; - size -= s; - } - GNUNET_break_op (0 == size); - bs = GNUNET_MIN (bs, - idx); - for (unsigned int i = 0; i<bs; i++) - finish_job (client, - &jobs[i]); + GNUNET_break_op (0 == size); + bs = GNUNET_MIN (bs, + idx); + for (unsigned int i = 0; i<bs; i++) + finish_job (client, + &jobs[i]); + } if (failure) { struct TALER_CRYPTO_SignFailure sf = {