MemoryContext oldcxt,
entrycxt;
char *qstring;
- char key[NAMEDATALEN];
bool found;
/* Initialize the hash table, if necessary */
InitQueryHashTable();
/* Check for pre-existing entry of same name */
- /* See notes in FetchPreparedStatement */
- StrNCpy(key, stmt_name, sizeof(key));
-
- hash_search(prepared_queries, key, HASH_FIND, &found);
+ hash_search(prepared_queries, stmt_name, HASH_FIND, &found);
if (found)
ereport(ERROR,
/* Now we can add entry to hash table */
entry = (PreparedStatement *) hash_search(prepared_queries,
- key,
+ stmt_name,
HASH_ENTER,
&found);
PreparedStatement *
FetchPreparedStatement(const char *stmt_name, bool throwError)
{
- char key[NAMEDATALEN];
PreparedStatement *entry;
/*
* anything, therefore it couldn't possibly store our plan.
*/
if (prepared_queries)
- {
- /*
- * We can't just use the statement name as supplied by the user: the
- * hash package is picky enough that it needs to be NUL-padded out to
- * the appropriate length to work correctly.
- */
- StrNCpy(key, stmt_name, sizeof(key));
-
entry = (PreparedStatement *) hash_search(prepared_queries,
- key,
+ stmt_name,
HASH_FIND,
NULL);
- }
else
entry = NULL;
char *val = palloc(tok_len);
/* skip leading 'b' */
- strncpy(val, token + 1, tok_len - 1);
+ memcpy(val, token + 1, tok_len - 1);
val[tok_len - 1] = '\0';
result = (Node *) makeBitString(val);
break;
void *
ShmemInitStruct(const char *name, Size size, bool *foundPtr)
{
- ShmemIndexEnt *result,
- item;
+ ShmemIndexEnt *result;
void *structPtr;
- strncpy(item.key, name, SHMEM_INDEX_KEYSIZE);
- item.location = BAD_LOCATION;
-
LWLockAcquire(ShmemIndexLock, LW_EXCLUSIVE);
if (!ShmemIndex)
/* look it up in the shmem index */
result = (ShmemIndexEnt *)
- hash_search(ShmemIndex, (void *) &item, HASH_ENTER_NULL, foundPtr);
+ hash_search(ShmemIndex, name, HASH_ENTER_NULL, foundPtr);
if (!result)
{
{
/* out of memory */
Assert(ShmemIndex);
- hash_search(ShmemIndex, (void *) &item, HASH_REMOVE, NULL);
+ hash_search(ShmemIndex, name, HASH_REMOVE, NULL);
LWLockRelease(ShmemIndexLock);
ereport(WARNING,
(errcode(ERRCODE_OUT_OF_MEMORY),
- errmsg("could not allocate shared memory segment \"%s\"", name)));
+ errmsg("could not allocate shared memory segment \"%s\"",
+ name)));
*foundPtr = FALSE;
return NULL;
}
while (len > 0)
{
char buf[PG_SYSLOG_LIMIT + 1];
+ const char *nlpos;
int buflen;
int i;
continue;
}
- strncpy(buf, line, PG_SYSLOG_LIMIT);
- buf[PG_SYSLOG_LIMIT] = '\0';
- if (strchr(buf, '\n') != NULL)
- *strchr(buf, '\n') = '\0';
-
- buflen = strlen(buf);
+ /* copy one line, or as much as will fit, to buf */
+ nlpos = strchr(line, '\n');
+ if (nlpos != NULL)
+ buflen = nlpos - line;
+ else
+ buflen = len;
+ buflen = Min(buflen, PG_SYSLOG_LIMIT);
+ memcpy(buf, line, buflen);
+ buf[buflen] = '\0';
/* trim to multibyte letter boundary */
buflen = pg_mbcliplen(buf, buflen, buflen);
{
static HTAB *rendezvousHash = NULL;
- char key[NAMEDATALEN];
rendezvousHashEntry *hentry;
bool found;
HASH_ELEM);
}
- /* Turn the varName into a fixed-size string */
- StrNCpy(key, varName, sizeof(key));
-
/* Find or create the hashtable entry for this varName */
hentry = (rendezvousHashEntry *) hash_search(rendezvousHash,
- key,
+ varName,
HASH_ENTER,
&found);
}
+/*
+ * HashCompareFunc for string keys
+ *
+ * Because we copy keys with strlcpy(), they will be truncated at keysize-1
+ * bytes, so we can only compare that many ... hence strncmp is almost but
+ * not quite the right thing.
+ */
+static int
+string_compare(const char *key1, const char *key2, Size keysize)
+{
+ return strncmp(key1, key2, keysize - 1);
+}
+
+
/************************** CREATE ROUTINES **********************/
/*
hashp->hash = string_hash; /* default hash function */
/*
- * If you don't specify a match function, it defaults to strncmp() if you
- * used string_hash (either explicitly or by default) and to memcmp()
- * otherwise. (Prior to PostgreSQL 7.4, memcmp() was always used.)
+ * If you don't specify a match function, it defaults to string_compare
+ * if you used string_hash (either explicitly or by default) and to memcmp
+ * otherwise. (Prior to PostgreSQL 7.4, memcmp was always used.)
*/
if (flags & HASH_COMPARE)
hashp->match = info->match;
else if (hashp->hash == string_hash)
- hashp->match = (HashCompareFunc) strncmp;
+ hashp->match = (HashCompareFunc) string_compare;
else
hashp->match = memcmp;
/*
- * Similarly, the key-copying function defaults to strncpy() or memcpy().
+ * Similarly, the key-copying function defaults to strlcpy or memcpy.
*/
if (flags & HASH_KEYCOPY)
hashp->keycopy = info->keycopy;
else if (hashp->hash == string_hash)
- hashp->keycopy = (HashCopyFunc) strncpy;
+ hashp->keycopy = (HashCopyFunc) strlcpy;
else
hashp->keycopy = memcpy;
uint32
string_hash(const void *key, Size keysize)
{
+ /*
+ * If the string exceeds keysize-1 bytes, we want to hash only that many,
+ * because when it is copied into the hash table it will be truncated at
+ * that length.
+ */
+ Size s_len = strlen((const char *) key);
+
+ s_len = Min(s_len, keysize-1);
return DatumGetUInt32(hash_any((const unsigned char *) key,
- (int) strlen((const char *) key)));
+ (int) s_len));
}
/*
#endif
/* Update ps_buffer to contain both fixed part and activity */
- StrNCpy(ps_buffer + ps_buffer_fixed_size, activity,
+ strlcpy(ps_buffer + ps_buffer_fixed_size, activity,
ps_buffer_size - ps_buffer_fixed_size);
/* Transmit new setting to kernel, if necessary */
#define PortalHashTableLookup(NAME, PORTAL) \
do { \
- PortalHashEnt *hentry; char key[MAX_PORTALNAME_LEN]; \
+ PortalHashEnt *hentry; \
\
- MemSet(key, 0, MAX_PORTALNAME_LEN); \
- StrNCpy(key, NAME, MAX_PORTALNAME_LEN); \
hentry = (PortalHashEnt *) hash_search(PortalHashTable, \
- key, HASH_FIND, NULL); \
+ (NAME), HASH_FIND, NULL); \
if (hentry) \
PORTAL = hentry->portal; \
else \
#define PortalHashTableInsert(PORTAL, NAME) \
do { \
- PortalHashEnt *hentry; bool found; char key[MAX_PORTALNAME_LEN]; \
+ PortalHashEnt *hentry; bool found; \
\
- MemSet(key, 0, MAX_PORTALNAME_LEN); \
- StrNCpy(key, NAME, MAX_PORTALNAME_LEN); \
hentry = (PortalHashEnt *) hash_search(PortalHashTable, \
- key, HASH_ENTER, &found); \
+ (NAME), HASH_ENTER, &found); \
if (found) \
elog(ERROR, "duplicate portal name"); \
hentry->portal = PORTAL; \
#define PortalHashTableDelete(PORTAL) \
do { \
- PortalHashEnt *hentry; char key[MAX_PORTALNAME_LEN]; \
+ PortalHashEnt *hentry; \
\
- MemSet(key, 0, MAX_PORTALNAME_LEN); \
- StrNCpy(key, PORTAL->name, MAX_PORTALNAME_LEN); \
hentry = (PortalHashEnt *) hash_search(PortalHashTable, \
- key, HASH_REMOVE, NULL); \
+ PORTAL->name, HASH_REMOVE, NULL); \
if (hentry == NULL) \
elog(WARNING, "trying to delete portal name that does not exist"); \
} while(0)
const char *head, const char *tail)
{
if (ret_path != head)
- StrNCpy(ret_path, head, MAXPGPATH);
+ strlcpy(ret_path, head, MAXPGPATH);
/*
* Remove any leading "." and ".." in the tail component, adjusting head
* Set up my_exec_path without the actual executable name, and
* canonicalize to simplify comparison to bin_path.
*/
- StrNCpy(ret_path, my_exec_path, MAXPGPATH);
+ strlcpy(ret_path, my_exec_path, MAXPGPATH);
trim_directory(ret_path); /* remove my executable name */
canonicalize_path(ret_path);
}
no_match:
- StrNCpy(ret_path, target_path, MAXPGPATH);
+ strlcpy(ret_path, target_path, MAXPGPATH);
canonicalize_path(ret_path);
}
if (pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd) != 0)
return false;
- StrNCpy(ret_path, pwd->pw_dir, MAXPGPATH);
+ strlcpy(ret_path, pwd->pw_dir, MAXPGPATH);
return true;
#else
char tmppath[MAX_PATH];
#endif
#else
/* no strerror_r() available, just use strerror */
- StrNCpy(strerrbuf, strerror(errnum), buflen);
+ strlcpy(strerrbuf, strerror(errnum), buflen);
return strerrbuf;
#endif