tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

patch(1) max line length



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
manu%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index