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:
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 = {