diff options
-rw-r--r-- | ext/Data/Dumper/Dumper.xs | 11 | ||||
-rw-r--r-- | perl.c | 2 | ||||
-rw-r--r-- | util.c | 1 |
3 files changed, 12 insertions, 2 deletions
diff --git a/ext/Data/Dumper/Dumper.xs b/ext/Data/Dumper/Dumper.xs index a129c3fe02..63b0f79f86 100644 --- a/ext/Data/Dumper/Dumper.xs +++ b/ext/Data/Dumper/Dumper.xs @@ -152,7 +152,16 @@ esc_q_utf8(pTHX_ SV* sv, register char *src, register STRLEN slen) else if (k < 0x80) *r++ = (char)k; else { - r += sprintf(r, "\\x{%"UVxf"}", k); + /* The return value of sprintf() is unportable. + * In modern systems it returns (int) the number of characters, + * but in older systems it might return (char*) the original + * buffer, or it might even be (void). The easiest portable + * thing to do is probably use sprintf() in void context and + * then strlen(buffer) for the length. The more proper way + * would of course be to figure out the prototype of sprintf. + * --jhi */ + sprintf(r, "\\x{%"UVxf"}", k); + r += strlen(r); } } *r++ = '"'; @@ -431,7 +431,7 @@ perl_destruct(pTHXx) FREETMPS; /* Need to flush since END blocks can produce output */ - PerlIO_flush((PerlIO*)NULL); + my_fflush_all(); if (CALL_FPTR(PL_threadhook)(aTHX)) { /* Threads hook has vetoed further cleanup */ @@ -3391,6 +3391,7 @@ Perl_my_fflush_all(pTHX) return PerlIO_flush(NULL); #else # if defined(HAS__FWALK) + extern int fflush(FILE *); /* undocumented, unprototyped, but very useful BSDism */ extern void _fwalk(int (*)(FILE *)); _fwalk(&fflush); |