diff -Naurd mpfr-2.4.2-a/PATCHES mpfr-2.4.2-b/PATCHES
--- mpfr-2.4.2-a/PATCHES	2009-12-07 13:37:12.000000000 +0000
+++ mpfr-2.4.2-b/PATCHES	2009-12-07 13:37:12.000000000 +0000
@@ -0,0 +1 @@
+sin_cos_underflow
diff -Naurd mpfr-2.4.2-a/VERSION mpfr-2.4.2-b/VERSION
--- mpfr-2.4.2-a/VERSION	2009-11-30 02:43:08.000000000 +0000
+++ mpfr-2.4.2-b/VERSION	2009-12-07 13:37:12.000000000 +0000
@@ -1 +1 @@
-2.4.2
+2.4.2-p1
diff -Naurd mpfr-2.4.2-a/mpfr.h mpfr-2.4.2-b/mpfr.h
--- mpfr-2.4.2-a/mpfr.h	2009-11-30 02:43:08.000000000 +0000
+++ mpfr-2.4.2-b/mpfr.h	2009-12-07 13:37:12.000000000 +0000
@@ -27,7 +27,7 @@
 #define MPFR_VERSION_MAJOR 2
 #define MPFR_VERSION_MINOR 4
 #define MPFR_VERSION_PATCHLEVEL 2
-#define MPFR_VERSION_STRING "2.4.2"
+#define MPFR_VERSION_STRING "2.4.2-p1"
 
 /* Macros dealing with MPFR VERSION */
 #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c))
diff -Naurd mpfr-2.4.2-a/sin_cos.c mpfr-2.4.2-b/sin_cos.c
--- mpfr-2.4.2-a/sin_cos.c	2009-11-30 02:43:09.000000000 +0000
+++ mpfr-2.4.2-b/sin_cos.c	2009-12-07 13:37:12.000000000 +0000
@@ -82,17 +82,19 @@
       if (y != x)
         /* y and x differ, thus we can safely try to compute y first */
         {
-          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, -2 * expx, 2, 0, rnd_mode,
-                                            { inexy = _inexact;
-                                              goto small_input; });
+          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
+            y, x, -2 * expx, 2, 0, rnd_mode,
+            { inexy = _inexact;
+              goto small_input; });
           if (0)
             {
             small_input:
               /* we can go here only if we can round sin(x) */
-              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (z, __gmpfr_one, -2 * expx,
-                                                1, 0, rnd_mode,
-                                                { inexz = _inexact;
-                                                  goto end; });
+              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
+                z, __gmpfr_one, -2 * expx, 1, 0, rnd_mode,
+                { inexz = _inexact;
+                  MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags);
+                  goto end; });
             }
 
           /* if we go here, one of the two MPFR_FAST_COMPUTE_IF_SMALL_INPUT
@@ -101,18 +103,19 @@
       else /* y and x are the same variable: try to compute z first, which
               necessarily differs */
         {
-          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (z, __gmpfr_one, -2 * expx,
-                                            1, 0, rnd_mode,
-                                            { inexz = _inexact;
-                                              goto small_input2; });
+          MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
+            z, __gmpfr_one, -2 * expx, 1, 0, rnd_mode,
+            { inexz = _inexact;
+              goto small_input2; });
           if (0)
             {
             small_input2:
               /* we can go here only if we can round cos(x) */
-              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (y, x, -2 * expx, 2, 0,
-                                                rnd_mode,
-                                                { inexy = _inexact;
-                                                  goto end; });
+              MPFR_FAST_COMPUTE_IF_SMALL_INPUT (
+                y, x, -2 * expx, 2, 0, rnd_mode,
+                { inexy = _inexact;
+                  MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags);
+                  goto end; });
             }
         }
       m += 2 * (-expx);
@@ -207,7 +210,6 @@
   mpfr_clear (xr);
 
  end:
-  /* FIXME: update the underflow flag if need be. */
   MPFR_SAVE_EXPO_FREE (expo);
   mpfr_check_range (y, inexy, rnd_mode);
   mpfr_check_range (z, inexz, rnd_mode);
diff -Naurd mpfr-2.4.2-a/tests/tsin_cos.c mpfr-2.4.2-b/tests/tsin_cos.c
--- mpfr-2.4.2-a/tests/tsin_cos.c	2009-11-30 02:43:08.000000000 +0000
+++ mpfr-2.4.2-b/tests/tsin_cos.c	2009-12-07 13:37:12.000000000 +0000
@@ -382,23 +382,56 @@
 consistency (void)
 {
   mpfr_t x, s1, s2, c1, c2;
+  mp_exp_t emin, emax;
   mp_rnd_t rnd;
+  unsigned int flags_sin, flags_cos, flags, flags_before, flags_ref;
+  int inex_sin, inex_cos, inex, inex_ref;
   int i;
 
+  emin = mpfr_get_emin ();
+  emax = mpfr_get_emax ();
+
   for (i = 0; i <= 10000; i++)
     {
       mpfr_init2 (x, MPFR_PREC_MIN + (randlimb () % 8));
       mpfr_inits2 (MPFR_PREC_MIN + (randlimb () % 8), s1, s2, c1, c2,
                    (mpfr_ptr) 0);
-      tests_default_random (x, 256, -5, 50);
-      rnd = RND_RAND ();
-      mpfr_sin (s1, x, rnd);
-      mpfr_cos (c1, x, rnd);
-      mpfr_sin_cos (s2, c2, x, rnd);
-      if (!(mpfr_equal_p (s1, s2) && mpfr_equal_p (c1, c2)))
+      if (i < 8 * GMP_RND_MAX)
         {
-          printf ("mpfr_sin_cos and mpfr_sin/mpfr_cos disagree on %s,\nx = ",
-                  mpfr_print_rnd_mode (rnd));
+          int j = i / GMP_RND_MAX;
+          if (j & 1)
+            mpfr_set_emin (MPFR_EMIN_MIN);
+          mpfr_set_si (x, (j & 2) ? 1 : -1, GMP_RNDN);
+          mpfr_set_exp (x, mpfr_get_emin ());
+          rnd = (mpfr_rnd_t) (i % GMP_RND_MAX);
+          flags_before = 0;
+          if (j & 4)
+            mpfr_set_emax (-17);
+        }
+      else
+        {
+          tests_default_random (x, 256, -5, 50);
+          rnd = RND_RAND ();
+          flags_before = (randlimb () & 1) ?
+            (unsigned int) (MPFR_FLAGS_ALL ^ MPFR_FLAGS_ERANGE) :
+            (unsigned int) 0;
+        }
+      __gmpfr_flags = flags_before;
+      inex_sin = mpfr_sin (s1, x, rnd);
+      flags_sin = __gmpfr_flags;
+      __gmpfr_flags = flags_before;
+      inex_cos = mpfr_cos (c1, x, rnd);
+      flags_cos = __gmpfr_flags;
+      __gmpfr_flags = flags_before;
+      inex = !!mpfr_sin_cos (s2, c2, x, rnd);
+      flags = __gmpfr_flags;
+      inex_ref = inex_sin || inex_cos;
+      flags_ref = flags_sin | flags_cos;
+      if (!(mpfr_equal_p (s1, s2) && mpfr_equal_p (c1, c2)) ||
+          inex != inex_ref || flags != flags_ref)
+        {
+          printf ("mpfr_sin_cos and mpfr_sin/mpfr_cos disagree on %s,"
+                  " i = %d\nx = ", mpfr_print_rnd_mode (rnd), i);
           mpfr_dump (x);
           printf ("s1 = ");
           mpfr_dump (s1);
@@ -408,9 +441,16 @@
           mpfr_dump (c1);
           printf ("c2 = ");
           mpfr_dump (c2);
+          printf ("inex_sin = %d, inex_cos = %d, inex = %d (expected %d)\n",
+                  inex_sin, inex_cos, inex, inex_ref);
+          printf ("flags_sin = 0x%x, flags_cos = 0x%x, "
+                  "flags = 0x%x (expected 0x%x)\n",
+                  flags_sin, flags_cos, flags, flags_ref);
           exit (1);
         }
       mpfr_clears (x, s1, s2, c1, c2, (mpfr_ptr) 0);
+      mpfr_set_emin (emin);
+      mpfr_set_emax (emax);
     }
 }
 
diff -Naurd mpfr-2.4.2-a/version.c mpfr-2.4.2-b/version.c
--- mpfr-2.4.2-a/version.c	2009-11-30 02:43:08.000000000 +0000
+++ mpfr-2.4.2-b/version.c	2009-12-07 13:37:12.000000000 +0000
@@ -25,5 +25,5 @@
 const char *
 mpfr_get_version (void)
 {
-  return "2.4.2";
+  return "2.4.2-p1";
 }
