Re: Bug#1143030: netkit-ntalk: FTBFS on hurd-amd64: PATH_MAX and MAXHOSTNAMELEN undeclared
Chris Hofstaedtler <[email protected]> Fri, 31 Jul 2026 20:10:53 +0200
| Newsgroups | gmane.linux.debian.devel.general,gmane.linux.debian.ports.hurd |
|---|---|
| Message-ID | <[email protected]> |
Hi, I guess thanks for fixing Hurd portability bugs. Ideally these fixes would go upstream instead of just into Debian. * Federico Bonino <[email protected]> [260729 22:35]: >netkit-ntalk fails to build from source on hurd-amd64 because two macros >the source relies on are not defined by the Hurd libc headers: >Buildd log (hurd-amd64, 0.17-20): >https://buildd.debian.org/status/fetch.php?pkg=netkit-ntalk&arch=hurd-amd64&ver=0.17-20&stamp=1783711377&raw=1 > > talk/get_names.c:55:23: error: 'MAXHOSTNAMELEN' undeclared (first use in >this function) > 55 | char hostname[MAXHOSTNAMELEN]; > >The build stops there. One file later, talkd/process.c:122 declares >find_user()'s scratch buffer as "char besttty[PATH_MAX]", which does not >compile on Hurd either. > >Root cause: GNU/Hurd has no fixed path limit, so PATH_MAX is not defined. >MAXHOSTNAMELEN is a BSD constant that is also absent on Hurd. > >The patch below replaces the PATH_MAX-sized temporary buffer in >talkd/process.c with dynamic allocation. It also supplies MAXHOSTNAMELEN >from HOST_NAME_MAX, or from _POSIX_HOST_NAME_MAX when HOST_NAME_MAX is >unavailable. No feature or test is disabled. > >I verified the patch on native GNU/Hurd amd64 running Debian unstable. The >unmodified 0.17-20 source reproduced the MAXHOSTNAMELEN build failure. The >patch then applied with zero fuzz and zero offset, and dpkg-buildpackage >completed successfully, producing talk and talkd. The package defines no >autopkgtest or upstream test suite. > >One thing to flag rather than let you find it in your own build log: on GCC >15 the new strdup(uptr->ut_line) call raises > > warning: 'strdup' argument 1 declared attribute 'nonstring' >[-Wstringop-overread] > >because ut_line is a fixed-size utmp field with no guaranteed NUL >terminator. >The strcpy() it replaces read ut_line exactly the same way, so this is a >new diagnostic rather than a new unbounded read — but it is new, and it >appears on every architecture. If you would prefer the variant without it, >sizing besttty >as sizeof(uptr->ut_line) + 1 and copying with an explicit terminator >removes the PATH_MAX dependency just as well and is a smaller diff. I am >happy to send that instead; I went with the allocation because it makes no >assumption about the utmp field width. > >Toolchain stamp: >- hurd 1:0.9.git20260527-3+b1 >- libc0.3 2.42-17 >- gcc-15 15.3.0-1 >- binutils 2.46.90.20260712-1 > >netkit-ntalk is maintained by the Debian QA Group and the netkit collection >has no active upstream, so there is nowhere to forward this fix — hence >"Forwarded: no" in the DEP-3 header below, and this report rather than an >upstream submission. > >Assisted-by: hurd-collab agent (automated portability triage and fix) Could you take some time to explain what "hurd-collab agent" is exactly? I could not find anything in a quick web search. Best, Chris >Signed-off-by: Federico Bonino <[email protected]> > >--- netkit-ntalk-hurd.patch --- >Description: Replace PATH_MAX buffer with dynamic allocation and add >MAXHOSTNAMELEN fallback for GNU/Hurd >Source-Version: 0.17-20 >Author: Federico Bonino <[email protected]> >Forwarded: no >Last-Update: 2026-07-28 > >GNU/Hurd does not define PATH_MAX because it has no fixed path limit. The >besttty buffer in talkd/process.c was only used as a temporary scratch area >to hold a utmp tty line before copying it to the caller's output buffer; it >is now dynamically allocated with strdup, removing the fixed-size PATH_MAX >dependency. > >The MAXHOSTNAMELEN buffer in talk/get_names.c is used for gethostname and >the legacy talk wire protocol uses fixed-size fields, so a bounded hostname >buffer remains appropriate. Since Hurd does not provide MAXHOSTNAMELEN, >provide a conditional fallback to HOST_NAME_MAX (or _POSIX_HOST_NAME_MAX) >from ><limits.h>, preserving the existing behaviour on BSD/Linux platforms. > >--- a/talkd/process.c >+++ b/talkd/process.c >@@ -55,6 +55,7 @@ char rcsid[] = > #include <syslog.h> > #include <stdio.h> > #include <string.h> >+#include <stdlib.h> > /* #include <paths.h> <---- unused? */ > #include <utmp.h> > #include "prot_talkd.h" >@@ -119,9 +120,12 @@ find_user(const char *name, char *tty) > struct utmp *uptr; > int found=0, ok=0, ret; > time_t best_time = 0, this_time; >- char besttty[PATH_MAX]; >+ char *besttty; > >- *besttty = 0; >+ besttty = strdup(""); >+ if (besttty == NULL) { >+ return FAILED; >+ } > setutent(); > while ((uptr = getutent())!=NULL) { > #ifdef USER_PROCESS >@@ -135,6 +139,7 @@ find_user(const char *name, char *tty) > if (*tty && !strcmp(tty, uptr->ut_line)) { > /* asked for a tty, found it */ > endutent(); >+ free(besttty); > return SUCCESS; > } > ret = check_tty_perms(uptr->ut_line, &this_time); >@@ -145,11 +150,17 @@ find_user(const char *name, char *tty) > found = ok = 1; > if (this_time > best_time) { > best_time = this_time; >- strcpy(besttty, uptr->ut_line); >+ free(besttty); >+ besttty = strdup(uptr->ut_line); >+ if (besttty == NULL) { >+ endutent(); >+ return FAILED; >+ } > } > } > endutent(); > strcpy(tty, besttty); >+ free(besttty); > return !found ? NOT_HERE : (!ok ? PERMISSION_DENIED : SUCCESS); > } > >--- a/talk/get_names.c >+++ b/talk/get_names.c >@@ -39,6 +39,14 @@ char gn_rcsid[] = > > #include <stdio.h> > #include <sys/param.h> >+#include <limits.h> >+#ifndef MAXHOSTNAMELEN >+#ifdef HOST_NAME_MAX >+#define MAXHOSTNAMELEN HOST_NAME_MAX >+#else >+#define MAXHOSTNAMELEN _POSIX_HOST_NAME_MAX >+#endif >+#endif > #include <sys/socket.h> > #include <pwd.h> > #include <unistd.h>