Skip to content

Commit 3a3ee65

Browse files
committed
Replace a bunch more uses of strncpy() with safer coding.
strncpy() has a well-deserved reputation for being unsafe, so make an effort to get rid of nearly all occurrences in HEAD. A large fraction of the remaining uses were passing length less than or equal to the known strlen() of the source, in which case no null-padding can occur and the behavior is equivalent to memcpy(), though doubtless slower and certainly harder to reason about. So just use memcpy() in these cases. In other cases, use either StrNCpy() or strlcpy() as appropriate (depending on whether padding to the full length of the destination buffer seems useful). I left a few strncpy() calls alone in the src/timezone/ code, to keep it in sync with upstream (the IANA tzcode distribution). There are also a few such calls in ecpg that could possibly do with more analysis. AFAICT, none of these changes are more than cosmetic, except for the four occurrences in fe-secure-openssl.c, which are in fact buggy: an overlength source leads to a non-null-terminated destination buffer and ensuing misbehavior. These don't seem like security issues, first because no stack clobber is possible and second because if your values of sslcert etc are coming from untrusted sources then you've got problems way worse than this. Still, it's undesirable to have unpredictable behavior for overlength inputs, so back-patch those four changes to all active branches.
1 parent a113a66 commit 3a3ee65

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

src/interfaces/libpq/fe-secure.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,7 @@ initialize_SSL(PGconn *conn)
10731073

10741074
/* Read the client certificate file */
10751075
if (conn->sslcert && strlen(conn->sslcert) > 0)
1076-
strncpy(fnbuf, conn->sslcert, sizeof(fnbuf));
1076+
strlcpy(fnbuf, conn->sslcert, sizeof(fnbuf));
10771077
else if (have_homedir)
10781078
snprintf(fnbuf, sizeof(fnbuf), "%s/%s", homedir, USER_CERT_FILE);
10791079
else
@@ -1264,7 +1264,7 @@ initialize_SSL(PGconn *conn)
12641264
#endif /* USE_SSL_ENGINE */
12651265
{
12661266
/* PGSSLKEY is not an engine, treat it as a filename */
1267-
strncpy(fnbuf, conn->sslkey, sizeof(fnbuf));
1267+
strlcpy(fnbuf, conn->sslkey, sizeof(fnbuf));
12681268
}
12691269
}
12701270
else if (have_homedir)
@@ -1327,7 +1327,7 @@ initialize_SSL(PGconn *conn)
13271327
* verification after the connection has been completed.
13281328
*/
13291329
if (conn->sslrootcert && strlen(conn->sslrootcert) > 0)
1330-
strncpy(fnbuf, conn->sslrootcert, sizeof(fnbuf));
1330+
strlcpy(fnbuf, conn->sslrootcert, sizeof(fnbuf));
13311331
else if (have_homedir)
13321332
snprintf(fnbuf, sizeof(fnbuf), "%s/%s", homedir, ROOT_CERT_FILE);
13331333
else
@@ -1365,7 +1365,7 @@ initialize_SSL(PGconn *conn)
13651365
if ((cvstore = SSL_CTX_get_cert_store(SSL_context)) != NULL)
13661366
{
13671367
if (conn->sslcrl && strlen(conn->sslcrl) > 0)
1368-
strncpy(fnbuf, conn->sslcrl, sizeof(fnbuf));
1368+
strlcpy(fnbuf, conn->sslcrl, sizeof(fnbuf));
13691369
else if (have_homedir)
13701370
snprintf(fnbuf, sizeof(fnbuf), "%s/%s", homedir, ROOT_CRL_FILE);
13711371
else

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy