Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/my/mysql-4.1
This commit is contained in:
commit
4d0fd66bdd
@ -60,8 +60,8 @@ typedef struct SHA1_CONTEXT
|
||||
|
||||
C_MODE_START
|
||||
|
||||
int sha1_reset( SHA1_CONTEXT* );
|
||||
int sha1_input( SHA1_CONTEXT*, const uint8 *, unsigned int );
|
||||
int sha1_result( SHA1_CONTEXT* , uint8 Message_Digest[SHA1_HASH_SIZE] );
|
||||
int mysql_sha1_reset(SHA1_CONTEXT*);
|
||||
int mysql_sha1_input(SHA1_CONTEXT*, const uint8 *, unsigned int);
|
||||
int mysql_sha1_result(SHA1_CONTEXT* , uint8 Message_Digest[SHA1_HASH_SIZE]);
|
||||
|
||||
C_MODE_END
|
||||
|
@ -1070,3 +1070,11 @@ char(a)
|
||||
1
|
||||
2
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (t TINYTEXT CHARACTER SET utf8);
|
||||
INSERT INTO t1 VALUES(REPEAT('a', 100));
|
||||
CREATE TEMPORARY TABLE t2 SELECT COALESCE(t) AS bug FROM t1;
|
||||
SELECT LENGTH(bug) FROM t2;
|
||||
LENGTH(bug)
|
||||
100
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
|
@ -882,4 +882,14 @@ set names utf8;
|
||||
select distinct char(a) from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#15581: COALESCE function truncates mutli-byte TINYTEXT values
|
||||
#
|
||||
CREATE TABLE t1 (t TINYTEXT CHARACTER SET utf8);
|
||||
INSERT INTO t1 VALUES(REPEAT('a', 100));
|
||||
CREATE TEMPORARY TABLE t2 SELECT COALESCE(t) AS bug FROM t1;
|
||||
SELECT LENGTH(bug) FROM t2;
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
16
mysys/sha1.c
16
mysys/sha1.c
@ -69,7 +69,7 @@ static void SHA1ProcessMessageBlock(SHA1_CONTEXT*);
|
||||
Initialize SHA1Context
|
||||
|
||||
SYNOPSIS
|
||||
sha1_reset()
|
||||
mysql_sha1_reset()
|
||||
context [in/out] The context to reset.
|
||||
|
||||
DESCRIPTION
|
||||
@ -92,7 +92,7 @@ const uint32 sha_const_key[5]=
|
||||
};
|
||||
|
||||
|
||||
int sha1_reset(SHA1_CONTEXT *context)
|
||||
int mysql_sha1_reset(SHA1_CONTEXT *context)
|
||||
{
|
||||
#ifndef DBUG_OFF
|
||||
if (!context)
|
||||
@ -119,7 +119,7 @@ int sha1_reset(SHA1_CONTEXT *context)
|
||||
Return the 160-bit message digest into the array provided by the caller
|
||||
|
||||
SYNOPSIS
|
||||
sha1_result()
|
||||
mysql_sha1_result()
|
||||
context [in/out] The context to use to calculate the SHA-1 hash.
|
||||
Message_Digest: [out] Where the digest is returned.
|
||||
|
||||
@ -132,8 +132,8 @@ int sha1_reset(SHA1_CONTEXT *context)
|
||||
!= SHA_SUCCESS sha Error Code.
|
||||
*/
|
||||
|
||||
int sha1_result(SHA1_CONTEXT *context,
|
||||
uint8 Message_Digest[SHA1_HASH_SIZE])
|
||||
int mysql_sha1_result(SHA1_CONTEXT *context,
|
||||
uint8 Message_Digest[SHA1_HASH_SIZE])
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -165,7 +165,7 @@ int sha1_result(SHA1_CONTEXT *context,
|
||||
Accepts an array of octets as the next portion of the message.
|
||||
|
||||
SYNOPSIS
|
||||
sha1_input()
|
||||
mysql_sha1_input()
|
||||
context [in/out] The SHA context to update
|
||||
message_array An array of characters representing the next portion
|
||||
of the message.
|
||||
@ -176,8 +176,8 @@ int sha1_result(SHA1_CONTEXT *context,
|
||||
!= SHA_SUCCESS sha Error Code.
|
||||
*/
|
||||
|
||||
int sha1_input(SHA1_CONTEXT *context, const uint8 *message_array,
|
||||
unsigned length)
|
||||
int mysql_sha1_input(SHA1_CONTEXT *context, const uint8 *message_array,
|
||||
unsigned length)
|
||||
{
|
||||
if (!length)
|
||||
return SHA_SUCCESS;
|
||||
|
@ -6949,11 +6949,11 @@ uint32 Field_blob::max_length()
|
||||
switch (packlength)
|
||||
{
|
||||
case 1:
|
||||
return 255;
|
||||
return 255 * field_charset->mbmaxlen;
|
||||
case 2:
|
||||
return 65535;
|
||||
return 65535 * field_charset->mbmaxlen;
|
||||
case 3:
|
||||
return 16777215;
|
||||
return 16777215 * field_charset->mbmaxlen;
|
||||
case 4:
|
||||
return (uint32) 4294967295U;
|
||||
default:
|
||||
|
@ -131,11 +131,13 @@ String *Item_func_sha::val_str(String *str)
|
||||
SHA1_CONTEXT context; /* Context used to generate SHA1 hash */
|
||||
/* Temporary buffer to store 160bit digest */
|
||||
uint8 digest[SHA1_HASH_SIZE];
|
||||
sha1_reset(&context); /* We do not have to check for error here */
|
||||
mysql_sha1_reset(&context); /* We do not have to check for error here */
|
||||
/* No need to check error as the only case would be too long message */
|
||||
sha1_input(&context,(const unsigned char *) sptr->ptr(), sptr->length());
|
||||
mysql_sha1_input(&context,
|
||||
(const unsigned char *) sptr->ptr(), sptr->length());
|
||||
/* Ensure that memory is free and we got result */
|
||||
if (!( str->alloc(SHA1_HASH_SIZE*2) || (sha1_result(&context,digest))))
|
||||
if (!( str->alloc(SHA1_HASH_SIZE*2) ||
|
||||
(mysql_sha1_result(&context,digest))))
|
||||
{
|
||||
sprintf((char *) str->ptr(),
|
||||
"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\
|
||||
|
@ -392,15 +392,15 @@ make_scrambled_password(char *to, const char *password)
|
||||
SHA1_CONTEXT sha1_context;
|
||||
uint8 hash_stage2[SHA1_HASH_SIZE];
|
||||
|
||||
sha1_reset(&sha1_context);
|
||||
mysql_sha1_reset(&sha1_context);
|
||||
/* stage 1: hash password */
|
||||
sha1_input(&sha1_context, (uint8 *) password, strlen(password));
|
||||
sha1_result(&sha1_context, (uint8 *) to);
|
||||
mysql_sha1_input(&sha1_context, (uint8 *) password, strlen(password));
|
||||
mysql_sha1_result(&sha1_context, (uint8 *) to);
|
||||
/* stage 2: hash stage1 output */
|
||||
sha1_reset(&sha1_context);
|
||||
sha1_input(&sha1_context, (uint8 *) to, SHA1_HASH_SIZE);
|
||||
mysql_sha1_reset(&sha1_context);
|
||||
mysql_sha1_input(&sha1_context, (uint8 *) to, SHA1_HASH_SIZE);
|
||||
/* separate buffer is used to pass 'to' in octet2hex */
|
||||
sha1_result(&sha1_context, hash_stage2);
|
||||
mysql_sha1_result(&sha1_context, hash_stage2);
|
||||
/* convert hash_stage2 to hex string */
|
||||
*to++= PVERSION41_CHAR;
|
||||
octet2hex(to, hash_stage2, SHA1_HASH_SIZE);
|
||||
@ -431,20 +431,20 @@ scramble(char *to, const char *message, const char *password)
|
||||
uint8 hash_stage1[SHA1_HASH_SIZE];
|
||||
uint8 hash_stage2[SHA1_HASH_SIZE];
|
||||
|
||||
sha1_reset(&sha1_context);
|
||||
mysql_sha1_reset(&sha1_context);
|
||||
/* stage 1: hash password */
|
||||
sha1_input(&sha1_context, (uint8 *) password, strlen(password));
|
||||
sha1_result(&sha1_context, hash_stage1);
|
||||
mysql_sha1_input(&sha1_context, (uint8 *) password, strlen(password));
|
||||
mysql_sha1_result(&sha1_context, hash_stage1);
|
||||
/* stage 2: hash stage 1; note that hash_stage2 is stored in the database */
|
||||
sha1_reset(&sha1_context);
|
||||
sha1_input(&sha1_context, hash_stage1, SHA1_HASH_SIZE);
|
||||
sha1_result(&sha1_context, hash_stage2);
|
||||
mysql_sha1_reset(&sha1_context);
|
||||
mysql_sha1_input(&sha1_context, hash_stage1, SHA1_HASH_SIZE);
|
||||
mysql_sha1_result(&sha1_context, hash_stage2);
|
||||
/* create crypt string as sha1(message, hash_stage2) */;
|
||||
sha1_reset(&sha1_context);
|
||||
sha1_input(&sha1_context, (const uint8 *) message, SCRAMBLE_LENGTH);
|
||||
sha1_input(&sha1_context, hash_stage2, SHA1_HASH_SIZE);
|
||||
mysql_sha1_reset(&sha1_context);
|
||||
mysql_sha1_input(&sha1_context, (const uint8 *) message, SCRAMBLE_LENGTH);
|
||||
mysql_sha1_input(&sha1_context, hash_stage2, SHA1_HASH_SIZE);
|
||||
/* xor allows 'from' and 'to' overlap: lets take advantage of it */
|
||||
sha1_result(&sha1_context, (uint8 *) to);
|
||||
mysql_sha1_result(&sha1_context, (uint8 *) to);
|
||||
my_crypt(to, (const uchar *) to, hash_stage1, SCRAMBLE_LENGTH);
|
||||
}
|
||||
|
||||
@ -477,17 +477,17 @@ check_scramble(const char *scramble, const char *message,
|
||||
uint8 buf[SHA1_HASH_SIZE];
|
||||
uint8 hash_stage2_reassured[SHA1_HASH_SIZE];
|
||||
|
||||
sha1_reset(&sha1_context);
|
||||
mysql_sha1_reset(&sha1_context);
|
||||
/* create key to encrypt scramble */
|
||||
sha1_input(&sha1_context, (const uint8 *) message, SCRAMBLE_LENGTH);
|
||||
sha1_input(&sha1_context, hash_stage2, SHA1_HASH_SIZE);
|
||||
sha1_result(&sha1_context, buf);
|
||||
mysql_sha1_input(&sha1_context, (const uint8 *) message, SCRAMBLE_LENGTH);
|
||||
mysql_sha1_input(&sha1_context, hash_stage2, SHA1_HASH_SIZE);
|
||||
mysql_sha1_result(&sha1_context, buf);
|
||||
/* encrypt scramble */
|
||||
my_crypt((char *) buf, buf, (const uchar *) scramble, SCRAMBLE_LENGTH);
|
||||
/* now buf supposedly contains hash_stage1: so we can get hash_stage2 */
|
||||
sha1_reset(&sha1_context);
|
||||
sha1_input(&sha1_context, buf, SHA1_HASH_SIZE);
|
||||
sha1_result(&sha1_context, hash_stage2_reassured);
|
||||
mysql_sha1_reset(&sha1_context);
|
||||
mysql_sha1_input(&sha1_context, buf, SHA1_HASH_SIZE);
|
||||
mysql_sha1_result(&sha1_context, hash_stage2_reassured);
|
||||
return memcmp(hash_stage2, hash_stage2_reassured, SHA1_HASH_SIZE);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user