mirror of
https://github.com/postgres/postgres.git
synced 2025-05-18 17:41:14 +03:00
When using C-string lookup keys in a dynahash.c hash table, use strncpy()
not memcpy() to copy the offered key into the hash table during HASH_ENTER. This avoids possible core dump if the passed key is located very near the end of memory. Per report from Stefan Kaltenbrunner.
This commit is contained in:
parent
2b6dd51a5f
commit
41d28499a2
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/hash/dynahash.c,v 1.48 2003/08/19 01:13:41 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/hash/dynahash.c,v 1.48.2.1 2005/06/18 20:51:59 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -144,6 +144,14 @@ hash_create(const char *tabname, long nelem, HASHCTL *info, int flags)
|
|||||||
else
|
else
|
||||||
hashp->match = memcmp;
|
hashp->match = memcmp;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Similarly, the key-copying function defaults to strncpy() or memcpy().
|
||||||
|
*/
|
||||||
|
if (hashp->hash == string_hash)
|
||||||
|
hashp->keycopy = (HashCopyFunc) strncpy;
|
||||||
|
else
|
||||||
|
hashp->keycopy = memcpy;
|
||||||
|
|
||||||
if (flags & HASH_SHARED_MEM)
|
if (flags & HASH_SHARED_MEM)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -644,7 +652,7 @@ hash_search(HTAB *hashp,
|
|||||||
|
|
||||||
/* copy key into record */
|
/* copy key into record */
|
||||||
currBucket->hashvalue = hashvalue;
|
currBucket->hashvalue = hashvalue;
|
||||||
memcpy(ELEMENTKEY(currBucket), keyPtr, hctl->keysize);
|
hashp->keycopy(ELEMENTKEY(currBucket), keyPtr, hctl->keysize);
|
||||||
|
|
||||||
/* caller is expected to fill the data field on return */
|
/* caller is expected to fill the data field on return */
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: hsearch.h,v 1.29 2003/08/19 01:13:41 tgl Exp $
|
* $Id: hsearch.h,v 1.29.2.1 2005/06/18 20:51:59 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -24,6 +24,7 @@
|
|||||||
typedef uint32 (*HashValueFunc) (const void *key, Size keysize);
|
typedef uint32 (*HashValueFunc) (const void *key, Size keysize);
|
||||||
typedef int (*HashCompareFunc) (const void *key1, const void *key2,
|
typedef int (*HashCompareFunc) (const void *key1, const void *key2,
|
||||||
Size keysize);
|
Size keysize);
|
||||||
|
typedef void *(*HashCopyFunc) (void *dest, const void *src, Size keysize);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Space allocation function for a hashtable --- designed to match malloc().
|
* Space allocation function for a hashtable --- designed to match malloc().
|
||||||
@ -108,6 +109,7 @@ typedef struct HTAB
|
|||||||
* used */
|
* used */
|
||||||
char *tabname; /* table name (for error messages) */
|
char *tabname; /* table name (for error messages) */
|
||||||
bool isshared; /* true if table is in shared memory */
|
bool isshared; /* true if table is in shared memory */
|
||||||
|
HashCopyFunc keycopy; /* key copying function */
|
||||||
} HTAB;
|
} HTAB;
|
||||||
|
|
||||||
/* Parameter data structure for hash_create */
|
/* Parameter data structure for hash_create */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user