Index: lib/libc/gen/modf.c
===================================================================
RCS file: /cvs/src/lib/libc/gen/modf.c,v
retrieving revision 1.6
diff -u -p -r1.6 modf.c
--- lib/libc/gen/modf.c	3 Jul 2013 04:46:36 -0000	1.6
+++ lib/libc/gen/modf.c	6 Feb 2023 13:52:04 -0000
@@ -51,11 +51,13 @@ modf(double val, double *iptr)
 	u_int64_t frac;
 
 	/*
-	 * If input is Inf or NaN, return it and leave i alone.
+	 * If input is +/-Inf or NaN, return +/-0 or NaN.
 	 */
 	u.v = val;
-	if (u.s.dbl_exp == DBL_EXP_INFNAN)
-		return (u.v);
+	if (u.s.dbl_exp == DBL_EXP_INFNAN) {
+		*iptr = u.v;
+		return (0.0 / u.v);
+	}
 
 	/*
 	 * If input can't have a fractional part, return
Index: lib/libm/src/s_modff.c
===================================================================
RCS file: /cvs/src/lib/libm/src/s_modff.c,v
retrieving revision 1.4
diff -u -p -r1.4 s_modff.c
--- lib/libm/src/s_modff.c	27 Oct 2009 23:59:30 -0000	1.4
+++ lib/libm/src/s_modff.c	6 Feb 2023 14:53:03 -0000
@@ -45,6 +45,8 @@ modff(float x, float *iptr)
 	} else {			/* no fraction part */
 	    u_int32_t ix;
 	    *iptr = x*one;
+	    if (jj0 == 0x80)		/* +-inf or NaN */
+ 		return (0.0 / x);		/* +-0 or NaN */
 	    GET_FLOAT_WORD(ix,x);
 	    SET_FLOAT_WORD(x,ix&0x80000000);	/* return +-0 */
 	    return x;
Index: regress/lib/libc/modf/Makefile
===================================================================
RCS file: /cvs/src/regress/lib/libc/modf/Makefile,v
retrieving revision 1.1
diff -u -p -r1.1 Makefile
--- regress/lib/libc/modf/Makefile	7 Jun 2014 01:47:02 -0000	1.1
+++ regress/lib/libc/modf/Makefile	6 Feb 2023 12:54:42 -0000
@@ -1,3 +1,5 @@
 PROG=modf_test
+LDADD+= -lm
+DPADD+= ${LIBM}
 
 .include <bsd.regress.mk>
Index: regress/lib/libc/modf/modf_test.c
===================================================================
RCS file: /cvs/src/regress/lib/libc/modf/modf_test.c,v
retrieving revision 1.1
diff -u -p -r1.1 modf_test.c
--- regress/lib/libc/modf/modf_test.c	7 Jun 2014 01:47:02 -0000	1.1
+++ regress/lib/libc/modf/modf_test.c	6 Feb 2023 14:54:12 -0000
@@ -1,13 +1,14 @@
 /* Public domain, 2014, Tobias Ulmer <tobiasu@tmux.org> */
 
-/* Test for bug introduced in 4.4BSD modf() on sparc */
-
+#include <stdio.h>
 #include <math.h>
 
+/* Test for bug introduced in 4.4BSD modf() on sparc */
+
 #define BIGFLOAT (5e15) /* Number large enough to trigger the "big" case */
 
 int
-main(void)
+modf_44bsd(void)
 {
 	double f, i;
 
@@ -32,4 +33,128 @@ main(void)
 		return 1;
 
 	return 0;
+}
+
+int
+modf_infnan(void)
+{
+	double f, i;
+
+	f = modf(__builtin_inf(), &i);
+	if (!isinf(i) || signbit(i) != 0)
+		return 1;
+	if (f != 0.0)
+		return 1;
+
+	f = modf(-__builtin_inf(), &i);
+	if (!isinf(i) || signbit(i) == 0)
+		return 1;
+	if (f != -0.0)
+		return 1;
+
+	f = modf(NAN, &i);
+	if (!isnan(i) || signbit(i) != 0)
+		return 1;
+	if (!isnan(f) || signbit(f) != 0)
+		return 1;
+
+	f = modf(-NAN, &i);
+	if (!isnan(i) || signbit(i) == 0)
+		return 1;
+	if (!isnan(f) || signbit(f) == 0)
+		return 1;
+
+	return 0;
+}
+
+int
+modff_infnan(void)
+{
+	float f, i;
+
+	f = modff(__builtin_inff(), &i);
+	if (!isinf(i) || signbit(i) != 0)
+		return 1;
+	if (f != 0.0f)
+		return 1;
+
+	f = modff(-__builtin_inff(), &i);
+	if (!isinf(i) || signbit(i) == 0)
+		return 1;
+	if (f != -0.0f)
+		return 1;
+
+	f = modff(NAN, &i);
+	if (!isnan(i) || signbit(i) != 0)
+		return 1;
+	if (!isnan(f) || signbit(f) != 0)
+		return 1;
+
+	f = modff(-NAN, &i);
+	if (!isnan(i) || signbit(i) == 0)
+		return 1;
+	if (!isnan(f) || signbit(f) == 0)
+		return 1;
+
+	return 0;
+}
+
+int
+modfl_infnan(void)
+{
+	long double f, i;
+
+	f = modfl(__builtin_infl(), &i);
+	if (!isinf(i) || signbit(i) != 0)
+		return 1;
+	if (f != 0.0L)
+		return 1;
+
+	f = modfl(-__builtin_infl(), &i);
+	if (!isinf(i) || signbit(i) == 0)
+		return 1;
+	if (f != -0.0L)
+		return 1;
+
+	f = modfl(NAN, &i);
+	if (!isnan(i) || signbit(i) != 0)
+		return 1;
+	if (!isnan(f) || signbit(f) != 0)
+		return 1;
+
+	f = modfl(-NAN, &i);
+	if (!isnan(i) || signbit(i) == 0)
+		return 1;
+	if (!isnan(f) || signbit(f) == 0)
+		return 1;
+
+	return 0;
+}
+
+int
+main(void)
+{
+	int result = 0;
+
+	if (modf_44bsd() != 0) {
+		fprintf(stderr, "modf_44bsd failed\n");
+		result = 1;
+	}
+
+	if (modf_infnan() != 0) {
+		fprintf(stderr, "modf_infnan failed\n");
+		result = 1;
+	}
+
+	if (modff_infnan() != 0) {
+		fprintf(stderr, "modff_infnan failed\n");
+		result = 1;
+	}
+
+	if (modfl_infnan() != 0) {
+		fprintf(stderr, "modfl_infnan failed\n");
+		result = 1;
+	}
+
+	return result;
 }
