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:
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) */
}