]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
When using C-string lookup keys in a dynahash.c hash table, use strncpy()
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 18 Jun 2005 20:51:59 +0000 (20:51 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 18 Jun 2005 20:51:59 +0000 (20:51 +0000)
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.

src/backend/utils/hash/dynahash.c
src/include/utils/hsearch.h

index c6f9b0236975f153b3cdea846313e73161d6a1e2..ef92103b64a3ebaa7ea612d1a813298f5a41b3c1 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * 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
                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)
        {
                /*
@@ -644,7 +652,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 */
 
index 05d26e9a15092b95965fe1fe774a0bdd0812b8a8..d6f43163811a5e13ddec1609017defe5106569ae 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * 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 int (*HashCompareFunc) (const void *key1, const void *key2,
                                                                Size keysize);
+typedef void *(*HashCopyFunc) (void *dest, const void *src, Size keysize);
 
 /*
  * Space allocation function for a hashtable --- designed to match malloc().
@@ -108,6 +109,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 */