exchange

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

commit 4ea88f9072e429b9c653b92c4196a6d899129a2b
parent 2e8f7f109a76cae7edae85f4d58851a6e9dbbbb7
Author: Christian Grothoff <christian@grothoff.org>
Date:   Mon, 12 Oct 2026 23:55:26 +0200

fix continuation when handling errors from helper

Diffstat:
Msrc/kyclogic/kyclogic_sanctions.c | 31+++++++++++++++++--------------
1 file changed, 17 insertions(+), 14 deletions(-)

diff --git a/src/kyclogic/kyclogic_sanctions.c b/src/kyclogic/kyclogic_sanctions.c @@ -312,8 +312,7 @@ read_cb (void *cls) { /* Helper returned more than 40 MB of data! Stop reading! */ GNUNET_break (0); - GNUNET_break (GNUNET_OK == - GNUNET_DISK_file_close (sr->chld_stdin)); + fail_hard (sr); return; } tmp = GNUNET_malloc_large (ns); @@ -322,8 +321,7 @@ read_cb (void *cls) /* out of memory, also stop reading */ GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "malloc"); - GNUNET_break (GNUNET_OK == - GNUNET_DISK_file_close (sr->chld_stdin)); + fail_hard (sr); return; } GNUNET_memcpy (tmp, @@ -344,6 +342,7 @@ read_cb (void *cls) { GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "read"); + fail_hard (sr); return; } /* Continue later */ @@ -358,7 +357,10 @@ read_cb (void *cls) GNUNET_assert (sr->read_size >= sr->read_pos + ret); sr->read_pos += ret; if (! process_buffer (sr)) + { + fail_hard (sr); return; + } } sr->read_task = GNUNET_SCHEDULER_add_read_file ( @@ -388,6 +390,8 @@ write_cb (void *cls) ee = ee->prev; while (NULL != ee) { + bool retry = false; + while (ee->write_size > ee->write_pos) { ret = GNUNET_DISK_file_write (sr->chld_stdin, @@ -396,6 +400,7 @@ write_cb (void *cls) if (ret < 0) { if ( (EAGAIN != errno) && + (EWOULDBLOCK != errno) && (EINTR != errno) ) { GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, @@ -404,20 +409,21 @@ write_cb (void *cls) fail_hard (sr); return; } + /* continue later */ + retry = true; break; } if (0 == ret) { + /* should be impossible on a pipe */ GNUNET_break (0); - break; + fail_hard (sr); + return; } GNUNET_assert (ee->write_size >= ee->write_pos + ret); ee->write_pos += ret; } - if ( (ee->write_size > ee->write_pos) && - ( (EAGAIN == errno) || - (EWOULDBLOCK == errno) || - (EINTR == errno) ) ) + if (retry) { sr->write_task = GNUNET_SCHEDULER_add_write_file ( @@ -427,11 +433,8 @@ write_cb (void *cls) sr); return; } - if (ee->write_size == ee->write_pos) - { - GNUNET_free (ee->write_buf); - ee = ee->prev; - } + GNUNET_free (ee->write_buf); + ee = ee->prev; } /* while (NULL != ee) */ }