git: 4ffc5ab03f83 - stable/14 - patch: Support long context lines.

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Sat, 24 Feb 2024 12:15:00 UTC
The branch stable/14 has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=4ffc5ab03f8370dcffb1d0bb968e2152348cc709

commit 4ffc5ab03f8370dcffb1d0bb968e2152348cc709
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2024-02-12 18:26:13 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2024-02-24 12:12:49 +0000

    patch: Support long context lines.
    
    MFC after:      1 week
    Sponsored by:   Klara, Inc.
    Reviewed by:    allanjude
    Differential Revision:  https://reviews.freebsd.org/D43850
    
    (cherry picked from commit 851a9da38f070675c42a6d69c41c47a5d29ee3d0)
---
 usr.bin/patch/patch.c                     |  2 +-
 usr.bin/patch/pch.c                       | 10 +++++-----
 usr.bin/patch/pch.h                       |  2 +-
 usr.bin/patch/tests/unified_patch_test.sh | 19 +++++++++++++++++++
 4 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/usr.bin/patch/patch.c b/usr.bin/patch/patch.c
index ecaf799fe9b6..92ea4973e8f6 100644
--- a/usr.bin/patch/patch.c
+++ b/usr.bin/patch/patch.c
@@ -1083,7 +1083,7 @@ patch_match(LINENUM base, LINENUM offset, LINENUM fuzz)
 	LINENUM		pat_lines = pch_ptrn_lines() - fuzz;
 	const char	*ilineptr;
 	const char	*plineptr;
-	unsigned short	plinelen;
+	size_t		plinelen;
 
 	/* Patch does not match if we don't have any more context to use */
 	if (pline > pat_lines)
diff --git a/usr.bin/patch/pch.c b/usr.bin/patch/pch.c
index d528f06235bf..fb53ff86f9ef 100644
--- a/usr.bin/patch/pch.c
+++ b/usr.bin/patch/pch.c
@@ -55,7 +55,7 @@ static LINENUM	p_max;		/* max allowed value of p_end */
 static LINENUM	p_context = 3;	/* # of context lines */
 static LINENUM	p_input_line = 0;	/* current line # from patch file */
 static char	**p_line = NULL;/* the text of the hunk */
-static unsigned short	*p_len = NULL; /* length of each line */
+static size_t	*p_len = NULL;	/* length of each line */
 static char	*p_char = NULL;	/* +, -, and ! */
 static int	hunkmax = INITHUNKMAX;	/* size of above arrays to begin with */
 static int	p_indent;	/* indent to patch */
@@ -137,7 +137,7 @@ set_hunkmax(void)
 	if (p_line == NULL)
 		p_line = malloc(hunkmax * sizeof(char *));
 	if (p_len == NULL)
-		p_len = malloc(hunkmax * sizeof(unsigned short));
+		p_len = malloc(hunkmax * sizeof(size_t));
 	if (p_char == NULL)
 		p_char = malloc(hunkmax * sizeof(char));
 }
@@ -154,7 +154,7 @@ grow_hunkmax(void)
 		fatal("Internal memory allocation error\n");
 
 	p_line = reallocf(p_line, new_hunkmax * sizeof(char *));
-	p_len = reallocf(p_len, new_hunkmax * sizeof(unsigned short));
+	p_len = reallocf(p_len, new_hunkmax * sizeof(size_t));
 	p_char = reallocf(p_char, new_hunkmax * sizeof(char));
 
 	if (p_line != NULL && p_len != NULL && p_char != NULL) {
@@ -1251,7 +1251,7 @@ bool
 pch_swap(void)
 {
 	char	**tp_line;	/* the text of the hunk */
-	unsigned short	*tp_len;/* length of each line */
+	size_t	*tp_len;	/* length of each line */
 	char	*tp_char;	/* +, -, and ! */
 	LINENUM	i;
 	LINENUM	n;
@@ -1408,7 +1408,7 @@ pch_context(void)
 /*
  * Return the length of a particular patch line.
  */
-unsigned short
+size_t
 pch_line_len(LINENUM line)
 {
 	return p_len[line];
diff --git a/usr.bin/patch/pch.h b/usr.bin/patch/pch.h
index 5ce4f72497c7..b6c6363155a5 100644
--- a/usr.bin/patch/pch.h
+++ b/usr.bin/patch/pch.h
@@ -45,7 +45,7 @@ bool		there_is_another_patch(void);
 bool		another_hunk(void);
 bool		pch_swap(void);
 char		*pfetch(LINENUM);
-unsigned short	pch_line_len(LINENUM);
+size_t		pch_line_len(LINENUM);
 LINENUM		pch_first(void);
 LINENUM		pch_ptrn_lines(void);
 LINENUM		pch_newfirst(void);
diff --git a/usr.bin/patch/tests/unified_patch_test.sh b/usr.bin/patch/tests/unified_patch_test.sh
index 43b0d8373cfa..7d4b74182c41 100755
--- a/usr.bin/patch/tests/unified_patch_test.sh
+++ b/usr.bin/patch/tests/unified_patch_test.sh
@@ -141,6 +141,24 @@ file_removal_body()
 	atf_check -o inline:"y\n" cat foo
 }
 
+atf_test_case plinelen
+plinelen_body()
+{
+	hello="$(jot -b hello -s, 20000 | tee foo.txt)"
+	cp foo.txt bar.txt
+	echo "world" >>bar.txt
+	cat >foo.diff <<EOF
+--- foo.txt.orig
++++ foo.txt
+@@ -1,1 +1,2 @@
+ $hello
++world
+EOF
+	atf_check -o match:"Hunk #1 succeeded" \
+		  patch <foo.diff
+	atf_check -o file:bar.txt cat foo.txt
+}
+
 atf_init_test_cases()
 {
 	atf_add_test_case basic
@@ -148,4 +166,5 @@ atf_init_test_cases()
 	atf_add_test_case file_creation
 	atf_add_test_case file_nodupe
 	atf_add_test_case file_removal
+	atf_add_test_case plinelen
 }