Submitted By:            Douglas R. Reno <renodr at linuxfromscratch dot org>
Date:                    2025-06-02
Initial Package Version: 8.18.1
Upstream Status:         Not Applied
Origin:                  Fedora
Description:             Fixes building sendmail with GCC 15 by adjusting some
                         functions for C23 compatibility.

diff -Naurp sendmail-8.18.1.orig/libsm/vfscanf.c sendmail-8.18.1/libsm/vfscanf.c
--- sendmail-8.18.1.orig/libsm/vfscanf.c	2024-01-31 00:38:32.000000000 -0600
+++ sendmail-8.18.1/libsm/vfscanf.c	2025-06-02 12:11:12.679961807 -0500
@@ -37,6 +37,7 @@ SM_IDSTR(id, "@(#)$Id: vfscanf.c,v 1.55
 #define SUPPRESS	0x10	/* suppress assignment */
 #define POINTER		0x20	/* weird %p pointer (`fake hex') */
 #define NOSKIP		0x40	/* do not skip blanks */
+#define UNSIGNED	0x80	/* unsigned conversions */
 
 /*
 **  The following are used in numeric conversions only:
@@ -122,9 +123,6 @@ sm_vfscanf(fp, timeout, fmt0, ap)
 	int nassigned;		/* number of fields assigned */
 	int nread;		/* number of characters consumed from fp */
 	int base;		/* base argument to strtoll/strtoull */
-
-	/* conversion function (strtoll/strtoull) */
-	ULONGLONG_T (*ccfn) __P((const char *, char **, int));
 	char ccltab[256];	/* character class table for %[...] */
 	char buf[BUF];		/* buffer for numeric conversions */
 	SM_EVENT *evt = NULL;
@@ -160,7 +158,6 @@ sm_vfscanf(fp, timeout, fmt0, ap)
 	nassigned = 0;
 	nread = 0;
 	base = 0;		/* XXX just to keep gcc happy */
-	ccfn = NULL;		/* XXX just to keep gcc happy */
 	for (;;)
 	{
 		c = *fmt++;
@@ -240,13 +237,11 @@ literal:
 			/* FALLTHROUGH */
 		  case 'd':
 			c = CT_INT;
-			ccfn = (ULONGLONG_T (*)())sm_strtoll;
 			base = 10;
 			break;
 
 		  case 'i':
 			c = CT_INT;
-			ccfn = (ULONGLONG_T (*)())sm_strtoll;
 			base = 0;
 			break;
 
@@ -255,21 +250,20 @@ literal:
 			/* FALLTHROUGH */
 		  case 'o':
 			c = CT_INT;
-			ccfn = sm_strtoull;
+			flags |= UNSIGNED;
 			base = 8;
 			break;
 
 		  case 'u':
 			c = CT_INT;
-			ccfn = sm_strtoull;
+			flags |= UNSIGNED;
 			base = 10;
 			break;
 
 		  case 'X':
 		  case 'x':
-			flags |= PFXOK;	/* enable 0x prefixing */
+			flags |= PFXOK | UNSIGNED;
 			c = CT_INT;
-			ccfn = sm_strtoull;
 			base = 16;
 			break;
 
@@ -297,9 +291,8 @@ literal:
 			break;
 
 		  case 'p':	/* pointer format is like hex */
-			flags |= POINTER | PFXOK;
+			flags |= POINTER | PFXOK | UNSIGNED;
 			c = CT_INT;
-			ccfn = sm_strtoull;
 			base = 16;
 			break;
 
@@ -324,7 +317,6 @@ literal:
 			if (isupper(c))
 				flags |= LONG;
 			c = CT_INT;
-			ccfn = (ULONGLONG_T (*)()) sm_strtoll;
 			base = 10;
 			break;
 		}
@@ -628,7 +620,12 @@ literal:
 				ULONGLONG_T res;
 
 				*p = 0;
-				res = (*ccfn)(buf, (char **)NULL, base);
+				if (flags & UNSIGNED)
+					res = sm_strtoull(buf, (char **)NULL,
+							  base);
+				else
+					res = sm_strtoll(buf, (char **)NULL,
+							 base);
 				if (flags & POINTER)
 					*SM_VA_ARG(ap, void **) =
 					    (void *)(long) res;
diff -Naurp sendmail-8.18.1.orig/mailstats/mailstats.c sendmail-8.18.1/mailstats/mailstats.c
--- sendmail-8.18.1.orig/mailstats/mailstats.c	2024-01-31 00:38:32.000000000 -0600
+++ sendmail-8.18.1/mailstats/mailstats.c	2025-06-02 12:11:12.679961807 -0500
@@ -65,7 +65,7 @@ main(argc, argv)
 	char sfilebuf[MAXPATHLEN];
 	char buf[MAXLINE];
 	struct statistics stats;
-	extern char *ctime();
+	extern char *ctime(const time_t *);
 	extern char *optarg;
 	extern int optind;
 # define MSOPTS "cC:f:opP"
