diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 2a6ecf6828192d20d9e3e0534a82f99e6bca0367..a4d2e44d2b1084fb4659cd17db47a13f66682303 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2004-12-14  Steve Ellcey  <sje@cup.hp.com>
+
+	* libgfortran/io/transfer.c (us_read): Use memcpy/memset
+	instead of assignment to fill unaligned buffer.
+	(us_write): Ditto.
+	(next_record_w): Ditto.
+
 2004-12-05  Steven G. Kargl  <kargls@comcast.net>
 
 	PR libfortran/18966
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index dc94154243def385abb360fb6af04a6064fa3413..c3daa21bfacf9666f20c05507f18c6dad7222096 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -827,11 +827,12 @@ transfer_complex (void *p, int kind)
 static void
 us_read (void)
 {
-  gfc_offset *p;
+  char *p;
   int n;
+  gfc_offset i;
 
   n = sizeof (gfc_offset);
-  p = (gfc_offset *) salloc_r (current_unit->s, &n);
+  p = salloc_r (current_unit->s, &n);
 
   if (p == NULL || n != sizeof (gfc_offset))
     {
@@ -839,7 +840,8 @@ us_read (void)
       return;
     }
 
-  current_unit->bytes_left = *p;
+  memcpy (&i, p, sizeof (gfc_offset));
+  current_unit->bytes_left = i;
 }
 
 
@@ -849,11 +851,11 @@ us_read (void)
 static void
 us_write (void)
 {
-  gfc_offset *p;
+  char *p;
   int length;
 
   length = sizeof (gfc_offset);
-  p = (gfc_offset *) salloc_w (current_unit->s, &length);
+  p = salloc_w (current_unit->s, &length);
 
   if (p == NULL)
     {
@@ -861,7 +863,7 @@ us_write (void)
       return;
     }
 
-  *p = 0;			/* Bogus value for now.  */
+  memset (p, '\0', sizeof (gfc_offset));	/* Bogus value for now.  */
   if (sfree (current_unit->s) == FAILURE)
     generate_error (ERROR_OS, NULL);
 
@@ -1285,7 +1287,7 @@ next_record_w (int done)
       if (p == NULL)
 	goto io_error;
 
-      *((gfc_offset *) p) = m;
+      memcpy (p, &m, sizeof (gfc_offset));
       if (sfree (current_unit->s) == FAILURE)
 	goto io_error;
 
@@ -1296,7 +1298,7 @@ next_record_w (int done)
       if (p == NULL)
 	generate_error (ERROR_OS, NULL);
 
-      *((gfc_offset *) p) = m;
+      memcpy (p, &m, sizeof (gfc_offset));
       if (sfree (current_unit->s) == FAILURE)
 	goto io_error;