summaryrefslogtreecommitdiff
path: root/libquadmath/printf/printf_fp.c
AgeCommit message (Collapse)Author
2024-04-03libquadmath: Don't assume the storage for __float128 arguments is aligned ↵Jakub Jelinek
[PR114533] With the register_printf_type/register_printf_modifier/register_printf_specifier APIs the C library is just told the size of the argument and is provided with a callback to fetch the argument from va_list using va_arg into C library provided memory. The C library isn't told what alignment requirement it has, but we were using direct load of a __float128 value from that memory which assumes __alignof (__float128) alignment. The following patch fixes that by using memcpy instead. I haven't been able to reproduce an actual crash, tried #include <quadmath.h> #include <stdlib.h> #include <stdio.h> int main () { __float128 r; int prec = 20; int width = 46; char buf[128]; r = 2.0q; r = sqrtq (r); int n = quadmath_snprintf (buf, sizeof buf, "%+-#*.20Qe", width, r); if ((size_t) n < sizeof buf) printf ("%s\n", buf); /* Prints: +1.41421356237309504880e+00 */ quadmath_snprintf (buf, sizeof buf, "%Qa", r); if ((size_t) n < sizeof buf) printf ("%s\n", buf); /* Prints: 0x1.6a09e667f3bcc908b2fb1366ea96p+0 */ n = quadmath_snprintf (NULL, 0, "%+-#46.*Qe", prec, r); if (n > -1) { char *str = malloc (n + 1); if (str) { quadmath_snprintf (str, n + 1, "%+-#46.*Qe", prec, r); printf ("%s\n", str); /* Prints: +1.41421356237309504880e+00 */ } free (str); } printf ("%+-#*.20Qe\n", width, r); printf ("%Qa\n", r); printf ("%+-#46.*Qe\n", prec, r); printf ("%d %Qe %d %Qe %d %Qe\n", 1, r, 2, r, 3, r); return 0; } In any case, I think memcpy for loading from it is right. 2024-04-03 Simon Chopin <simon.chopin@canonical.com> Jakub Jelinek <jakub@redhat.com> PR libquadmath/114533 * printf/printf_fp.c (__quadmath_printf_fp): Use memcpy to copy __float128 out of args. * printf/printf_fphex.c (__quadmath_printf_fphex): Likewise. Signed-off-by: Simon Chopin <simon.chopin@canonical.com>
2013-02-06Revert libquadmath and libssp copyright patches.Richard Sandiford
From-SVN: r195820
2013-02-03Update copyright in libquadmath.Richard Sandiford
From-SVN: r195699
2012-11-23quadmath-rounding-mode.h: New.Tobias Burnus
2012-11-23 Tobias Burnus <burnus@net-b.de> Joseph Myers <joseph@codesourcery.com> * quadmath-rounding-mode.h: New. * printf/fpioconst.c: Update from GLIBC. Fix strtod rounding. * printf/fpioconst.h: Ditto. * printf/printf_fp.c (__quadmath_printf_fp): Update from GLIBC. Make printf respect the rounding mode for decimal output. * printf/printf_fphex.c (__quadmath_printf_fphex): Update from GLIBC. Make printf respect the rounding mode for hex output. * strtod/strtod_l.c: Update from GLIBC. Make strtod respect the rounding mode. Fix strtod handling of underflow. Co-Authored-By: Joseph Myers <joseph@codesourcery.com> From-SVN: r193770
2011-03-25printf_fp.c (__quadmath_printf_fp): Use memcpy instead of mempcpy.Jakub Jelinek
* printf/printf_fp.c (__quadmath_printf_fp): Use memcpy instead of mempcpy. From-SVN: r171525
2011-02-16quadmath-printf.c: Also check __GLIBC__ when checking whether workarounds ↵Jakub Jelinek
for printf hook handling... * printf/quadmath-printf.c: Also check __GLIBC__ when checking whether workarounds for printf hook handling should be added. * configure.ac: Check for locale.h too. (USE_LOCALE_SUPPORT): Remove check. (USE_NL_LANGINFO, USE_NL_LANGINFO_WC, USE_LOCALECONV): New checks. (USE_I18_NUMBER_H): Check also for _NL_CTYPE_MB_CUR_MAX. * printf/printf_fphex.c (__quadmath_printf_fphex): Use nl_langinfo or localeconv for narrow version and nl_langinfo if USE_NL_LANGINFO_WC for wide version. * printf/quadmath-printf.h: Include locale.h if HAVE_LOCALE_H. * printf/printf_fp.c (USE_I18N_NUMBER_H): Don't define to 0. (__quadmath_printf_fp): Use nl_langinfo or localeconv for narrow version and nl_langinfo if USE_NL_LANGINFO_WC for wide version. Guard nl_langinfo (_NL_CTYPE_MB_CUR_MAX) use with USE_I18N_NUMBER_H #ifdef. * configure: Regenerated. * config.h.in: Regenerated. From-SVN: r170211
2011-02-14configure.ac (HAVE_HIDDEN_VISIBILITY): Test with -Werror in CFLAGS.Jakub Jelinek
* configure.ac (HAVE_HIDDEN_VISIBILITY): Test with -Werror in CFLAGS. * printf/printf_fp.c: Don't include <alloca.h>. * printf/quadmath-printf.h (_itoa): Redefine to __quadmath_itoa. * configure: Regenerated. From-SVN: r170139
2011-02-14re PR fortran/47642 (real(kind=16) - libquadmath - segfault on amd64 FreeBSD)Jakub Jelinek
PR fortran/47642 * libquadmath.texi (quadmath_snprintf): Document. (quadmath_flt128tostr): Remove. * Makefile.am (libquadmath_la_SOURCES): Add printf/*.c. Remove quadmath_io.c, gdtoa/gdtoa.c, gdtoa/g__fmt.c, gdtoa/g_Qfmt.c, gdtoa/dmisc.c and gdtoa/ulp.c. * quadmath.h (quadmath_snprintf): New prototype. (quadmath_flt128tostr): Remove. * quadmath_weak.h (quadmath_snprintf): Add. (quadmath_flt128tostr): Remove. * configure.ac: New AC_CHECK_HEADERS headers: langinfo.h, wchar.h, wctype.h, limits.h, ctype.h, printf.h, errno.h. (AC_USE_SYSTEM_EXTENSIONS): Add. (HAVE_HIDDEN_VISIBILITY, HAVE_PRINTF_HOOKS, USE_LOCALE_SUPPORT, USE_I18N_NUMBER_H): New checks. * quadmath.map (QUADMATH_1.0): Add quadmath_snprintf. Remove quadmath_flt128tostr. * printf/printf_fphex.c: New file. * printf/_itowa.h: New file. * printf/mul_n.c: New file. * printf/quadmath-printf.h: New file. * printf/submul_1.c: New file. * printf/quadmath-printf.c: New file. * printf/gmp-impl.h: New file. * printf/lshift.c: New file. * printf/fpioconst.h: New file. * printf/add_n.c: New file. * printf/cmp.c: New file. * printf/sub_n.c: New file. * printf/mul.c: New file. * printf/divrem.c: New file. * printf/addmul_1.c: New file. * printf/printf_fp.c: New file. * printf/_itoa.h: New file. * printf/fpioconst.c: New file. * printf/_i18n_number.h: New file. * printf/flt1282mpn.c: New file. * printf/rshift.c: New file. * printf/mul_1.c: New file. * quadmath_io.c: Removed. * gdtoa/gdtoa.c: Removed. * gdtoa/g__fmt.c: Removed. * gdtoa/g_Qfmt.c: Removed. * gdtoa/dmisc.c: Removed. * gdtoa/ulp.c: Removed. * config.h.in: Regenerated. * configure: Regenerated. * Makefile.in: Regenerated. * io/write_float.def (DTOAQ): Use quadmath_snprintf instead of quadmath_flt128tostr. * io/transfer128.c (tmp2): Initialize to quadmath_snprintf instead of quadmath_flt128tostr. From-SVN: r170135