mirror of
https://github.com/postgres/postgres.git
synced 2025-08-18 12:22:09 +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:
@@ -9,7 +9,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/hash/dynahash.c,v 1.58 2004/12/31 22:01:37 pgsql Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/hash/dynahash.c,v 1.58.4.1 2005/06/18 20:51:44 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -143,6 +143,14 @@ hash_create(const char *tabname, long nelem, HASHCTL *info, int flags)
|
||||
else
|
||||
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)
|
||||
{
|
||||
/*
|
||||
@@ -657,7 +665,7 @@ hash_search(HTAB *hashp,
|
||||
|
||||
/* copy key into record */
|
||||
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 */
|
||||
|
||||
|
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/utils/hsearch.h,v 1.34 2004/12/31 22:03:46 pgsql Exp $
|
||||
* $PostgreSQL: pgsql/src/include/utils/hsearch.h,v 1.34.4.1 2005/06/18 20:51:44 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -16,15 +16,26 @@
|
||||
|
||||
|
||||
/*
|
||||
* Hash and comparison functions must have these signatures. Comparison
|
||||
* functions return zero for match, nonzero for no match. (The comparison
|
||||
* function definition is designed to allow memcmp() and strncmp() to be
|
||||
* used directly as key comparison functions.)
|
||||
* Hash functions must have this signature.
|
||||
*/
|
||||
typedef uint32 (*HashValueFunc) (const void *key, Size keysize);
|
||||
|
||||
/*
|
||||
* Key comparison functions must have this signature. Comparison functions
|
||||
* return zero for match, nonzero for no match. (The comparison function
|
||||
* definition is designed to allow memcmp() and strncmp() to be used directly
|
||||
* as key comparison functions.)
|
||||
*/
|
||||
typedef int (*HashCompareFunc) (const void *key1, const void *key2,
|
||||
Size keysize);
|
||||
|
||||
/*
|
||||
* Key copying functions must have this signature. The return value is not
|
||||
* used. (The definition is set up to allow memcpy() and strncpy() to be
|
||||
* used directly.)
|
||||
*/
|
||||
typedef void *(*HashCopyFunc) (void *dest, const void *src, Size keysize);
|
||||
|
||||
/*
|
||||
* Space allocation function for a hashtable --- designed to match malloc().
|
||||
* Note: there is no free function API; can't destroy a hashtable unless you
|
||||
@@ -108,6 +119,7 @@ typedef struct HTAB
|
||||
* used */
|
||||
char *tabname; /* table name (for error messages) */
|
||||
bool isshared; /* true if table is in shared memory */
|
||||
HashCopyFunc keycopy; /* key copying function */
|
||||
} HTAB;
|
||||
|
||||
/* Parameter data structure for hash_create */
|
||||
|
Reference in New Issue
Block a user