~ruther/guix-local

73049ba95145231981a67d9d78252a0a007c5c2a — Tomas Volf 1 year, 2 months ago 24257c4
gnu: procmail: Fix build with gcc-14.

* gnu/packages/patches/procmail-gcc-14.patch: New patch.
* gnu/packages/mail.scm (procmail)[source]: Use it.
* gnu/local.mk (dist_patch_DATA): Register it.

Fixes: guix/guix#1671
Change-Id: I41b3e1d73d319a19efa15ac75cefd326eedd58b1
Signed-off-by: Andreas Enge <andreas@enge.fr>
3 files changed, 271 insertions(+), 1 deletions(-)

M gnu/local.mk
M gnu/packages/mail.scm
A gnu/packages/patches/procmail-gcc-14.patch
M gnu/local.mk => gnu/local.mk +1 -0
@@ 2130,6 2130,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/procmail-ambiguous-getline-debian.patch  \
  %D%/packages/patches/procmail-CVE-2014-3618.patch		\
  %D%/packages/patches/procmail-CVE-2017-16844.patch		\
  %D%/packages/patches/procmail-gcc-14.patch		\
  %D%/packages/patches/proj-7-initialize-memory.patch		\
  %D%/packages/patches/proot-add-clone3.patch			\
  %D%/packages/patches/proot-add-missing-include.patch		\

M gnu/packages/mail.scm => gnu/packages/mail.scm +2 -1
@@ 2808,7 2808,8 @@ separation to safely deliver mail in multi-user setups.")
       ;; patch 24.
       (patches (search-patches "procmail-ambiguous-getline-debian.patch"
                                "procmail-CVE-2014-3618.patch"
                                "procmail-CVE-2017-16844.patch"))))
                                "procmail-CVE-2017-16844.patch"
                                "procmail-gcc-14.patch"))))
    (arguments
     `(#:phases (modify-phases %standard-phases
                  (replace 'configure

A gnu/packages/patches/procmail-gcc-14.patch => gnu/packages/patches/procmail-gcc-14.patch +268 -0
@@ 0,0 1,268 @@
See https://github.com/BuGlessRB/procmail/pull/7

diff --git a/initmake b/initmake
index 82d718d..e44ee67 100755
--- a/initmake
+++ b/initmake
@@ -124,7 +124,7 @@ else
 fi

 cat >_autotst.c <<HERE
-main()
+int main()
 { return 0;
 }
 HERE
@@ -200,7 +200,7 @@ cat >_autotst.c <<HERE
 #include <sys/types.h>
 #include <stdio.h>
 #include <sys/stat.h>
-main()
+int main()
 { struct stat buf;return!&buf;
 }
 HERE
diff --git a/src/autoconf b/src/autoconf
index 1cb4c42..995d8bb 100755
--- a/src/autoconf
+++ b/src/autoconf
@@ -363,6 +363,7 @@ cat >_autotst.c <<HERE
 #include <unistd.h>		/* getpid() getppid() */
 #endif
 #include <stdio.h>
+#include <stdlib.h>
 #include <time.h>
 #include <fcntl.h>
 #include <signal.h>		/* SIGKILL */
@@ -416,6 +417,16 @@ cat >_autotst.c <<HERE
 int dolock,child[NR_of_forks],timeout,fdcollect;
 char dirlocktest[]="_locktest";

+int killchildren()
+{ int i;
+  i=NR_of_forks;
+  do
+     if(child[--i]>0)
+	kill(child[i],SIGTERM),child[i]=0;
+  while(i);
+  return 0;
+}
+
 void stimeout()
 { timeout=1;close(fdcollect);killchildren();
 }
@@ -437,7 +448,79 @@ unsigned sfork()
   return pid;
 }

-int main(argc,argv)char*argv[];
+static int oldfdlock;
+#ifdef F_SETLKW
+static struct flock flck;		/* why can't it be a local variable? */
+#endif
+#ifdef F_LOCK
+static off_t oldlockoffset;
+#endif
+
+int fdlock(int fd)
+{ int i;unsigned gobble[GOBBLE>>2];
+  for(i=GOBBLE>>2;i;gobble[--i]=~(unsigned)0);		 /* SunOS crash test */
+  oldfdlock=fd;fd=0;
+  if(MSK_fcntl&dolock)
+#ifdef F_SETLKW
+   { static unsigned extra;
+     flck.l_type=F_WRLCK;flck.l_whence=SEEK_SET;flck.l_start=tell(oldfdlock);
+     if(!extra--)
+	extra=MIN_locks/4,flck.l_len=2,i|=fcntl(oldfdlock,F_SETLK,&flck);
+     flck.l_len=0;fd|=fcntl(oldfdlock,F_SETLKW,&flck);
+   }
+#else
+     fd=1;
+#endif
+  if(MSK_lockf&dolock)
+#ifdef F_LOCK
+     oldlockoffset=tell(oldfdlock),fd|=lockf(oldfdlock,F_LOCK,(off_t)0);
+#else
+     fd=1;
+#endif
+  if(MSK_flock&dolock)
+#ifdef LOCK_EX
+     fd|=flock(oldfdlock,LOCK_EX);
+#else
+     fd=1;
+#endif
+  return fd;
+}
+
+int sfdlock(int fd)
+{ int i;unsigned gobble[GOBBLE>>2];
+  for(i=GOBBLE>>2;i;gobble[--i]=~(unsigned)0);		 /* SunOS crash test */
+  return fdlock(fd);
+}
+
+int fdunlock()
+{ int i;unsigned gobble[GOBBLE];
+  for(i=GOBBLE;i;gobble[--i]=~(unsigned)0);  /* some SunOS libs mess this up */
+  if(MSK_flock&dolock)
+#ifdef LOCK_EX
+     i|=flock(oldfdlock,LOCK_UN);
+#else
+     i=1;
+#endif
+  if(MSK_lockf&dolock)
+#ifdef F_LOCK
+   { lseek(oldfdlock,oldlockoffset,SEEK_SET);
+     i|=lockf(oldfdlock,F_LOCK,(off_t)2);i|=lockf(oldfdlock,F_ULOCK,(off_t)0);
+   }
+#else
+     i=1;
+#endif
+  if(MSK_fcntl&dolock)
+#ifdef F_SETLKW
+     flck.l_type=F_UNLCK,flck.l_len=0,i|=fcntl(oldfdlock,F_SETLK,&flck);
+#else
+     i=1;
+#endif
+  if(!i)
+     for(i=GOBBLE;i&&gobble[--i]==~(unsigned)0;);
+  return i;
+}
+
+int main(argc,argv)int argc;char*argv[];
 { int goodlock,testlock,i,pip[2],pipw[2];time_t otimet;unsigned dtimet;
   static char filename[]="_locktst.l0";
   close(0);goodlock=0;testlock=FIRST_lock;signal(SIGPIPE,SIG_DFL);
@@ -576,88 +659,6 @@ skip_tests:
   puts("Kernel-locking tests completed.");fprintf(stderr,"\n");
   return EXIT_SUCCESS;
 }
-
-int killchildren()
-{ int i;
-  i=NR_of_forks;
-  do
-     if(child[--i]>0)
-	kill(child[i],SIGTERM),child[i]=0;
-  while(i);
-  return 0;
-}
-
-int sfdlock(fd)
-{ int i;unsigned gobble[GOBBLE>>2];
-  for(i=GOBBLE>>2;i;gobble[--i]=~(unsigned)0);		 /* SunOS crash test */
-  return fdlock(fd);
-}
-
-static oldfdlock;
-#ifdef F_SETLKW
-static struct flock flck;		/* why can't it be a local variable? */
-#endif
-#ifdef F_LOCK
-static off_t oldlockoffset;
-#endif
-
-int fdlock(fd)
-{ int i;unsigned gobble[GOBBLE>>2];
-  for(i=GOBBLE>>2;i;gobble[--i]=~(unsigned)0);		 /* SunOS crash test */
-  oldfdlock=fd;fd=0;
-  if(MSK_fcntl&dolock)
-#ifdef F_SETLKW
-   { static unsigned extra;
-     flck.l_type=F_WRLCK;flck.l_whence=SEEK_SET;flck.l_start=tell(oldfdlock);
-     if(!extra--)
-	extra=MIN_locks/4,flck.l_len=2,i|=fcntl(oldfdlock,F_SETLK,&flck);
-     flck.l_len=0;fd|=fcntl(oldfdlock,F_SETLKW,&flck);
-   }
-#else
-     fd=1;
-#endif
-  if(MSK_lockf&dolock)
-#ifdef F_LOCK
-     oldlockoffset=tell(oldfdlock),fd|=lockf(oldfdlock,F_LOCK,(off_t)0);
-#else
-     fd=1;
-#endif
-  if(MSK_flock&dolock)
-#ifdef LOCK_EX
-     fd|=flock(oldfdlock,LOCK_EX);
-#else
-     fd=1;
-#endif
-  return fd;
-}
-
-int fdunlock()
-{ int i;unsigned gobble[GOBBLE];
-  for(i=GOBBLE;i;gobble[--i]=~(unsigned)0);  /* some SunOS libs mess this up */
-  if(MSK_flock&dolock)
-#ifdef LOCK_EX
-     i|=flock(oldfdlock,LOCK_UN);
-#else
-     i=1;
-#endif
-  if(MSK_lockf&dolock)
-#ifdef F_LOCK
-   { lseek(oldfdlock,oldlockoffset,SEEK_SET);
-     i|=lockf(oldfdlock,F_LOCK,(off_t)2);i|=lockf(oldfdlock,F_ULOCK,(off_t)0);
-   }
-#else
-     i=1;
-#endif
-  if(MSK_fcntl&dolock)
-#ifdef F_SETLKW
-     flck.l_type=F_UNLCK,flck.l_len=0,i|=fcntl(oldfdlock,F_SETLK,&flck);
-#else
-     i=1;
-#endif
-  if(!i)
-     for(i=GOBBLE;i&&gobble[--i]==~(unsigned)0;);
-  return i;
-}
 HERE

 if $MAKE _autotst >_autotst.rrr 2>&1
@@ -1033,6 +1034,10 @@ cat >_autotst.c <<HERE
 #ifndef NO_COMSAT
 #include "network.h"
 #endif
+#include <string.h>
+#include <unistd.h>
+int setrgid();
+int setresgid();
 int main(){char a[2];
  endpwent();endgrent();memmove(a,"0",1);bcopy("0",a,1);strcspn(a,"0");
  strtol("0",(char**)0,10);strchr("0",'0');strpbrk(a,"0");rename(a,"0");
@@ -1059,7 +1064,7 @@ echo 'Testing for memmove, strchr, strpbrk, strcspn, strtol, strstr,'
 echo '	rename, setrgid, setegid, pow, opendir, mkdir, waitpid, fsync,'
 echo '	ftruncate, strtod, strncasecmp, strerror, strlcat,'
 echo '	memset, bzero, and _exit'
-if $MAKE _autotst.$O >$DEVNULL 2>&1
+if $MAKE _autotst.$O >_autotst.rrr 2>&1
 then
 :
 else
diff --git a/src/foldinfo.c b/src/foldinfo.c
index 10fe406..33e7bff 100644
--- a/src/foldinfo.c
+++ b/src/foldinfo.c
@@ -18,6 +18,7 @@ static /*const*/char rcsid[]=
 #include "goodies.h"
 #include "locking.h"
 #include "foldinfo.h"
+#include "acommon.h"

 static const char
  maildirtmp[]=MAILDIRtmp,maildircur[]=MAILDIRcur;
diff --git a/src/mailfold.c b/src/mailfold.c
index 917b502..9e3d386 100644
--- a/src/mailfold.c
+++ b/src/mailfold.c
@@ -371,7 +371,7 @@ void concon(ch)const int ch;   /* flip between concatenated and split fields */
    }
 }

-void readmail(rhead,tobesent)const long tobesent;
+void readmail(rhead,tobesent)const long tobesent; int rhead;
 { char*chp,*pastend;static size_t contlengthoffset;
   ;{ long dfilled;
      if(rhead==2)		  /* already read, just examine what we have */