summaryrefslogtreecommitdiff
path: root/backport-paramhlp-fix-CRLF-stripping-files-with-d-file.patch
diff options
context:
space:
mode:
Diffstat (limited to 'backport-paramhlp-fix-CRLF-stripping-files-with-d-file.patch')
-rw-r--r--backport-paramhlp-fix-CRLF-stripping-files-with-d-file.patch100
1 files changed, 100 insertions, 0 deletions
diff --git a/backport-paramhlp-fix-CRLF-stripping-files-with-d-file.patch b/backport-paramhlp-fix-CRLF-stripping-files-with-d-file.patch
new file mode 100644
index 0000000..2e2bd23
--- /dev/null
+++ b/backport-paramhlp-fix-CRLF-stripping-files-with-d-file.patch
@@ -0,0 +1,100 @@
+From 923f7f8ce51b7f2f20282883cdafeb283310f3d9 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg <daniel@haxx.se>
+Date: Wed, 6 Mar 2024 15:39:09 +0100
+Subject: [PATCH] paramhlp: fix CRLF-stripping files with "-d @file"
+
+All CR and LF bytes should be stripped, as documented, and all other
+bytes are inluded in the data. Starting now, it also excludes null bytes
+as they would otherwise also cut the data short.
+
+Reported-by: Simon K
+Fixes #13063
+Closes #13064
+
+Conflict:remove change of docs/cmdline-opts/data.md which is not exist
+Reference:https://github.com/curl/curl/commit/923f7f8ce51b7f2f20282883cdafeb283310f3d9
+---
+ src/tool_paramhlp.c | 63 +++++++++++++++++++++++++++++++--------
+ 1 files changed, 51 insertions(+), 12 deletions(-)
+
+diff --git a/src/tool_paramhlp.c b/src/tool_paramhlp.c
+index 2725815000dc95..c26f6bbefd775c 100644
+--- a/src/tool_paramhlp.c
++++ b/src/tool_paramhlp.c
+@@ -63,6 +63,33 @@ struct getout *new_getout(struct OperationConfig *config)
+ return node;
+ }
+
++#define ISCRLF(x) (((x) == '\r') || ((x) == '\n') || ((x) == '\0'))
++
++/* memcrlf() has two modes. Both operate on a given memory area with
++ a specified size.
++
++ countcrlf FALSE - return number of bytes from the start that DO NOT include
++ any CR or LF or NULL
++
++ countcrlf TRUE - return number of bytes from the start that are ONLY CR or
++ LF or NULL.
++
++*/
++static size_t memcrlf(char *orig,
++ bool countcrlf, /* TRUE if we count CRLF, FALSE
++ if we count non-CRLF */
++ size_t max)
++{
++ char *ptr = orig;
++ size_t total = max;
++ for(ptr = orig; max; max--, ptr++) {
++ bool crlf = ISCRLF(*ptr);
++ if(countcrlf ^ crlf)
++ return ptr - orig;
++ }
++ return total; /* no delimiter found */
++}
++
+ #define MAX_FILE2STRING (256*1024*1024) /* big enough ? */
+
+ ParameterError file2string(char **bufp, FILE *file)
+@@ -71,18 +98,30 @@ ParameterError file2string(char **bufp, FILE *file)
+ DEBUGASSERT(MAX_FILE2STRING < INT_MAX); /* needs to fit in an int later */
+ curlx_dyn_init(&dyn, MAX_FILE2STRING);
+ if(file) {
+- char buffer[256];
+-
+- while(fgets(buffer, sizeof(buffer), file)) {
+- char *ptr = strchr(buffer, '\r');
+- if(ptr)
+- *ptr = '\0';
+- ptr = strchr(buffer, '\n');
+- if(ptr)
+- *ptr = '\0';
+- if(curlx_dyn_add(&dyn, buffer))
+- return PARAM_NO_MEM;
+- }
++ do {
++ char buffer[4096];
++ char *ptr;
++ size_t nread = fread(buffer, 1, sizeof(buffer), file);
++ if(ferror(file)) {
++ curlx_dyn_free(&dyn);
++ *bufp = NULL;
++ return PARAM_READ_ERROR;
++ }
++ ptr = buffer;
++ while(nread) {
++ size_t nlen = memcrlf(ptr, FALSE, nread);
++ if(curlx_dyn_addn(&dyn, ptr, nlen))
++ return PARAM_NO_MEM;
++ nread -= nlen;
++
++ if(nread) {
++ ptr += nlen;
++ nlen = memcrlf(ptr, TRUE, nread);
++ ptr += nlen;
++ nread -= nlen;
++ }
++ }
++ } while(!feof(file));
+ }
+ *bufp = curlx_dyn_ptr(&dyn);
+ return PARAM_OK;