patch(1) max line length

Emmanuel Dreyfus <[email protected]>
Newsgroups gmane.os.netbsd.devel.userlevel
Message-ID <[email protected]>
Hello

I just encoutered a patch(1) limitation when using it on minified json 
files from Wordpress. The lines can span more than the maximum of what
patch(1) can cope, which is INT16_MAX. Here is a test for taht:

jot -b A $(( 37268 / 2 )) |tr '\n' 'A' > g.txt
mv g.txt g.txt.orig
sed 's/A/B/' g.txt.orig > g.txt
diff -U4 g.txt.orig  g.txt > g.patch
mv g.txt.orig g.txt
patch < g.patch

Currently it dumps a core. 

patch(1) tracks line length using a short, hence the INT16_MAX limit.
Changing short for long seems reasonable. Anyone sees something wrong
with this change?

--- patch.c.orig	2024-07-12 03:06:47.101773258 +0200
+++ patch.c	2024-07-12 03:07:58.394948697 +0200
@@ -1015,5 +1015,5 @@
 	const char	*ilineptr;
 	const char	*plineptr;
-	short		plinelen;
+	long		plinelen;
 
 	for (iline = base + offset + fuzz; pline <= pat_lines; pline++, iline++) {
--- pch.c.orig	2024-07-12 03:06:26.498848676 +0200
+++ pch.c	2024-07-12 03:07:54.115023483 +0200
@@ -62,5 +62,5 @@
 static LINENUM	p_input_line = 0;	/* current line # from patch file */
 static char	**p_line = NULL;/* the text of the hunk */
-static short	*p_len = NULL;	/* length of each line */
+static long	*p_len = NULL;	/* length of each line */
 static char	*p_char = NULL;	/* +, -, and ! */
 static int	hunkmax = INITHUNKMAX;	/* size of above arrays to begin with */
@@ -149,5 +149,5 @@
 	int		new_hunkmax;
 	char		**new_p_line;
-	short		*new_p_len;
+	long		*new_p_len;
 	char		*new_p_char;
 
@@ -1208,5 +1208,5 @@
 {
 	char	**tp_line;	/* the text of the hunk */
-	short	*tp_len;	/* length of each line */
+	long	*tp_len;	/* length of each line */
 	char	*tp_char;	/* +, -, and ! */
 	LINENUM	i;
@@ -1365,5 +1365,5 @@
  * Return the length of a particular patch line.
  */
-short
+long
 pch_line_len(LINENUM line)
 {
--- pch.h.orig	2024-07-12 03:06:34.298099780 +0200
+++ pch.h	2024-07-12 03:07:19.155488620 +0200
@@ -48,5 +48,5 @@
 bool		pch_swap(void);
 char		*pfetch(LINENUM);
-short		pch_line_len(LINENUM);
+long		pch_line_len(LINENUM);
 LINENUM		pch_first(void);
 LINENUM		pch_ptrn_lines(void);





-- 
Emmanuel Dreyfus
[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.