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

Re: PATH_MAX and LOGIN_NAME_MAX are not portable



Control: tags -1 + patch

On Fri, 1 May 2015 15:26:10 +0200 Harald Dunkel <harri@afaics.de> wrote:
Package: mg
Version: 20150323-2

mg fails to build on kfreebsd and hurd due to PATH_MAX and
LOGIN_NAME_MAX. Sample:
[...]
As of today (version 20240709-1), mg still FTBFS on hurd-any.

I had a look, and propose the attached patch. Although it adds a dependency on libgc, I made the patch minimal. Hard-coded buffer length could be removed in more places, but I'm waiting to see if there is interest in using libgc.

With this patch, I can compile the mg package on hurd-amd64 and it seems to work.


Cheers,

--
Stéphane
From 5bea66fa192d94d27900a9e84ffae2a644bbc81f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Glondu?= <steph@glondu.net>
Date: Sat, 9 Aug 2025 15:00:28 +0100
Subject: [PATCH] Fix FTBFS on hurd-any (Closes: #783943)

---
 debian/changelog                              |   8 +
 debian/control                                |   1 +
 ...-not-use-PATH_MAX-and-LOGIN_NAME_MAX.patch | 262 ++++++++++++++++++
 debian/patches/series                         |   1 +
 4 files changed, 272 insertions(+)
 create mode 100644 debian/patches/0001-Do-not-use-PATH_MAX-and-LOGIN_NAME_MAX.patch
 create mode 100644 debian/patches/series

diff --git a/debian/changelog b/debian/changelog
index 93c007e..f2d532a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+mg (20240709-1.1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Fix FTBFS on hurd-any (Closes: #783943)
+    - add dependency on libgc-dev
+
+ -- Stéphane Glondu <glondu@debian.org>  Sat, 09 Aug 2025 14:58:23 +0100
+
 mg (20240709-1) unstable; urgency=medium
 
   [ Harald Dunkel ]
diff --git a/debian/control b/debian/control
index 54bfaa2..6aa2c03 100644
--- a/debian/control
+++ b/debian/control
@@ -7,6 +7,7 @@ Build-Depends: debhelper (>= 13),
                debhelper-compat (= 13),
                libbsd-dev,
                libncurses-dev,
+               libgc-dev,
                pkgconf
 Standards-Version: 4.6.2
 Vcs-Browser: https://salsa.debian.org/debian/mg
diff --git a/debian/patches/0001-Do-not-use-PATH_MAX-and-LOGIN_NAME_MAX.patch b/debian/patches/0001-Do-not-use-PATH_MAX-and-LOGIN_NAME_MAX.patch
new file mode 100644
index 0000000..6b55def
--- /dev/null
+++ b/debian/patches/0001-Do-not-use-PATH_MAX-and-LOGIN_NAME_MAX.patch
@@ -0,0 +1,262 @@
+From: =?utf-8?q?St=C3=A9phane_Glondu?= <steph@glondu.net>
+Date: Sat, 9 Aug 2025 14:16:20 +0100
+Subject: Do not use PATH_MAX and LOGIN_NAME_MAX
+
+This fixes compilation on the Hurd, at the cost of an extra dependency
+to libgc.
+
+Bug-Debian: https://bugs.debian.org/783943
+---
+ GNUmakefile |  2 +-
+ dired.c     | 44 +++++++++++++++++++++++++-------------------
+ fileio.c    | 28 ++++++++++++++++++----------
+ 3 files changed, 44 insertions(+), 30 deletions(-)
+
+diff --git a/GNUmakefile b/GNUmakefile
+index 9afa1b8..d01bc7f 100644
+--- a/GNUmakefile
++++ b/GNUmakefile
+@@ -48,7 +48,7 @@ CFLAGS+=	-g -Wall
+ CPPFLAGS=	-DREGEX
+ CPPFLAGS+=	-D_GNU_SOURCE
+ CPPFLAGS+=	$(BSD_CPPFLAGS)
+-LIBS=		$(CURSES_LIBS) $(BSD_LIBS)
++LIBS=		$(CURSES_LIBS) $(BSD_LIBS) -lgc
+ 
+ 
+ OBJS=	autoexec.o basic.o bell.o buffer.o cinfo.o dir.o display.o \
+diff --git a/dired.c b/dired.c
+index fc16c35..56a1f50 100644
+--- a/dired.c
++++ b/dired.c
+@@ -23,6 +23,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <unistd.h>
++#include <gc.h>
+ 
+ #include "def.h"
+ #include "funmap.h"
+@@ -43,7 +44,7 @@ static int	 d_rename(int, int);
+ static int	 d_exec(int, struct buffer *, const char *, const char *, ...);
+ static int	 d_shell_command(int, int);
+ static int	 d_create_directory(int, int);
+-static int	 d_makename(struct line *, char *, size_t);
++static int	 d_makename(struct line *, char **);
+ static int	 d_warpdot(struct line *, int *);
+ static int	 d_forwpage(int, int);
+ static int	 d_backpage(int, int);
+@@ -354,9 +355,9 @@ d_findfile(int f, int n)
+ {
+ 	struct buffer	*bp;
+ 	int		 s;
+-	char		 fname[NFILEN];
++	char		*fname;
+ 
+-	if ((s = d_makename(curwp->w_dotp, fname, sizeof(fname))) == ABORT)
++	if ((s = d_makename(curwp->w_dotp, &fname)) == ABORT)
+ 		return (FALSE);
+ 	if (s == TRUE)
+ 		bp = dired_(fname);
+@@ -397,12 +398,12 @@ d_updirectory(int f, int n)
+ int
+ d_ffotherwindow(int f, int n)
+ {
+-	char		 fname[NFILEN];
++	char		*fname;
+ 	int		 s;
+ 	struct buffer	*bp;
+ 	struct mgwin	*wp;
+ 
+-	if ((s = d_makename(curwp->w_dotp, fname, sizeof(fname))) == ABORT)
++	if ((s = d_makename(curwp->w_dotp, &fname)) == ABORT)
+ 		return (FALSE);
+ 	if ((bp = (s ? dired_(fname) : findbuffer(fname))) == NULL)
+ 		return (FALSE);
+@@ -419,7 +420,7 @@ int
+ d_expunge(int f, int n)
+ {
+ 	struct line	*lp, *nlp;
+-	char		 fname[NFILEN], sname[NFILEN];
++	char		*fname, sname[NFILEN];
+ 	int		 tmp;
+ 
+ 	tmp = curwp->w_dotline;
+@@ -429,7 +430,7 @@ d_expunge(int f, int n)
+ 		curwp->w_dotline++;
+ 		nlp = lforw(lp);
+ 		if (llength(lp) && lgetc(lp, 0) == 'D') {
+-			switch (d_makename(lp, fname, sizeof(fname))) {
++			switch (d_makename(lp, &fname)) {
+ 			case ABORT:
+ 				dobeep();
+ 				ewprintf("Bad line in dired buffer");
+@@ -475,13 +476,13 @@ int
+ d_copy(int f, int n)
+ {
+ 	struct stat      statbuf;
+-	char		 frname[NFILEN], toname[NFILEN], sname[NFILEN];
++	char		*frname, toname[NFILEN], sname[NFILEN];
+ 	char		*topath, *bufp;
+ 	int		 ret;
+ 	size_t		 off;
+ 	struct buffer	*bp;
+ 
+-	if (d_makename(curwp->w_dotp, frname, sizeof(frname)) != FALSE) {
++	if (d_makename(curwp->w_dotp, &frname) != FALSE) {
+ 		dobeep();
+ 		ewprintf("Not a file");
+ 		return (FALSE);
+@@ -533,14 +534,14 @@ int
+ d_rename(int f, int n)
+ {
+ 	struct stat      statbuf;
+-	char		 frname[NFILEN], toname[NFILEN];
++	char		*frname, toname[NFILEN];
+ 	char		*topath, *bufp;
+ 	int		 ret;
+ 	size_t		 off;
+ 	struct buffer	*bp;
+ 	char		 sname[NFILEN];
+ 
+-	if (d_makename(curwp->w_dotp, frname, sizeof(frname)) != FALSE) {
++	if (d_makename(curwp->w_dotp, &frname) != FALSE) {
+ 		dobeep();
+ 		ewprintf("Not a file");
+ 		return (FALSE);
+@@ -604,7 +605,7 @@ reaper(int signo __attribute__((unused)))
+ int
+ d_shell_command(int f, int n)
+ {
+-	char		 command[512], fname[PATH_MAX], *bufp;
++	char		 command[512], *fname, *bufp;
+ 	struct buffer	*bp;
+ 	struct mgwin	*wp;
+ 	char		 sname[NFILEN];
+@@ -613,7 +614,7 @@ d_shell_command(int f, int n)
+ 	if (bclear(bp) != TRUE)
+ 		return (ABORT);
+ 
+-	if (d_makename(curwp->w_dotp, fname, sizeof(fname)) != FALSE) {
++	if (d_makename(curwp->w_dotp, &fname) != FALSE) {
+ 		dobeep();
+ 		ewprintf("bad line");
+ 		return (ABORT);
+@@ -836,19 +837,24 @@ refreshbuffer(struct buffer *bp)
+ }
+ 
+ static int
+-d_makename(struct line *lp, char *fn, size_t len)
++d_makename(struct line *lp, char **fn)
+ {
+ 	int	 start, nlen, ret;
+-	char	*namep;
++	char	*namep, *tmp;
+ 
+ 	if (d_warpdot(lp, &start) == FALSE)
+ 		return (ABORT);
+ 	namep = &lp->l_text[start];
+ 	nlen = llength(lp) - start;
+ 
+-	ret = snprintf(fn, len, "%s%.*s", curbp->b_fname, nlen, namep);
+-	if (ret < 0 || ret >= (int)len)
++	ret = asprintf(&tmp, "%s%.*s", curbp->b_fname, nlen, namep);
++	if (ret < 0)
+ 		return (ABORT); /* Name is too long. */
++	if ((*fn = GC_MALLOC(ret + 1)) != NULL)
++		memcpy(*fn, tmp, ret + 1);
++	free(tmp);
++	if (*fn == NULL)
++		return (ABORT);
+ 
+ 	/* Return TRUE if the entry is a directory. */
+ 	return ((lgetc(lp, 2) == 'd') ? TRUE : FALSE);
+@@ -914,9 +920,9 @@ d_backline (int f, int n)
+ int
+ d_filevisitalt (int f, int n)
+ {
+-	char	 fname[NFILEN];
++	char	*fname;
+ 
+-	if (d_makename(curwp->w_dotp, fname, sizeof(fname)) == ABORT)
++	if (d_makename(curwp->w_dotp, &fname) == ABORT)
+ 		return (FALSE);
+ 
+ 	return(do_filevisitalt(fname));
+diff --git a/fileio.c b/fileio.c
+index 1184ac8..3486fea 100644
+--- a/fileio.c
++++ b/fileio.c
+@@ -22,6 +22,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <unistd.h>
++#include <gc.h>
+ 
+ #include "def.h"
+ #include "kbd.h"
+@@ -303,9 +304,9 @@ fbackupfile(const char *fn)
+ char *
+ adjustname(const char *fn, int slashslash)
+ {
+-	static char	 fnb[PATH_MAX];
+ 	const char	*cp, *ep = NULL;
+ 	char		*path;
++	char		*fnb, *result;
+ 
+ 	if (slashslash == TRUE) {
+ 		cp = fn + strlen(fn) - 1;
+@@ -323,11 +324,19 @@ adjustname(const char *fn, int slashslash)
+ 	if ((path = expandtilde(fn)) == NULL)
+ 		return (NULL);
+ 
+-	if (realpath(path, fnb) == NULL)
+-		(void)strlcpy(fnb, path, sizeof(fnb));
++	if ((fnb = realpath(path, NULL)) == NULL) {
++		int len = strlen(path) + 1;
++		if ((result = GC_MALLOC(len)) != NULL)
++			(void)strlcpy(result, path, len);
++	} else {
++		int len = strlen(fnb) + 1;
++		if ((result = GC_MALLOC(len)) != NULL)
++			(void)strlcpy(result, fnb, len);
++		free(fnb);
++	}
+ 
+ 	free(path);
+-	return (fnb);
++	return (result);
+ }
+ 
+ /*
+@@ -713,7 +722,7 @@ expandtilde(const char *fn)
+ 	struct passwd	*pw;
+ 	struct stat	 statbuf;
+ 	const char	*cp;
+-	char		 user[LOGIN_NAME_MAX], path[NFILEN];
++	char		 path[NFILEN];
+ 	char		*ret;
+ 	size_t		 ulen, plen;
+ 
+@@ -728,17 +737,16 @@ expandtilde(const char *fn)
+ 	if (cp == NULL)
+ 		cp = fn + strlen(fn); /* point to the NUL byte */
+ 	ulen = cp - &fn[1];
+-	if (ulen >= sizeof(user)) {
+-		if ((ret = strndup(fn, NFILEN)) == NULL)
+-			return (NULL);
+-		return(ret);
+-	}
+ 	if (ulen == 0) /* ~/ or ~ */
+ 		pw = getpwuid(geteuid());
+ 	else { /* ~user/ or ~user */
++		char *user;
++		if ((user = malloc(ulen + 1)) == NULL)
++			return (NULL);
+ 		memcpy(user, &fn[1], ulen);
+ 		user[ulen] = '\0';
+ 		pw = getpwnam(user);
++		free(user);
+ 	}
+ 	if (pw != NULL) {
+ 		plen = strlcpy(path, pw->pw_dir, sizeof(path));
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..23f6ad2
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+0001-Do-not-use-PATH_MAX-and-LOGIN_NAME_MAX.patch
-- 
2.47.2


Reply to: