commit 97cec69dfeda6d94e29897a1f329120fa0b2498c
parent 320ab53cf14adf87456c56f3a15fd17b4ff9d6e6
Author: Christian Grothoff <christian@grothoff.org>
Date: Mon, 15 Dec 2025 21:33:11 +0100
fix attachment dumping logic
Diffstat:
1 file changed, 47 insertions(+), 8 deletions(-)
diff --git a/src/mhd/mhd_typst.c b/src/mhd/mhd_typst.c
@@ -184,6 +184,7 @@ inline_pdf_stage (struct TypstStage *stage,
char *fn;
size_t n;
void *b;
+ int fd;
if (NULL == str)
{
@@ -200,7 +201,7 @@ inline_pdf_stage (struct TypstStage *stage,
return false;
}
GNUNET_asprintf (&fn,
- "%s/external-XXXXXX",
+ "%s/external-",
tmpdir);
stage->filename = GNUNET_DISK_mktemp (fn);
if (NULL == stage->filename)
@@ -211,18 +212,43 @@ inline_pdf_stage (struct TypstStage *stage,
return false;
}
GNUNET_free (fn);
-
- if (n !=
- GNUNET_DISK_fn_write (stage->filename,
- b,
- n,
- GNUNET_DISK_PERM_USER_READ
- | GNUNET_DISK_PERM_USER_WRITE))
+ fd = open (stage->filename,
+ O_WRONLY | O_TRUNC,
+ S_IRUSR | S_IWUSR);
+ if (-1 == fd)
{
+ GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
+ "open",
+ stage->filename);
GNUNET_free (b);
GNUNET_free (stage->filename);
return false;
}
+
+ {
+ size_t off = 0;
+
+ while (off < n)
+ {
+ ssize_t r;
+
+ r = write (fd,
+ b + off,
+ n - off);
+ if (-1 == r)
+ {
+ GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
+ "write",
+ stage->filename);
+ GNUNET_break (0 == close (fd));
+ GNUNET_free (b);
+ GNUNET_free (stage->filename);
+ return false;
+ }
+ off += r;
+ }
+ }
+ GNUNET_break (0 == close (fd));
return true;
}
@@ -464,11 +490,19 @@ setup_stage (struct TypstStage *stage,
if (NULL == doc->form_name)
{
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Stage %u: Dumping inlined PDF attachment\n",
+ i);
return inline_pdf_stage (stage,
tmpdir,
doc->data);
}
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Stage %u: Handling form %s\n",
+ i,
+ doc->form_name);
+
/* Setup inputs */
{
char *dirname;
@@ -641,6 +675,8 @@ TALER_MHD_typst (
once = GNUNET_OK;
break;
case GNUNET_SYSERR:
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "PDF generation initialization failed before, not even trying again\n");
return NULL;
}
tc = GNUNET_new (struct TALER_MHD_TypstContext);
@@ -691,6 +727,9 @@ TALER_MHD_typst (
{
char err[128];
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Typst setup failed on stage %u\n",
+ i);
GNUNET_snprintf (err,
sizeof (err),
"Typst setup failed on stage %u",