patches/glibc/2.1.3/rh62-03-glibc-2.1.3-crypt.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Feb 24 11:00:05 2007 +0000 (2007-02-24)
changeset 1 eeea35fbf182
permissions -rw-r--r--
Add the full crosstool-NG sources to the new repository of its own.
You might just say: 'Yeah! crosstool-NG's got its own repo!".
Unfortunately, that's because the previous repo got damaged beyond repair and I had no backup.
That means I'm putting backups in place in the afternoon.
That also means we've lost history... :-(
yann@1
     1
--- glibc-2.1.3/md5-crypt/md5-crypt.c	2000/03/04 00:47:30	1.1
yann@1
     2
+++ glibc-2.1.3/md5-crypt/md5-crypt.c	2000/08/24 06:10:02	1.8
yann@1
     3
@@ -1,5 +1,5 @@
yann@1
     4
 /* One way encryption based on MD5 sum.
yann@1
     5
-   Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
yann@1
     6
+   Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
yann@1
     7
    This file is part of the GNU C Library.
yann@1
     8
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
yann@1
     9
 
yann@1
    10
@@ -18,6 +18,7 @@
yann@1
    11
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
yann@1
    12
    Boston, MA 02111-1307, USA.  */
yann@1
    13
 
yann@1
    14
+#include <assert.h>
yann@1
    15
 #include <errno.h>
yann@1
    16
 #include <stdlib.h>
yann@1
    17
 #include <string.h>
yann@1
    18
@@ -37,9 +38,9 @@
yann@1
    19
 
yann@1
    20
 
yann@1
    21
 /* Prototypes for local functions.  */
yann@1
    22
-extern char *__md5_crypt_r __P ((const char *key, const char *salt,
yann@1
    23
-				 char *buffer, int buflen));
yann@1
    24
-extern char *__md5_crypt __P ((const char *key, const char *salt));
yann@1
    25
+extern char *__md5_crypt_r (const char *key, const char *salt,
yann@1
    26
+			    char *buffer, int buflen);
yann@1
    27
+extern char *__md5_crypt (const char *key, const char *salt);
yann@1
    28
 
yann@1
    29
 
yann@1
    30
 /* This entry point is equivalent to the `crypt' function in Unix
yann@1
    31
@@ -51,13 +52,16 @@
yann@1
    32
      char *buffer;
yann@1
    33
      int buflen;
yann@1
    34
 {
yann@1
    35
-  unsigned char alt_result[16];
yann@1
    36
+  unsigned char alt_result[16]
yann@1
    37
+    __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
yann@1
    38
   struct md5_ctx ctx;
yann@1
    39
   struct md5_ctx alt_ctx;
yann@1
    40
   size_t salt_len;
yann@1
    41
   size_t key_len;
yann@1
    42
   size_t cnt;
yann@1
    43
   char *cp;
yann@1
    44
+  char *copied_key = NULL;
yann@1
    45
+  char *copied_salt = NULL;
yann@1
    46
 
yann@1
    47
   /* Find beginning of salt string.  The prefix should normally always
yann@1
    48
      be present.  Just in case it is not.  */
yann@1
    49
@@ -68,6 +72,26 @@
yann@1
    50
   salt_len = MIN (strcspn (salt, "$"), 8);
yann@1
    51
   key_len = strlen (key);
yann@1
    52
 
yann@1
    53
+  if ((key - (char *) 0) % __alignof__ (md5_uint32) != 0)
yann@1
    54
+    {
yann@1
    55
+      char *tmp = (char *) alloca (key_len + __alignof__ (md5_uint32));
yann@1
    56
+      key = copied_key =
yann@1
    57
+	memcpy (tmp + __alignof__ (md5_uint32)
yann@1
    58
+		- (tmp - (char *) 0) % __alignof__ (md5_uint32),
yann@1
    59
+		key, key_len);
yann@1
    60
+      assert ((key - (char *) 0) % __alignof__ (md5_uint32) == 0);
yann@1
    61
+    }
yann@1
    62
+
yann@1
    63
+  if ((salt - (char *) 0) % __alignof__ (md5_uint32) != 0)
yann@1
    64
+    {
yann@1
    65
+      char *tmp = (char *) alloca (salt_len + __alignof__ (md5_uint32));
yann@1
    66
+      salt = copied_salt =
yann@1
    67
+	memcpy (tmp + __alignof__ (md5_uint32)
yann@1
    68
+		- (tmp - (char *) 0) % __alignof__ (md5_uint32),
yann@1
    69
+		salt, salt_len);
yann@1
    70
+      assert ((salt - (char *) 0) % __alignof__ (md5_uint32) == 0);
yann@1
    71
+    }
yann@1
    72
+
yann@1
    73
   /* Prepare for the real work.  */
yann@1
    74
   __md5_init_ctx (&ctx);
yann@1
    75
 
yann@1
    76
@@ -195,21 +219,30 @@
yann@1
    77
 
yann@1
    78
   /* Clear the buffer for the intermediate result so that people
yann@1
    79
      attaching to processes or reading core dumps cannot get any
yann@1
    80
-     information.  */
yann@1
    81
-  memset (alt_result, '\0', sizeof (alt_result));
yann@1
    82
+     information.  We do it in this way to clear correct_words[]
yann@1
    83
+     inside the MD5 implementation as well.  */
yann@1
    84
+  __md5_init_ctx (&ctx);
yann@1
    85
+  __md5_finish_ctx (&ctx, alt_result);
yann@1
    86
+  memset (&ctx, '\0', sizeof (ctx));
yann@1
    87
+  memset (&alt_ctx, '\0', sizeof (alt_ctx));
yann@1
    88
+  if (copied_key != NULL)
yann@1
    89
+    memset (copied_key, '\0', key_len);
yann@1
    90
+  if (copied_salt != NULL)
yann@1
    91
+    memset (copied_salt, '\0', salt_len);
yann@1
    92
 
yann@1
    93
   return buffer;
yann@1
    94
 }
yann@1
    95
 
yann@1
    96
 
yann@1
    97
+static char *buffer;
yann@1
    98
+
yann@1
    99
 char *
yann@1
   100
 __md5_crypt (const char *key, const char *salt)
yann@1
   101
 {
yann@1
   102
   /* We don't want to have an arbitrary limit in the size of the
yann@1
   103
      password.  We can compute the size of the result in advance and
yann@1
   104
      so we can prepare the buffer we pass to `md5_crypt_r'.  */
yann@1
   105
-  static char *buffer = NULL;
yann@1
   106
-  static int buflen = 0;
yann@1
   107
+  static int buflen;
yann@1
   108
   int needed = 3 + strlen (salt) + 1 + 26 + 1;
yann@1
   109
 
yann@1
   110
   if (buflen < needed)
yann@1
   111
@@ -220,4 +253,12 @@
yann@1
   112
     }
yann@1
   113
 
yann@1
   114
   return __md5_crypt_r (key, salt, buffer, buflen);
yann@1
   115
+}
yann@1
   116
+
yann@1
   117
+
yann@1
   118
+static void
yann@1
   119
+__attribute__ ((__destructor__))
yann@1
   120
+free_mem (void)
yann@1
   121
+{
yann@1
   122
+  free (buffer);
yann@1
   123
 }
yann@1
   124
--- glibc-2.1.3/md5-crypt/md5.c	2000/03/04 00:47:30	1.1
yann@1
   125
+++ glibc-2.1.3/md5-crypt/md5.c	2000/07/04 18:22:44	1.2
yann@1
   126
@@ -1,6 +1,6 @@
yann@1
   127
-/* md5.c - Functions to compute MD5 message digest of files or memory blocks
yann@1
   128
+/* Functions to compute MD5 message digest of files or memory blocks.
yann@1
   129
    according to the definition of MD5 in RFC 1321 from April 1992.
yann@1
   130
-   Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
yann@1
   131
+   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
yann@1
   132
    This file is part of the GNU C Library.
yann@1
   133
 
yann@1
   134
    The GNU C Library is free software; you can redistribute it and/or
yann@1
   135
@@ -217,6 +217,8 @@
yann@1
   136
      size_t len;
yann@1
   137
      struct md5_ctx *ctx;
yann@1
   138
 {
yann@1
   139
+  //const void aligned_buffer = buffer;
yann@1
   140
+
yann@1
   141
   /* When we already have some bits in our internal buffer concatenate
yann@1
   142
      both inputs first.  */
yann@1
   143
   if (ctx->buflen != 0)
yann@1
   144
@@ -224,16 +226,20 @@
yann@1
   145
       size_t left_over = ctx->buflen;
yann@1
   146
       size_t add = 128 - left_over > len ? len : 128 - left_over;
yann@1
   147
 
yann@1
   148
+      /* Only put full words in the buffer.  */
yann@1
   149
+      add -= add % __alignof__ (md5_uint32);
yann@1
   150
+
yann@1
   151
       memcpy (&ctx->buffer[left_over], buffer, add);
yann@1
   152
       ctx->buflen += add;
yann@1
   153
 
yann@1
   154
-      if (left_over + add > 64)
yann@1
   155
+      if (ctx->buflen > 64)
yann@1
   156
 	{
yann@1
   157
-	  md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
yann@1
   158
+	  md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
yann@1
   159
+
yann@1
   160
+	  ctx->buflen &= 63;
yann@1
   161
 	  /* The regions in the following copy operation cannot overlap.  */
yann@1
   162
 	  memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
yann@1
   163
-		  (left_over + add) & 63);
yann@1
   164
-	  ctx->buflen = (left_over + add) & 63;
yann@1
   165
+		  ctx->buflen);
yann@1
   166
 	}
yann@1
   167
 
yann@1
   168
       buffer = (const char *) buffer + add;
yann@1
   169
@@ -251,8 +257,17 @@
yann@1
   170
   /* Move remaining bytes in internal buffer.  */
yann@1
   171
   if (len > 0)
yann@1
   172
     {
yann@1
   173
-      memcpy (ctx->buffer, buffer, len);
yann@1
   174
-      ctx->buflen = len;
yann@1
   175
+      size_t left_over = ctx->buflen;
yann@1
   176
+
yann@1
   177
+      memcpy (&ctx->buffer[left_over], buffer, len);
yann@1
   178
+      left_over += len;
yann@1
   179
+      if (left_over >= 64)
yann@1
   180
+	{
yann@1
   181
+	  md5_process_block (ctx->buffer, 64, ctx);
yann@1
   182
+	  left_over -= 64;
yann@1
   183
+	  memcpy (ctx->buffer, &ctx->buffer[64], left_over);
yann@1
   184
+	}
yann@1
   185
+      ctx->buflen = left_over;
yann@1
   186
     }
yann@1
   187
 }
yann@1
   188
 
yann@1
   189
--- glibc-2.1.3/md5-crypt/md5.h	2000/03/04 00:47:30	1.1
yann@1
   190
+++ glibc-2.1.3/md5-crypt/md5.h	2000/07/04 18:22:44	1.2
yann@1
   191
@@ -1,6 +1,6 @@
yann@1
   192
 /* Declaration of functions and data types used for MD5 sum computing
yann@1
   193
    library functions.
yann@1
   194
-   Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
yann@1
   195
+   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
yann@1
   196
    This file is part of the GNU C Library.
yann@1
   197
 
yann@1
   198
    The GNU C Library is free software; you can redistribute it and/or
yann@1
   199
@@ -87,7 +87,7 @@
yann@1
   200
 
yann@1
   201
   md5_uint32 total[2];
yann@1
   202
   md5_uint32 buflen;
yann@1
   203
-  char buffer[128];
yann@1
   204
+  char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
yann@1
   205
 };
yann@1
   206
 
yann@1
   207
 /*