use strlcpy & strlcat (#74)

* refactor checkpubkeyperms() with safe BSD functions

fix gcc8 warnings
```
svr-authpubkey.c: In function 'checkpubkeyperms':
svr-authpubkey.c:427:2: warning: 'strncat' specified bound 5 equals source length [-Wstringop-overflow=]
  strncat(filename, "/.ssh", 5); /* strlen("/.ssh") == 5 */
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
svr-authpubkey.c:433:2: warning: 'strncat' specified bound 16 equals source length [-Wstringop-overflow=]
  strncat(filename, "/authorized_keys", 16);
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```

see https://www.sudo.ws/todd/papers/strlcpy.html

* restore strlcpy in xstrdup

see original https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/xmalloc.c?rev=1.16
This commit is contained in:
François Perrad 2019-03-20 15:09:19 +01:00 committed by Matt Johnston
parent a0aa274981
commit 28b6111db0
2 changed files with 6 additions and 5 deletions

View File

@ -102,7 +102,7 @@ xstrdup(const char *str)
len = strlen(str) + 1;
cp = xmalloc(len);
strncpy(cp, str, len);
strlcpy(cp, str, len);
return cp;
}

View File

@ -424,8 +424,9 @@ static int checkpubkeyperms() {
/* allocate max required pathname storage,
* = path + "/.ssh/authorized_keys" + '\0' = pathlen + 22 */
filename = m_malloc(len + 22);
strncpy(filename, ses.authstate.pw_dir, len+1);
len += 22;
filename = m_malloc(len);
strlcpy(filename, ses.authstate.pw_dir, len);
/* check ~ */
if (checkfileperm(filename) != DROPBEAR_SUCCESS) {
@ -433,13 +434,13 @@ static int checkpubkeyperms() {
}
/* check ~/.ssh */
strncat(filename, "/.ssh", 5); /* strlen("/.ssh") == 5 */
strlcat(filename, "/.ssh", len);
if (checkfileperm(filename) != DROPBEAR_SUCCESS) {
goto out;
}
/* now check ~/.ssh/authorized_keys */
strncat(filename, "/authorized_keys", 16);
strlcat(filename, "/authorized_keys", len);
if (checkfileperm(filename) != DROPBEAR_SUCCESS) {
goto out;
}