1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/patches/glibc/2.1.3/rh62-03-glibc-2.1.3-crypt.patch Fri May 18 15:48:11 2007 +0000
1.3 @@ -0,0 +1,207 @@
1.4 +--- glibc-2.1.3/md5-crypt/md5-crypt.c 2000/03/04 00:47:30 1.1
1.5 ++++ glibc-2.1.3/md5-crypt/md5-crypt.c 2000/08/24 06:10:02 1.8
1.6 +@@ -1,5 +1,5 @@
1.7 + /* One way encryption based on MD5 sum.
1.8 +- Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc.
1.9 ++ Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
1.10 + This file is part of the GNU C Library.
1.11 + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
1.12 +
1.13 +@@ -18,6 +18,7 @@
1.14 + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
1.15 + Boston, MA 02111-1307, USA. */
1.16 +
1.17 ++#include <assert.h>
1.18 + #include <errno.h>
1.19 + #include <stdlib.h>
1.20 + #include <string.h>
1.21 +@@ -37,9 +38,9 @@
1.22 +
1.23 +
1.24 + /* Prototypes for local functions. */
1.25 +-extern char *__md5_crypt_r __P ((const char *key, const char *salt,
1.26 +- char *buffer, int buflen));
1.27 +-extern char *__md5_crypt __P ((const char *key, const char *salt));
1.28 ++extern char *__md5_crypt_r (const char *key, const char *salt,
1.29 ++ char *buffer, int buflen);
1.30 ++extern char *__md5_crypt (const char *key, const char *salt);
1.31 +
1.32 +
1.33 + /* This entry point is equivalent to the `crypt' function in Unix
1.34 +@@ -51,13 +52,16 @@
1.35 + char *buffer;
1.36 + int buflen;
1.37 + {
1.38 +- unsigned char alt_result[16];
1.39 ++ unsigned char alt_result[16]
1.40 ++ __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
1.41 + struct md5_ctx ctx;
1.42 + struct md5_ctx alt_ctx;
1.43 + size_t salt_len;
1.44 + size_t key_len;
1.45 + size_t cnt;
1.46 + char *cp;
1.47 ++ char *copied_key = NULL;
1.48 ++ char *copied_salt = NULL;
1.49 +
1.50 + /* Find beginning of salt string. The prefix should normally always
1.51 + be present. Just in case it is not. */
1.52 +@@ -68,6 +72,26 @@
1.53 + salt_len = MIN (strcspn (salt, "$"), 8);
1.54 + key_len = strlen (key);
1.55 +
1.56 ++ if ((key - (char *) 0) % __alignof__ (md5_uint32) != 0)
1.57 ++ {
1.58 ++ char *tmp = (char *) alloca (key_len + __alignof__ (md5_uint32));
1.59 ++ key = copied_key =
1.60 ++ memcpy (tmp + __alignof__ (md5_uint32)
1.61 ++ - (tmp - (char *) 0) % __alignof__ (md5_uint32),
1.62 ++ key, key_len);
1.63 ++ assert ((key - (char *) 0) % __alignof__ (md5_uint32) == 0);
1.64 ++ }
1.65 ++
1.66 ++ if ((salt - (char *) 0) % __alignof__ (md5_uint32) != 0)
1.67 ++ {
1.68 ++ char *tmp = (char *) alloca (salt_len + __alignof__ (md5_uint32));
1.69 ++ salt = copied_salt =
1.70 ++ memcpy (tmp + __alignof__ (md5_uint32)
1.71 ++ - (tmp - (char *) 0) % __alignof__ (md5_uint32),
1.72 ++ salt, salt_len);
1.73 ++ assert ((salt - (char *) 0) % __alignof__ (md5_uint32) == 0);
1.74 ++ }
1.75 ++
1.76 + /* Prepare for the real work. */
1.77 + __md5_init_ctx (&ctx);
1.78 +
1.79 +@@ -195,21 +219,30 @@
1.80 +
1.81 + /* Clear the buffer for the intermediate result so that people
1.82 + attaching to processes or reading core dumps cannot get any
1.83 +- information. */
1.84 +- memset (alt_result, '\0', sizeof (alt_result));
1.85 ++ information. We do it in this way to clear correct_words[]
1.86 ++ inside the MD5 implementation as well. */
1.87 ++ __md5_init_ctx (&ctx);
1.88 ++ __md5_finish_ctx (&ctx, alt_result);
1.89 ++ memset (&ctx, '\0', sizeof (ctx));
1.90 ++ memset (&alt_ctx, '\0', sizeof (alt_ctx));
1.91 ++ if (copied_key != NULL)
1.92 ++ memset (copied_key, '\0', key_len);
1.93 ++ if (copied_salt != NULL)
1.94 ++ memset (copied_salt, '\0', salt_len);
1.95 +
1.96 + return buffer;
1.97 + }
1.98 +
1.99 +
1.100 ++static char *buffer;
1.101 ++
1.102 + char *
1.103 + __md5_crypt (const char *key, const char *salt)
1.104 + {
1.105 + /* We don't want to have an arbitrary limit in the size of the
1.106 + password. We can compute the size of the result in advance and
1.107 + so we can prepare the buffer we pass to `md5_crypt_r'. */
1.108 +- static char *buffer = NULL;
1.109 +- static int buflen = 0;
1.110 ++ static int buflen;
1.111 + int needed = 3 + strlen (salt) + 1 + 26 + 1;
1.112 +
1.113 + if (buflen < needed)
1.114 +@@ -220,4 +253,12 @@
1.115 + }
1.116 +
1.117 + return __md5_crypt_r (key, salt, buffer, buflen);
1.118 ++}
1.119 ++
1.120 ++
1.121 ++static void
1.122 ++__attribute__ ((__destructor__))
1.123 ++free_mem (void)
1.124 ++{
1.125 ++ free (buffer);
1.126 + }
1.127 +--- glibc-2.1.3/md5-crypt/md5.c 2000/03/04 00:47:30 1.1
1.128 ++++ glibc-2.1.3/md5-crypt/md5.c 2000/07/04 18:22:44 1.2
1.129 +@@ -1,6 +1,6 @@
1.130 +-/* md5.c - Functions to compute MD5 message digest of files or memory blocks
1.131 ++/* Functions to compute MD5 message digest of files or memory blocks.
1.132 + according to the definition of MD5 in RFC 1321 from April 1992.
1.133 +- Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
1.134 ++ Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
1.135 + This file is part of the GNU C Library.
1.136 +
1.137 + The GNU C Library is free software; you can redistribute it and/or
1.138 +@@ -217,6 +217,8 @@
1.139 + size_t len;
1.140 + struct md5_ctx *ctx;
1.141 + {
1.142 ++ //const void aligned_buffer = buffer;
1.143 ++
1.144 + /* When we already have some bits in our internal buffer concatenate
1.145 + both inputs first. */
1.146 + if (ctx->buflen != 0)
1.147 +@@ -224,16 +226,20 @@
1.148 + size_t left_over = ctx->buflen;
1.149 + size_t add = 128 - left_over > len ? len : 128 - left_over;
1.150 +
1.151 ++ /* Only put full words in the buffer. */
1.152 ++ add -= add % __alignof__ (md5_uint32);
1.153 ++
1.154 + memcpy (&ctx->buffer[left_over], buffer, add);
1.155 + ctx->buflen += add;
1.156 +
1.157 +- if (left_over + add > 64)
1.158 ++ if (ctx->buflen > 64)
1.159 + {
1.160 +- md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
1.161 ++ md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
1.162 ++
1.163 ++ ctx->buflen &= 63;
1.164 + /* The regions in the following copy operation cannot overlap. */
1.165 + memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
1.166 +- (left_over + add) & 63);
1.167 +- ctx->buflen = (left_over + add) & 63;
1.168 ++ ctx->buflen);
1.169 + }
1.170 +
1.171 + buffer = (const char *) buffer + add;
1.172 +@@ -251,8 +257,17 @@
1.173 + /* Move remaining bytes in internal buffer. */
1.174 + if (len > 0)
1.175 + {
1.176 +- memcpy (ctx->buffer, buffer, len);
1.177 +- ctx->buflen = len;
1.178 ++ size_t left_over = ctx->buflen;
1.179 ++
1.180 ++ memcpy (&ctx->buffer[left_over], buffer, len);
1.181 ++ left_over += len;
1.182 ++ if (left_over >= 64)
1.183 ++ {
1.184 ++ md5_process_block (ctx->buffer, 64, ctx);
1.185 ++ left_over -= 64;
1.186 ++ memcpy (ctx->buffer, &ctx->buffer[64], left_over);
1.187 ++ }
1.188 ++ ctx->buflen = left_over;
1.189 + }
1.190 + }
1.191 +
1.192 +--- glibc-2.1.3/md5-crypt/md5.h 2000/03/04 00:47:30 1.1
1.193 ++++ glibc-2.1.3/md5-crypt/md5.h 2000/07/04 18:22:44 1.2
1.194 +@@ -1,6 +1,6 @@
1.195 + /* Declaration of functions and data types used for MD5 sum computing
1.196 + library functions.
1.197 +- Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc.
1.198 ++ Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
1.199 + This file is part of the GNU C Library.
1.200 +
1.201 + The GNU C Library is free software; you can redistribute it and/or
1.202 +@@ -87,7 +87,7 @@
1.203 +
1.204 + md5_uint32 total[2];
1.205 + md5_uint32 buflen;
1.206 +- char buffer[128];
1.207 ++ char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
1.208 + };
1.209 +
1.210 + /*