aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/copy.c6
-rw-r--r--src/backend/parser/scansup.c14
-rw-r--r--src/backend/tsearch/wparser_def.c7
-rw-r--r--src/backend/utils/adt/datetime.c3
-rw-r--r--src/backend/utils/adt/ruleutils.c10
-rw-r--r--src/fe_utils/print.c28
-rw-r--r--src/interfaces/ecpg/ecpglib/error.c1
-rw-r--r--src/interfaces/ecpg/pgtypeslib/dt_common.c3
-rw-r--r--src/interfaces/libpq/fe-misc.c19
9 files changed, 16 insertions, 75 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 6b1fd6d4cca..3e199bdfd0c 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -2303,11 +2303,7 @@ CopyFromErrorCallback(void *arg)
/*
* Make sure we don't print an unreasonable amount of COPY data in a message.
*
- * It would seem a lot easier to just use the sprintf "precision" limit to
- * truncate the string. However, some versions of glibc have a bug/misfeature
- * that vsnprintf will always fail (return -1) if it is asked to truncate
- * a string that contains invalid byte sequences for the current encoding.
- * So, do our own truncation. We return a pstrdup'd copy of the input.
+ * Returns a pstrdup'd copy of the input.
*/
static char *
limit_printout_length(const char *str)
diff --git a/src/backend/parser/scansup.c b/src/backend/parser/scansup.c
index 18169ec4f4c..cac70d5df7a 100644
--- a/src/backend/parser/scansup.c
+++ b/src/backend/parser/scansup.c
@@ -189,20 +189,10 @@ truncate_identifier(char *ident, int len, bool warn)
{
len = pg_mbcliplen(ident, len, NAMEDATALEN - 1);
if (warn)
- {
- /*
- * We avoid using %.*s here because it can misbehave if the data
- * is not valid in what libc thinks is the prevailing encoding.
- */
- char buf[NAMEDATALEN];
-
- memcpy(buf, ident, len);
- buf[len] = '\0';
ereport(NOTICE,
(errcode(ERRCODE_NAME_TOO_LONG),
- errmsg("identifier \"%s\" will be truncated to \"%s\"",
- ident, buf)));
- }
+ errmsg("identifier \"%s\" will be truncated to \"%.*s\"",
+ ident, len, ident)));
ident[len] = '\0';
}
}
diff --git a/src/backend/tsearch/wparser_def.c b/src/backend/tsearch/wparser_def.c
index 48e55e141a4..fda35abc741 100644
--- a/src/backend/tsearch/wparser_def.c
+++ b/src/backend/tsearch/wparser_def.c
@@ -324,12 +324,6 @@ TParserInit(char *str, int len)
prs->state->state = TPS_Base;
#ifdef WPARSER_TRACE
-
- /*
- * Use of %.*s here is a bit risky since it can misbehave if the data is
- * not in what libc thinks is the prevailing encoding. However, since
- * this is just a debugging aid, we choose to live with that.
- */
fprintf(stderr, "parsing \"%.*s\"\n", len, str);
#endif
@@ -366,7 +360,6 @@ TParserCopyInit(const TParser *orig)
prs->state->state = TPS_Base;
#ifdef WPARSER_TRACE
- /* See note above about %.*s */
fprintf(stderr, "parsing copy of \"%.*s\"\n", prs->lenstr, prs->str);
#endif
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index 0b6dfb248cb..dec2fad82a6 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -4013,7 +4013,8 @@ EncodeDateTime(struct pg_tm *tm, fsec_t fsec, bool print_tz, int tz, const char
/*
* Note: the uses of %.*s in this function would be risky if the
- * timezone names ever contain non-ASCII characters. However, all
+ * timezone names ever contain non-ASCII characters, since we are
+ * not being careful to do encoding-aware clipping. However, all
* TZ abbreviations in the IANA database are plain ASCII.
*/
if (print_tz)
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 076c3c019ff..2cbcb4b85e3 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -3554,11 +3554,6 @@ set_rtable_names(deparse_namespace *dpns, List *parent_namespaces,
hentry->counter++;
for (;;)
{
- /*
- * We avoid using %.*s here because it can misbehave
- * if the data is not valid in what libc thinks is the
- * prevailing encoding.
- */
memcpy(modname, refname, refnamelen);
sprintf(modname + refnamelen, "_%d", hentry->counter);
if (strlen(modname) < NAMEDATALEN)
@@ -4438,11 +4433,6 @@ make_colname_unique(char *colname, deparse_namespace *dpns,
i++;
for (;;)
{
- /*
- * We avoid using %.*s here because it can misbehave if the
- * data is not valid in what libc thinks is the prevailing
- * encoding.
- */
memcpy(modname, colname, colnamelen);
sprintf(modname + colnamelen, "_%d", i);
if (strlen(modname) < NAMEDATALEN)
diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c
index 66a50f183f5..508f537c0c7 100644
--- a/src/fe_utils/print.c
+++ b/src/fe_utils/print.c
@@ -305,20 +305,6 @@ format_numeric_locale(const char *my_str)
}
-/*
- * fputnbytes: print exactly N bytes to a file
- *
- * We avoid using %.*s here because it can misbehave if the data
- * is not valid in what libc thinks is the prevailing encoding.
- */
-static void
-fputnbytes(FILE *f, const char *str, size_t n)
-{
- while (n-- > 0)
- fputc(*str++, f);
-}
-
-
static void
print_separator(struct separator sep, FILE *fout)
{
@@ -1042,16 +1028,14 @@ print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
{
/* spaces first */
fprintf(fout, "%*s", width_wrap[j] - chars_to_output, "");
- fputnbytes(fout,
- (char *) (this_line->ptr + bytes_output[j]),
- bytes_to_output);
+ fwrite((char *) (this_line->ptr + bytes_output[j]),
+ 1, bytes_to_output, fout);
}
else /* Left aligned cell */
{
/* spaces second */
- fputnbytes(fout,
- (char *) (this_line->ptr + bytes_output[j]),
- bytes_to_output);
+ fwrite((char *) (this_line->ptr + bytes_output[j]),
+ 1, bytes_to_output, fout);
}
bytes_output[j] += bytes_to_output;
@@ -1637,8 +1621,8 @@ print_aligned_vertical(const printTableContent *cont,
*/
bytes_to_output = strlen_max_width(dlineptr[dline].ptr + offset,
&target_width, encoding);
- fputnbytes(fout, (char *) (dlineptr[dline].ptr + offset),
- bytes_to_output);
+ fwrite((char *) (dlineptr[dline].ptr + offset),
+ 1, bytes_to_output, fout);
chars_to_output -= target_width;
offset += bytes_to_output;
diff --git a/src/interfaces/ecpg/ecpglib/error.c b/src/interfaces/ecpg/ecpglib/error.c
index a4e3c0d01f8..cd6c6a6819b 100644
--- a/src/interfaces/ecpg/ecpglib/error.c
+++ b/src/interfaces/ecpg/ecpglib/error.c
@@ -270,7 +270,6 @@ ecpg_raise_backend(int line, PGresult *result, PGconn *conn, int compat)
else
sqlca->sqlcode = ECPG_PGSQL;
- /* %.*s is safe here as long as sqlstate is all-ASCII */
ecpg_log("raising sqlstate %.*s (sqlcode %ld): %s\n",
(int) sizeof(sqlca->sqlstate), sqlca->sqlstate, sqlca->sqlcode, sqlca->sqlerrm.sqlerrmc);
diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c b/src/interfaces/ecpg/pgtypeslib/dt_common.c
index 81bd7aa526f..14cdf2d428b 100644
--- a/src/interfaces/ecpg/pgtypeslib/dt_common.c
+++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c
@@ -826,7 +826,8 @@ EncodeDateTime(struct tm *tm, fsec_t fsec, bool print_tz, int tz, const char *tz
/*
* Note: the uses of %.*s in this function would be risky if the
- * timezone names ever contain non-ASCII characters. However, all
+ * timezone names ever contain non-ASCII characters, since we are
+ * not being careful to do encoding-aware clipping. However, all
* TZ abbreviations in the IANA database are plain ASCII.
*/
diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c
index 9273984727a..ff840b7730d 100644
--- a/src/interfaces/libpq/fe-misc.c
+++ b/src/interfaces/libpq/fe-misc.c
@@ -68,19 +68,6 @@ PQlibVersion(void)
return PG_VERSION_NUM;
}
-/*
- * fputnbytes: print exactly N bytes to a file
- *
- * We avoid using %.*s here because it can misbehave if the data
- * is not valid in what libc thinks is the prevailing encoding.
- */
-static void
-fputnbytes(FILE *f, const char *str, size_t n)
-{
- while (n-- > 0)
- fputc(*str++, f);
-}
-
/*
* pqGetc: get 1 character from the connection
@@ -204,7 +191,7 @@ pqGetnchar(char *s, size_t len, PGconn *conn)
if (conn->Pfdebug)
{
fprintf(conn->Pfdebug, "From backend (%lu)> ", (unsigned long) len);
- fputnbytes(conn->Pfdebug, s, len);
+ fwrite(s, 1, len, conn->Pfdebug);
fprintf(conn->Pfdebug, "\n");
}
@@ -228,7 +215,7 @@ pqSkipnchar(size_t len, PGconn *conn)
if (conn->Pfdebug)
{
fprintf(conn->Pfdebug, "From backend (%lu)> ", (unsigned long) len);
- fputnbytes(conn->Pfdebug, conn->inBuffer + conn->inCursor, len);
+ fwrite(conn->inBuffer + conn->inCursor, 1, len, conn->Pfdebug);
fprintf(conn->Pfdebug, "\n");
}
@@ -250,7 +237,7 @@ pqPutnchar(const char *s, size_t len, PGconn *conn)
if (conn->Pfdebug)
{
fprintf(conn->Pfdebug, "To backend> ");
- fputnbytes(conn->Pfdebug, s, len);
+ fwrite(s, 1, len, conn->Pfdebug);
fprintf(conn->Pfdebug, "\n");
}