diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index 0ff9ca9f2c..bc67b20e0f 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -152,7 +152,7 @@ CreateComments(Oid oid, Oid classoid, int32 subid, const char *comment) int i; /* Reduce empty-string to NULL case */ - if (comment != NULL && strlen(comment) == 0) + if (comment != NULL && comment[0] == '\0') comment = NULL; /* Prepare to form or update a tuple, if necessary */ @@ -247,7 +247,7 @@ CreateSharedComments(Oid oid, Oid classoid, const char *comment) int i; /* Reduce empty-string to NULL case */ - if (comment != NULL && strlen(comment) == 0) + if (comment != NULL && comment[0] == '\0') comment = NULL; /* Prepare to form or update a tuple, if necessary */ diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 694114aded..331f4cde99 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -907,7 +907,7 @@ interpret_AS_clause(Oid languageOid, const char *languageName, * modicum of backwards compatibility, accept an empty "prosrc" * value as meaning the supplied SQL function name. */ - if (strlen(*prosrc_str_p) == 0) + if (**prosrc_str_p == '\0') *prosrc_str_p = funcname; } } diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 2baca12c5f..0ba0a65da6 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -2369,11 +2369,12 @@ ChooseIndexColumnNames(List *indexElems) foreach(lc, indexElems) { + char buf[NAMEDATALEN]; IndexElem *ielem = (IndexElem *) lfirst(lc); const char *origname; const char *curname; int i; - char buf[NAMEDATALEN]; + int origlen; /* Get the preliminary name from the IndexElem */ if (ielem->indexcolname) @@ -2384,6 +2385,7 @@ ChooseIndexColumnNames(List *indexElems) origname = "expr"; /* default name for expression */ /* If it conflicts with any previous column, tweak it */ + origlen = strlen(origname); curname = origname; for (i = 1;; i++) { @@ -2399,11 +2401,11 @@ ChooseIndexColumnNames(List *indexElems) if (lc2 == NULL) break; /* found nonconflicting name */ - sprintf(nbuf, "%d", i); + nlen = sprintf(nbuf, "%d", i); /* Ensure generated names are shorter than NAMEDATALEN */ - nlen = pg_mbcliplen(origname, strlen(origname), - NAMEDATALEN - 1 - strlen(nbuf)); + nlen = pg_mbcliplen(origname, origlen, + NAMEDATALEN - 1 - nlen); memcpy(buf, origname, nlen); strcpy(buf + nlen, nbuf); curname = buf; diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 0578e92ba9..ade71ba00b 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -571,6 +571,7 @@ PostmasterMain(int argc, char *argv[]) char *userDoption = NULL; bool listen_addr_saved = false; int i; + int len; char *output_config_variable = NULL; InitProcessGlobals(); @@ -759,8 +760,9 @@ PostmasterMain(int argc, char *argv[]) case 'o': /* Other options to pass to the backend on the command line */ - snprintf(ExtraOptions + strlen(ExtraOptions), - sizeof(ExtraOptions) - strlen(ExtraOptions), + len = strlen(ExtraOptions); + snprintf(ExtraOptions + len, + sizeof(ExtraOptions) - len, " %s", optarg); break; diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index e4fd1f9bb6..77f1d9a8f1 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -300,11 +300,11 @@ libpqrcv_get_senderinfo(WalReceiverConn *conn, char **sender_host, Assert(conn->streamConn != NULL); ret = PQhost(conn->streamConn); - if (ret && strlen(ret) != 0) + if (ret && ret[0] != '\0') *sender_host = pstrdup(ret); ret = PQport(conn->streamConn); - if (ret && strlen(ret) != 0) + if (ret && ret[0] != '\0') *sender_port = atoi(ret); } diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index abae74c9a5..97f62635eb 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -174,8 +174,10 @@ bool ReplicationSlotValidateName(const char *name, int elevel) { const char *cp; + int len; - if (strlen(name) == 0) + len = strlen(name); + if (len == 0) { ereport(elevel, (errcode(ERRCODE_INVALID_NAME), @@ -184,7 +186,7 @@ ReplicationSlotValidateName(const char *name, int elevel) return false; } - if (strlen(name) >= NAMEDATALEN) + if (len >= NAMEDATALEN) { ereport(elevel, (errcode(ERRCODE_NAME_TOO_LONG), diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 7dc6dd2f15..5f04b34ee1 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -3077,7 +3077,7 @@ RemovePgTempFilesInDir(const char *tmpdirname, bool missing_ok, bool unlink_all) if (unlink_all || strncmp(temp_de->d_name, PG_TEMP_FILE_PREFIX, - strlen(PG_TEMP_FILE_PREFIX)) == 0) + sizeof(PG_TEMP_FILE_PREFIX) - 1) == 0) { struct stat statbuf; @@ -3543,7 +3543,7 @@ fsync_parent_path(const char *fname, int elevel) * just a file name (see comments in path.c), so handle that as being the * current directory. */ - if (strlen(parentpath) == 0) + if (parentpath[0] == '\0') strlcpy(parentpath, ".", MAXPGPATH); if (fsync_fname_ext(parentpath, true, false, elevel) != 0) diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c index ef64d08357..2238d59351 100644 --- a/src/backend/storage/ipc/dsm.c +++ b/src/backend/storage/ipc/dsm.c @@ -283,11 +283,10 @@ dsm_cleanup_for_mmap(void) /* Scan the directory for something with a name of the correct format. */ dir = AllocateDir(PG_DYNSHMEM_DIR); - while ((dent = ReadDir(dir, PG_DYNSHMEM_DIR)) != NULL) { - if (strncmp(dent->d_name, PG_DYNSHMEM_MMAP_FILE_PREFIX, - strlen(PG_DYNSHMEM_MMAP_FILE_PREFIX)) == 0) + if (strncmp(dent->d_name, PG_DYNSHMEM_MMAP_FILE_PREFIX, + (sizeof(PG_DYNSHMEM_MMAP_FILE_PREFIX) - 1)) == 0) { char buf[MAXPGPATH + sizeof(PG_DYNSHMEM_DIR)]; diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c index 8aab96d3b0..897481f745 100644 --- a/src/backend/tsearch/spell.c +++ b/src/backend/tsearch/spell.c @@ -1225,35 +1225,35 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename) } if (STRNCMP(recoded, "COMPOUNDFLAG") == 0) - addCompoundAffixFlagValue(Conf, recoded + strlen("COMPOUNDFLAG"), + addCompoundAffixFlagValue(Conf, recoded + sizeof("COMPOUNDFLAG") - 1, FF_COMPOUNDFLAG); else if (STRNCMP(recoded, "COMPOUNDBEGIN") == 0) - addCompoundAffixFlagValue(Conf, recoded + strlen("COMPOUNDBEGIN"), + addCompoundAffixFlagValue(Conf, recoded + sizeof("COMPOUNDBEGIN") - 1, FF_COMPOUNDBEGIN); else if (STRNCMP(recoded, "COMPOUNDLAST") == 0) - addCompoundAffixFlagValue(Conf, recoded + strlen("COMPOUNDLAST"), + addCompoundAffixFlagValue(Conf, recoded + sizeof("COMPOUNDLAST") - 1, FF_COMPOUNDLAST); /* COMPOUNDLAST and COMPOUNDEND are synonyms */ else if (STRNCMP(recoded, "COMPOUNDEND") == 0) - addCompoundAffixFlagValue(Conf, recoded + strlen("COMPOUNDEND"), + addCompoundAffixFlagValue(Conf, recoded + sizeof("COMPOUNDEND") - 1, FF_COMPOUNDLAST); else if (STRNCMP(recoded, "COMPOUNDMIDDLE") == 0) - addCompoundAffixFlagValue(Conf, recoded + strlen("COMPOUNDMIDDLE"), + addCompoundAffixFlagValue(Conf, recoded + sizeof("COMPOUNDMIDDLE") - 1, FF_COMPOUNDMIDDLE); else if (STRNCMP(recoded, "ONLYINCOMPOUND") == 0) - addCompoundAffixFlagValue(Conf, recoded + strlen("ONLYINCOMPOUND"), + addCompoundAffixFlagValue(Conf, recoded + sizeof("ONLYINCOMPOUND") - 1, FF_COMPOUNDONLY); else if (STRNCMP(recoded, "COMPOUNDPERMITFLAG") == 0) addCompoundAffixFlagValue(Conf, - recoded + strlen("COMPOUNDPERMITFLAG"), + recoded + sizeof("COMPOUNDPERMITFLAG") - 1, FF_COMPOUNDPERMITFLAG); else if (STRNCMP(recoded, "COMPOUNDFORBIDFLAG") == 0) addCompoundAffixFlagValue(Conf, - recoded + strlen("COMPOUNDFORBIDFLAG"), + recoded + sizeof("COMPOUNDFORBIDFLAG") - 1, FF_COMPOUNDFORBIDFLAG); else if (STRNCMP(recoded, "FLAG") == 0) { - char *s = recoded + strlen("FLAG"); + char *s = recoded + sizeof("FLAG") - 1; while (*s && t_isspace(s)) s += pg_mblen(s); diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 4c299057a6..2c197958e3 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -2631,13 +2631,13 @@ xmldata_root_element_start(StringInfo result, const char *eltname, if (top_level) { appendStringInfoString(result, " xmlns:xsi=\"" NAMESPACE_XSI "\""); - if (strlen(targetns) > 0) + if (targetns[0] != '\0') appendStringInfo(result, " xmlns=\"%s\"", targetns); } if (xmlschema) { /* FIXME: better targets */ - if (strlen(targetns) > 0) + if (targetns[0] != '\0') appendStringInfo(result, " xsi:schemaLocation=\"%s #\"", targetns); else appendStringInfoString(result, " xsi:noNamespaceSchemaLocation=\"#\""); @@ -2900,7 +2900,7 @@ xsd_schema_element_start(StringInfo result, const char *targetns) appendStringInfoString(result, " 0) + if (targetns[0] != '\0') appendStringInfo(result, "\n" " targetNamespace=\"%s\"\n" diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.c index 9dff1f5e82..1137c70370 100644 --- a/src/backend/utils/fmgr/dfmgr.c +++ b/src/backend/utils/fmgr/dfmgr.c @@ -566,8 +566,8 @@ substitute_libpath_macro(const char *name) if ((sep_ptr = first_dir_separator(name)) == NULL) sep_ptr = name + strlen(name); - if (strlen("$libdir") != sep_ptr - name || - strncmp(name, "$libdir", strlen("$libdir")) != 0) + if ((sizeof("$libdir") - 1) != sep_ptr - name || + strncmp(name, "$libdir", sizeof("$libdir") - 1) != 0) ereport(ERROR, (errcode(ERRCODE_INVALID_NAME), errmsg("invalid macro name in dynamic library path: %s", @@ -594,7 +594,7 @@ find_in_dynamic_libpath(const char *basename) AssertState(Dynamic_library_path != NULL); p = Dynamic_library_path; - if (strlen(p) == 0) + if (p[0] == '\0') return NULL; baselen = strlen(basename); diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 6fe25c023a..73fe12421e 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -1177,8 +1177,9 @@ CreateLockFile(const char *filename, bool amPostmaster, strlcat(buffer, "\n", sizeof(buffer)); errno = 0; + len = strlen(buffer); pgstat_report_wait_start(WAIT_EVENT_LOCK_FILE_CREATE_WRITE); - if (write(fd, buffer, strlen(buffer)) != strlen(buffer)) + if (write(fd, buffer, len) != len) { int save_errno = errno; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 5bdc02fce2..a00cca2605 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10699,10 +10699,15 @@ GUCArrayDelete(ArrayType *array, const char *name) struct config_generic *record; ArrayType *newarray; int i; + int len; int index; Assert(name); + /* if array is currently null, then surely nothing to delete */ + if (!array) + return NULL; + /* test if the option is valid and we're allowed to set it */ (void) validate_option_array_item(name, NULL, false); @@ -10711,12 +10716,9 @@ GUCArrayDelete(ArrayType *array, const char *name) if (record) name = record->name; - /* if array is currently null, then surely nothing to delete */ - if (!array) - return NULL; - newarray = NULL; index = 1; + len = strlen(name); for (i = 1; i <= ARR_DIMS(array)[0]; i++) { @@ -10735,8 +10737,8 @@ GUCArrayDelete(ArrayType *array, const char *name) val = TextDatumGetCString(d); /* ignore entry if it's what we want to delete */ - if (strncmp(val, name, strlen(name)) == 0 - && val[strlen(name)] == '=') + if (strncmp(val, name, len) == 0 + && val[len] == '=') continue; /* else add it to the output array */ diff --git a/src/common/exec.c b/src/common/exec.c index f39b0a294b..fc360c2ef2 100644 --- a/src/common/exec.c +++ b/src/common/exec.c @@ -325,6 +325,7 @@ find_other_exec(const char *argv0, const char *target, { char cmd[MAXPGPATH]; char line[MAXPGPATH]; + int len; if (find_my_exec(argv0, retpath) < 0) return -1; @@ -334,7 +335,8 @@ find_other_exec(const char *argv0, const char *target, canonicalize_path(retpath); /* Now append the other program's name */ - snprintf(retpath + strlen(retpath), MAXPGPATH - strlen(retpath), + len = strlen(retpath); + snprintf(retpath + len, MAXPGPATH - len, "/%s%s", target, EXE); if (validate_exec(retpath) != 0) diff --git a/src/common/file_utils.c b/src/common/file_utils.c index 7584c1f2fb..193cb72c5a 100644 --- a/src/common/file_utils.c +++ b/src/common/file_utils.c @@ -320,7 +320,7 @@ fsync_parent_path(const char *fname) * just a file name (see comments in path.c), so handle that as being the * current directory. */ - if (strlen(parentpath) == 0) + if (parentpath[0] == '\0') strlcpy(parentpath, ".", MAXPGPATH); if (fsync_fname(parentpath, true) != 0) diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c index 66a50f183f..24bc469a4c 100644 --- a/src/fe_utils/print.c +++ b/src/fe_utils/print.c @@ -246,6 +246,7 @@ format_numeric_locale(const char *my_str) char *new_str; int new_len, int_len, + len, leading_digits, i, new_str_pos; @@ -275,13 +276,14 @@ format_numeric_locale(const char *my_str) } /* process integer part of number */ + len = strlen(thousands_sep); for (i = 0; i < int_len; i++) { /* Time to insert separator? */ if (i > 0 && --leading_digits == 0) { strcpy(&new_str[new_str_pos], thousands_sep); - new_str_pos += strlen(thousands_sep); + new_str_pos += len; leading_digits = groupdigits; } new_str[new_str_pos++] = my_str[i]; diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index c8869d5226..c41620da11 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -174,8 +174,8 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader; * be complete yet. */ #define IsPartialXLogFileName(fname) \ - (strlen(fname) == XLOG_FNAME_LEN + strlen(".partial") && \ - strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN && \ + (strlen(fname) == XLOG_FNAME_LEN + sizeof(".partial") - 1 && \ + strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN && \ strcmp((fname) + XLOG_FNAME_LEN, ".partial") == 0) #define XLogFromFileName(fname, tli, logSegNo, wal_segsz_bytes) \ @@ -195,8 +195,8 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader; snprintf(fname, MAXFNAMELEN, "%08X.history", tli) #define IsTLHistoryFileName(fname) \ - (strlen(fname) == 8 + strlen(".history") && \ - strspn(fname, "0123456789ABCDEF") == 8 && \ + (strlen(fname) == 8 + sizeof(".history") - 1 && \ + strspn(fname, "0123456789ABCDEF") == 8 && \ strcmp((fname) + 8, ".history") == 0) #define TLHistoryFilePath(path, tli) \ @@ -214,7 +214,7 @@ typedef XLogLongPageHeaderData *XLogLongPageHeader; #define IsBackupHistoryFileName(fname) \ (strlen(fname) > XLOG_FNAME_LEN && \ strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN && \ - strcmp((fname) + strlen(fname) - strlen(".backup"), ".backup") == 0) + strcmp((fname) + strlen(fname) - sizeof(".backup") - 1, ".backup") == 0) #define BackupHistoryFilePath(path, tli, logSegNo, startpoint, wal_segsz_bytes) \ snprintf(path, MAXPGPATH, XLOGDIR "/%08X%08X%08X.%08X.backup", tli, \ diff --git a/src/interfaces/libpq/fe-auth-scram.c b/src/interfaces/libpq/fe-auth-scram.c index 69fcbdf6e2..d118a421f5 100644 --- a/src/interfaces/libpq/fe-auth-scram.c +++ b/src/interfaces/libpq/fe-auth-scram.c @@ -592,6 +592,7 @@ read_server_first_message(fe_scram_state *state, char *input) char *encoded_salt; char *nonce; int decoded_salt_len; + int client_nonce_len; state->server_first_message = strdup(input); if (state->server_first_message == NULL) @@ -611,8 +612,9 @@ read_server_first_message(fe_scram_state *state, char *input) } /* Verify immediately that the server used our part of the nonce */ - if (strlen(nonce) < strlen(state->client_nonce) || - memcmp(nonce, state->client_nonce, strlen(state->client_nonce)) != 0) + client_nonce_len = strlen(state->client_nonce); + if (strlen(nonce) < client_nonce_len || + memcmp(nonce, state->client_nonce, client_nonce_len) != 0) { printfPQExpBuffer(&conn->errorMessage, libpq_gettext("invalid SCRAM response (nonce mismatch)\n")); diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 0157c619aa..d385d4d0e1 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -1705,7 +1705,7 @@ connectFailureMessage(PGconn *conn, int errorno) * looked-up IP address. */ if (conn->connhost[conn->whichhost].type != CHT_HOST_ADDRESS && - strlen(host_addr) > 0 && + host_addr[0] != '\0' && strcmp(displayed_host, host_addr) != 0) appendPQExpBuffer(&conn->errorMessage, libpq_gettext("could not connect to server: %s\n" @@ -2529,7 +2529,7 @@ keep_going: /* We will come back to here until there is } getHostaddr(conn, host_addr, NI_MAXHOST); - if (strlen(host_addr) > 0) + if (host_addr[0] != '\0') conn->connip = strdup(host_addr); /* @@ -5164,8 +5164,9 @@ parseServiceFile(const char *serviceFile, return 0; } - if (strncmp(line + 1, service, strlen(service)) == 0 && - line[strlen(service) + 1] == ']') + len = strlen(service); + if (strncmp(line + 1, service, len) == 0 && + line[len + 1] == ']') *group_found = true; else *group_found = false; @@ -7129,7 +7130,7 @@ sslVerifyProtocolVersion(const char *version) * An empty string and a NULL value are considered valid as it is * equivalent to ignoring the parameter. */ - if (!version || strlen(version) == 0) + if (!version || version[0] == '\0') return true; if (pg_strcasecmp(version, "TLSv1") == 0 || @@ -7155,7 +7156,7 @@ sslVerifyProtocolRange(const char *min, const char *max) sslVerifyProtocolVersion(max)); /* If at least one of the bounds is not set, the range is valid */ - if (min == NULL || max == NULL || strlen(min) == 0 || strlen(max) == 0) + if (min == NULL || max == NULL || min[0] == '\0' || max[0] == '\0') return true; /* diff --git a/src/port/dirent.c b/src/port/dirent.c index b264484fca..8292638a5c 100644 --- a/src/port/dirent.c +++ b/src/port/dirent.c @@ -34,6 +34,7 @@ opendir(const char *dirname) { DWORD attr; DIR *d; + int len; /* Make sure it is a directory */ attr = GetFileAttributes(dirname); @@ -61,9 +62,9 @@ opendir(const char *dirname) free(d); return NULL; } - strcpy(d->dirname, dirname); - if (d->dirname[strlen(d->dirname) - 1] != '/' && - d->dirname[strlen(d->dirname) - 1] != '\\') + len = sprintf(d->dirname, "%s", dirname); + if (d->dirname[len - 1] != '/' && + d->dirname[len - 1] != '\\') strcat(d->dirname, "\\"); /* Append backslash if not already there */ strcat(d->dirname, "*"); /* Search for entries named anything */ d->handle = INVALID_HANDLE_VALUE; diff --git a/src/port/path.c b/src/port/path.c index 10e87fbae8..0f457a5f85 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -232,8 +232,11 @@ join_path_components(char *ret_path, if (*tail) { + int len; + /* only separate with slash if head wasn't empty */ - snprintf(ret_path + strlen(ret_path), MAXPGPATH - strlen(ret_path), + len = strlen(ret_path); + snprintf(ret_path + len, MAXPGPATH - len, "%s%s", (*(skip_drive(head)) != '\0') ? "/" : "", tail);