Kill a %n format specifier used in report_summary().

Reminder to also handle the vdebugBelch() case by gnezdo@
This commit is contained in:
kili 2021-09-14 17:53:11 +00:00
parent 20726732be
commit d77c07d6bd
4 changed files with 156 additions and 1 deletions

View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.188 2021/08/16 21:23:18 gnezdo Exp $
# $OpenBSD: Makefile,v 1.189 2021/09/14 17:53:11 kili Exp $
# Not yet ported to other architectures
ONLY_FOR_ARCHS = i386 amd64
@ -19,6 +19,8 @@ DISTNAME = ghc-${GHC_VERSION}
CATEGORIES = lang devel
HOMEPAGE = https://www.haskell.org/ghc/
REVISION = 0
# Version of the precompiled binaries
BIN_VER = 8.10.3.20210429

View File

@ -0,0 +1,34 @@
$OpenBSD: patch-includes_rts_Messages_h,v 1.1 2021/09/14 17:53:11 kili Exp $
The debug message function has to return the number of bytes written
(like printf(3)), to allow killing a %n format specifier in one in
one invocation of statsPrintf() in report_summary() (rts/Stats.c).
Index: includes/rts/Messages.h
--- includes/rts/Messages.h.orig
+++ includes/rts/Messages.h
@@ -85,20 +85,21 @@ void vsysErrorBelch(const char *s, va_list ap);
void debugBelch(const char *s, ...)
GNUC3_ATTRIBUTE(format (PRINTF, 1, 2));
-void vdebugBelch(const char *s, va_list ap);
+int vdebugBelch(const char *s, va_list ap);
/* Hooks for redirecting message generation: */
typedef void RtsMsgFunction(const char *, va_list);
+typedef int RtsMsgFunctionRetLen(const char *, va_list);
extern RtsMsgFunction *fatalInternalErrorFn;
-extern RtsMsgFunction *debugMsgFn;
+extern RtsMsgFunctionRetLen *debugMsgFn;
extern RtsMsgFunction *errorMsgFn;
/* Default stdio implementation of the message hooks: */
extern RtsMsgFunction rtsFatalInternalErrorFn;
-extern RtsMsgFunction rtsDebugMsgFn;
+extern RtsMsgFunctionRetLen rtsDebugMsgFn;
extern RtsMsgFunction rtsErrorMsgFn;
extern RtsMsgFunction rtsSysErrorMsgFn;

View File

@ -0,0 +1,65 @@
$OpenBSD: patch-rts_RtsMessages_c,v 1.1 2021/09/14 17:53:11 kili Exp $
The debug message function has to return the number of bytes written
(like printf(3)), to allow killing a %n format specifier in one in
one invocation of statsPrintf() in report_summary() (rts/Stats.c).
Index: rts/RtsMessages.c
--- rts/RtsMessages.c.orig
+++ rts/RtsMessages.c
@@ -36,7 +36,7 @@
// Default to the stdio implementation of these hooks.
RtsMsgFunction *fatalInternalErrorFn = rtsFatalInternalErrorFn;
-RtsMsgFunction *debugMsgFn = rtsDebugMsgFn;
+RtsMsgFunctionRetLen *debugMsgFn = rtsDebugMsgFn;
RtsMsgFunction *errorMsgFn = rtsErrorMsgFn;
RtsMsgFunction *sysErrorMsgFn = rtsSysErrorMsgFn;
@@ -102,10 +102,10 @@ debugBelch(const char*s, ...)
va_end(ap);
}
-void
+int
vdebugBelch(const char*s, va_list ap)
{
- (*debugMsgFn)(s,ap);
+ return (*debugMsgFn)(s,ap);
}
/* -----------------------------------------------------------------------------
@@ -285,16 +285,16 @@ rtsSysErrorMsgFn(const char *s, va_list ap)
#endif
}
-void
+int
rtsDebugMsgFn(const char *s, va_list ap)
{
+ int r;
#if defined(mingw32_HOST_OS)
/* Ensure we're in text mode so newlines get encoded properly. */
int mode = _setmode (_fileno(stderr), _O_TEXT);
if (isGUIApp())
{
char buf[BUFSIZE];
- int r;
r = vsnprintf(buf, BUFSIZE, s, ap);
if (r > 0 && r < BUFSIZE) {
@@ -305,12 +305,13 @@ rtsDebugMsgFn(const char *s, va_list ap)
#endif
{
/* don't fflush(stdout); WORKAROUND bug in Linux glibc */
- vfprintf(stderr, s, ap);
+ r = vfprintf(stderr, s, ap);
fflush(stderr);
}
#if defined(mingw32_HOST_OS)
_setmode (_fileno(stderr), mode);
#endif
+ return r;
}

View File

@ -0,0 +1,54 @@
$OpenBSD: patch-rts_Stats_c,v 1.1 2021/09/14 17:53:11 kili Exp $
Kill a use of %n format specifier.
Index: rts/Stats.c
--- rts/Stats.c.orig
+++ rts/Stats.c
@@ -69,7 +69,7 @@ static Time *GC_coll_cpu = NULL;
static Time *GC_coll_elapsed = NULL;
static Time *GC_coll_max_pause = NULL;
-static void statsPrintf( char *s, ... ) GNUC3_ATTRIBUTE(format (PRINTF, 1, 2));
+static int statsPrintf( char *s, ... ) GNUC3_ATTRIBUTE(format (PRINTF, 1, 2));
static void statsFlush( void );
static void statsClose( void );
@@ -1024,8 +1024,10 @@ static void report_summary(const RTSSummaryStats* sum)
for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
int prefix_length = 0;
- statsPrintf("%*s" "gen[%" FMT_Word32 "%n",
- col_width[0], "", g, &prefix_length);
+ prefix_length = statsPrintf("%*s" "gen[%" FMT_Word32,
+ col_width[0], "", g);
+ if (prefix_length < 0)
+ prefix_length = 0;
prefix_length -= col_width[0];
int suffix_length = col_width[1] + prefix_length;
suffix_length =
@@ -1735,19 +1737,21 @@ void getRTSStats( RTSStats *s )
Dumping stuff in the stats file, or via the debug message interface
-------------------------------------------------------------------------- */
-void
+int
statsPrintf( char *s, ... )
{
+ int ret = 0;
FILE *sf = RtsFlags.GcFlags.statsFile;
va_list ap;
va_start(ap,s);
if (sf == NULL) {
- vdebugBelch(s,ap);
+ ret = vdebugBelch(s,ap);
} else {
- vfprintf(sf, s, ap);
+ ret = vfprintf(sf, s, ap);
}
va_end(ap);
+ return ret;
}
static void