Bug: https://bugs.gentoo.org/944460
Bug: https://bugs.gentoo.org/945726

--- a/libsm/vfscanf.c
+++ b/libsm/vfscanf.c
@@ -37,6 +37,7 @@
 #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 @@
 	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 @@
 	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 @@
 			/* 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 @@
 			/* 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 @@
 			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 @@
 			if (isupper(c))
 				flags |= LONG;
 			c = CT_INT;
-			ccfn = (ULONGLONG_T (*)()) sm_strtoll;
 			base = 10;
 			break;
 		}
@@ -628,7 +620,12 @@
 				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;
--- a/mailstats/mailstats.c
+++ b/mailstats/mailstats.c
@@ -65,7 +65,6 @@
 	char sfilebuf[MAXPATHLEN];
 	char buf[MAXLINE];
 	struct statistics stats;
-	extern char *ctime();
 	extern char *optarg;
 	extern int optind;
 # define MSOPTS "cC:f:opP"
