summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bind/lib/isc/unix/file.c
diff options
context:
space:
mode:
authorsthen <sthen@openbsd.org>2019-12-17 01:46:30 +0000
committersthen <sthen@openbsd.org>2019-12-17 01:46:30 +0000
commit3ef32adf69b1fed9e0363dd1f2116627f09e6af3 (patch)
tree4d9d566691647dad37619d7bd9d1c7114f554bbe /usr.sbin/bind/lib/isc/unix/file.c
parentAdd support for NCT6775F, NCT5104D, NCT6779D, NCT679[1235]D sensors. (diff)
downloadwireguard-openbsd-3ef32adf69b1fed9e0363dd1f2116627f09e6af3.tar.xz
wireguard-openbsd-3ef32adf69b1fed9e0363dd1f2116627f09e6af3.zip
update to 9.10.8-P1, last isc-licensed release
Diffstat (limited to 'usr.sbin/bind/lib/isc/unix/file.c')
-rw-r--r--usr.sbin/bind/lib/isc/unix/file.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/usr.sbin/bind/lib/isc/unix/file.c b/usr.sbin/bind/lib/isc/unix/file.c
index 75980292713..d43e4f7aaae 100644
--- a/usr.sbin/bind/lib/isc/unix/file.c
+++ b/usr.sbin/bind/lib/isc/unix/file.c
@@ -1,6 +1,5 @@
/*
- * Copyright (C) 2004, 2005, 2007, 2009, 2011-2016 Internet Systems Consortium, Inc. ("ISC")
- * Copyright (C) 2000-2002 Internet Software Consortium.
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -44,7 +43,7 @@
* SUCH DAMAGE.
*/
-/* $Id: file.c,v 1.6 2019/12/16 16:16:27 deraadt Exp $ */
+/* $Id: file.c,v 1.7 2019/12/17 01:46:37 sthen Exp $ */
/*! \file */
@@ -239,17 +238,18 @@ isc_file_template(const char *path, const char *templet, char *buf,
s = strrchr(path, '/');
if (s != NULL) {
- if ((s - path + 1 + strlen(templet) + 1) > buflen)
+ size_t prefixlen = s - path + 1;
+ if ((prefixlen + strlen(templet) + 1) > buflen)
return (ISC_R_NOSPACE);
- strncpy(buf, path, s - path + 1);
- buf[s - path + 1] = '\0';
- strcat(buf, templet);
+ /* Copy 'prefixlen' bytes and NUL terminate. */
+ strlcpy(buf, path, ISC_MIN(prefixlen + 1, buflen));
+ strlcat(buf, templet, buflen);
} else {
if ((strlen(templet) + 1) > buflen)
return (ISC_R_NOSPACE);
- strcpy(buf, templet);
+ strlcpy(buf, templet, buflen);
}
return (ISC_R_SUCCESS);
@@ -546,15 +546,17 @@ dir_current(char *dirname, size_t length) {
cwd = getcwd(dirname, length);
if (cwd == NULL) {
- if (errno == ERANGE)
+ if (errno == ERANGE) {
result = ISC_R_NOSPACE;
- else
+ } else {
result = isc__errno2result(errno);
+ }
} else {
- if (strlen(dirname) + 1 == length)
+ if (strlen(dirname) + 1 == length) {
result = ISC_R_NOSPACE;
- else if (dirname[1] != '\0')
- strcat(dirname, "/");
+ } else if (dirname[1] != '\0') {
+ strlcat(dirname, "/", length);
+ }
}
return (result);
@@ -568,7 +570,7 @@ isc_file_absolutepath(const char *filename, char *path, size_t pathlen) {
return (result);
if (strlen(path) + strlen(filename) + 1 > pathlen)
return (ISC_R_NOSPACE);
- strcat(path, filename);
+ strlcat(path, filename, pathlen);
return (ISC_R_SUCCESS);
}
@@ -701,3 +703,8 @@ isc_file_munmap(void *addr, size_t len) {
return (0);
#endif
}
+
+isc_boolean_t
+isc_file_isdirwritable(const char *path) {
+ return (ISC_TF(access(path, W_OK|X_OK) == 0));
+}