diff --git a/contrib/isn/isn.c b/contrib/isn/isn.c index 3db6b84..3d2b06b 100644 --- a/contrib/isn/isn.c +++ b/contrib/isn/isn.c @@ -825,18 +825,18 @@ string2ean(const char *str, bool errorOK, ean13 *result, goto eanwrongtype; break; case ISMN: - strncpy(buf, "9790", 4); /* this isn't for sure yet, for now + memcpy(buf, "9790", 4); /* this isn't for sure yet, for now * ISMN it's only 9790 */ valid = (valid && ((rcheck = checkdig(buf + 3, 10)) == check || magic)); break; case ISBN: - strncpy(buf, "978", 3); + memcpy(buf, "978", 3); valid = (valid && ((rcheck = weight_checkdig(buf + 3, 10)) == check || magic)); break; case ISSN: - strncpy(buf + 10, "00", 2); /* append 00 as the normal issue + memcpy(buf + 10, "00", 2); /* append 00 as the normal issue * publication code */ - strncpy(buf, "977", 3); + memcpy(buf, "977", 3); valid = (valid && ((rcheck = weight_checkdig(buf + 3, 8)) == check || magic)); break; case UPC: diff --git a/contrib/pg_archivecleanup/pg_archivecleanup.c b/contrib/pg_archivecleanup/pg_archivecleanup.c index f12331a..59793a1 100644 --- a/contrib/pg_archivecleanup/pg_archivecleanup.c +++ b/contrib/pg_archivecleanup/pg_archivecleanup.c @@ -119,7 +119,7 @@ CleanupPriorWALFiles(void) { while ((xlde = readdir(xldir)) != NULL) { - strncpy(walfile, xlde->d_name, MAXPGPATH); + strlcpy(walfile, xlde->d_name, MAXPGPATH); TrimExtension(walfile, additional_ext); /* diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c index fff71e5..65c77c9 100644 --- a/contrib/pgbench/pgbench.c +++ b/contrib/pgbench/pgbench.c @@ -1779,7 +1779,7 @@ init(bool is_no_vacuum) { char buffer[256]; - strncpy(buffer, DDLAFTERs[i], 256); + strlcpy(buffer, DDLAFTERs[i], sizeof(buffer)); if (index_tablespace != NULL) { @@ -1787,7 +1787,7 @@ init(bool is_no_vacuum) escape_tablespace = PQescapeIdentifier(con, index_tablespace, strlen(index_tablespace)); - snprintf(buffer + strlen(buffer), 256 - strlen(buffer), + snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), " using index tablespace %s", escape_tablespace); PQfreemem(escape_tablespace); } diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index a95149b..5da0d48 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -5664,7 +5664,7 @@ recoveryStopsHere(XLogRecord *record, bool *includeThis) recordRestorePointData = (xl_restore_point *) XLogRecGetData(record); recordXtime = recordRestorePointData->rp_time; - strncpy(recordRPName, recordRestorePointData->rp_name, MAXFNAMELEN); + strlcpy(recordRPName, recordRestorePointData->rp_name, MAXFNAMELEN); } else return false; @@ -5759,7 +5759,7 @@ recoveryStopsHere(XLogRecord *record, bool *includeThis) } else { - strncpy(recoveryStopName, recordRPName, MAXFNAMELEN); + strlcpy(recoveryStopName, recordRPName, MAXFNAMELEN); ereport(LOG, (errmsg("recovery stopping at restore point \"%s\", time %s", @@ -6094,7 +6094,7 @@ StartupXLOG(void) * Save archive_cleanup_command in shared memory so that other processes * can see it. */ - strncpy(XLogCtl->archiveCleanupCommand, + strlcpy(XLogCtl->archiveCleanupCommand, archiveCleanupCommand ? archiveCleanupCommand : "", sizeof(XLogCtl->archiveCleanupCommand)); @@ -8795,7 +8795,7 @@ XLogRestorePoint(const char *rpName) xl_restore_point xlrec; xlrec.rp_time = GetCurrentTimestamp(); - strncpy(xlrec.rp_name, rpName, MAXFNAMELEN); + strlcpy(xlrec.rp_name, rpName, MAXFNAMELEN); rdata.buffer = InvalidBuffer; rdata.data = (char *) &xlrec; diff --git a/src/backend/access/transam/xlogarchive.c b/src/backend/access/transam/xlogarchive.c index 342975c..2502b16 100644 --- a/src/backend/access/transam/xlogarchive.c +++ b/src/backend/access/transam/xlogarchive.c @@ -458,7 +458,7 @@ KeepFileRestoredFromArchive(char *path, char *xlogfname) xlogfpath, oldpath))); } #else - strncpy(oldpath, xlogfpath, MAXPGPATH); + strlcpy(oldpath, xlogfpath, MAXPGPATH); #endif if (unlink(oldpath) != 0) ereport(FATAL, diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 1b8f109..50c879c 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -3824,7 +3824,7 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, bool print_tz, int tz, const char day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); tm->tm_wday = j2day(day); - strncpy(str, days[tm->tm_wday], 3); + memcpy(str, days[tm->tm_wday], 3); strcpy(str + 3, " "); if (DateOrder == DATEORDER_DMY) @@ -4307,8 +4307,7 @@ pg_timezone_abbrevs(PG_FUNCTION_ARGS) * Convert name to text, using upcasing conversion that is the inverse of * what ParseDateTime() uses. */ - strncpy(buffer, timezonetktbl[*pindex].token, TOKMAXLEN); - buffer[TOKMAXLEN] = '\0'; /* may not be null-terminated */ + strlcpy(buffer, timezonetktbl[*pindex].token, sizeof(buffer)); for (p = (unsigned char *) buffer; *p; p++) *p = pg_toupper(*p); diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index bcb9354..9185206 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -1231,7 +1231,6 @@ json_populate_record(PG_FUNCTION_ARGS) int i; Datum *values; bool *nulls; - char fname[NAMEDATALEN]; JsonHashEntry *hashentry; use_json_as_text = PG_ARGISNULL(2) ? false : PG_GETARG_BOOL(2); @@ -1351,9 +1350,7 @@ json_populate_record(PG_FUNCTION_ARGS) continue; } - memset(fname, 0, NAMEDATALEN); - strncpy(fname, NameStr(tupdesc->attrs[i]->attname), NAMEDATALEN); - hashentry = hash_search(json_hash, fname, HASH_FIND, NULL); + hashentry = hash_search(json_hash, &tupdesc->attrs[i]->attname, HASH_FIND, NULL); /* * we can't just skip here if the key wasn't found since we might have @@ -1495,9 +1492,7 @@ hash_object_field_end(void *state, char *fname, bool isnull) if (_state->lex->lex_level > 2 || strlen(fname) >= NAMEDATALEN) return; - memset(name, 0, NAMEDATALEN); - strncpy(name, fname, NAMEDATALEN); - + strncpy(name, fname, NAMEDATALEN); /* strncpy will 0 any remaining buffer space */ hashentry = hash_search(_state->hash, name, HASH_ENTER, &found); /* @@ -1721,7 +1716,6 @@ populate_recordset_object_end(void *state) HTAB *json_hash = _state->json_hash; Datum *values; bool *nulls; - char fname[NAMEDATALEN]; int i; RecordIOData *my_extra = _state->my_extra; int ncolumns = my_extra->ncolumns; @@ -1771,9 +1765,7 @@ populate_recordset_object_end(void *state) continue; } - memset(fname, 0, NAMEDATALEN); - strncpy(fname, NameStr(tupdesc->attrs[i]->attname), NAMEDATALEN); - hashentry = hash_search(json_hash, fname, HASH_FIND, NULL); + hashentry = hash_search(json_hash, &tupdesc->attrs[i]->attname, HASH_FIND, NULL); /* * we can't just skip here if the key wasn't found since we might have @@ -1902,9 +1894,7 @@ populate_recordset_object_field_end(void *state, char *fname, bool isnull) if (_state->lex->lex_level > 2 || strlen(fname) >= NAMEDATALEN) return; - memset(name, 0, NAMEDATALEN); - strncpy(name, fname, NAMEDATALEN); - + strncpy(name, fname, NAMEDATALEN); /* strncpy will 0 any remaining buffer space */ hashentry = hash_search(_state->json_hash, name, HASH_ENTER, &found); /* diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index e648792..794eeab 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -2100,7 +2100,7 @@ setup_formatted_log_time(void) /* 'paste' milliseconds into place... */ sprintf(msbuf, ".%03d", (int) (tv.tv_usec / 1000)); - strncpy(formatted_log_time + 19, msbuf, 4); + memcpy(formatted_log_time + 19, msbuf, 4); } /* diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c index cd2dded..7a7ad7c 100644 --- a/src/bin/pg_dump/pg_backup_db.c +++ b/src/bin/pg_dump/pg_backup_db.c @@ -399,6 +399,13 @@ ExecuteSqlCommand(ArchiveHandle *AH, const char *qry, const char *desc) default: /* trouble */ strncpy(errStmt, qry, DB_MAX_ERR_STMT); + + /* + * If qry was too long to fit in errStmt then the string won't + * be null terminated. For this case we'll change this to make + * the string end in "..." to show the user that the query was + * longer but we chopped it down a bit for display. + */ if (errStmt[DB_MAX_ERR_STMT - 1] != '\0') { errStmt[DB_MAX_ERR_STMT - 4] = '.'; diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c index b2990ca..6e25f46 100644 --- a/src/interfaces/ecpg/ecpglib/descriptor.c +++ b/src/interfaces/ecpg/ecpglib/descriptor.c @@ -210,7 +210,7 @@ get_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int va (struct ECPGgeneric_varchar *) var; if (varcharsize == 0) - strncpy(variable->arr, value, strlen(value)); + memcpy(variable->arr, value, strlen(value)); else strncpy(variable->arr, value, varcharsize); diff --git a/src/interfaces/ecpg/pgtypeslib/datetime.c b/src/interfaces/ecpg/pgtypeslib/datetime.c index 6600759..6391625 100644 --- a/src/interfaces/ecpg/pgtypeslib/datetime.c +++ b/src/interfaces/ecpg/pgtypeslib/datetime.c @@ -277,7 +277,7 @@ PGTYPESdate_fmt_asc(date dDate, const char *fmtstring, char *outbuf) return -1; snprintf(t, PGTYPES_DATE_NUM_MAX_DIGITS, "%u", replace_val.uint_val); - strncpy(start_pattern, t, strlen(t)); + memcpy(start_pattern, t, strlen(t)); free(t); } break; @@ -289,7 +289,7 @@ PGTYPESdate_fmt_asc(date dDate, const char *fmtstring, char *outbuf) return -1; snprintf(t, PGTYPES_DATE_NUM_MAX_DIGITS, "%02u", replace_val.uint_val); - strncpy(start_pattern, t, strlen(t)); + memcpy(start_pattern, t, strlen(t)); free(t); } break; @@ -301,7 +301,7 @@ PGTYPESdate_fmt_asc(date dDate, const char *fmtstring, char *outbuf) return -1; snprintf(t, PGTYPES_DATE_NUM_MAX_DIGITS, "%04u", replace_val.uint_val); - strncpy(start_pattern, t, strlen(t)); + memcpy(start_pattern, t, strlen(t)); free(t); } break; diff --git a/src/interfaces/libpq/fe-secure.c b/src/interfaces/libpq/fe-secure.c index d88c752..f39b91f 100644 --- a/src/interfaces/libpq/fe-secure.c +++ b/src/interfaces/libpq/fe-secure.c @@ -1074,7 +1074,7 @@ initialize_SSL(PGconn *conn) /* Read the client certificate file */ if (conn->sslcert && strlen(conn->sslcert) > 0) - strncpy(fnbuf, conn->sslcert, sizeof(fnbuf)); + strlcpy(fnbuf, conn->sslcert, sizeof(fnbuf)); else if (have_homedir) snprintf(fnbuf, sizeof(fnbuf), "%s/%s", homedir, USER_CERT_FILE); else @@ -1265,7 +1265,7 @@ initialize_SSL(PGconn *conn) #endif /* USE_SSL_ENGINE */ { /* PGSSLKEY is not an engine, treat it as a filename */ - strncpy(fnbuf, conn->sslkey, sizeof(fnbuf)); + strlcpy(fnbuf, conn->sslkey, sizeof(fnbuf)); } } else if (have_homedir) @@ -1328,7 +1328,7 @@ initialize_SSL(PGconn *conn) * verification after the connection has been completed. */ if (conn->sslrootcert && strlen(conn->sslrootcert) > 0) - strncpy(fnbuf, conn->sslrootcert, sizeof(fnbuf)); + strlcpy(fnbuf, conn->sslrootcert, sizeof(fnbuf)); else if (have_homedir) snprintf(fnbuf, sizeof(fnbuf), "%s/%s", homedir, ROOT_CERT_FILE); else @@ -1366,7 +1366,7 @@ initialize_SSL(PGconn *conn) if ((cvstore = SSL_CTX_get_cert_store(SSL_context)) != NULL) { if (conn->sslcrl && strlen(conn->sslcrl) > 0) - strncpy(fnbuf, conn->sslcrl, sizeof(fnbuf)); + strlcpy(fnbuf, conn->sslcrl, sizeof(fnbuf)); else if (have_homedir) snprintf(fnbuf, sizeof(fnbuf), "%s/%s", homedir, ROOT_CRL_FILE); else