[git commit] libbb: introduce and use chdir_or_warn()

Denys Vlasenko vda.linux at googlemail.com
Thu Jan 13 11:56:10 UTC 2022


commit: https://git.busybox.net/busybox/commit/?id=c2788f88f430da8ae5fb5f293b13fc2b167ea2fe
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
chdir_or_warn                                          -      37     +37
send_cgi_and_exit                                    720     711      -9
xchdir                                                27      15     -12
setup_environment                                    233     217     -16
fork_job                                             449     433     -16
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/4 up/down: 37/-53)            Total: -16 bytes

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 include/libbb.h           |  1 +
 libbb/setup_environment.c |  3 +--
 libbb/xfuncs_printf.c     | 11 +++++++++--
 miscutils/crond.c         |  3 +--
 networking/httpd.c        |  3 +--
 5 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index 780e9ae7d..91b456915 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -645,6 +645,7 @@ void xsetgid(gid_t gid) FAST_FUNC;
 void xsetuid(uid_t uid) FAST_FUNC;
 void xsetegid(gid_t egid) FAST_FUNC;
 void xseteuid(uid_t euid) FAST_FUNC;
+int chdir_or_warn(const char *path) FAST_FUNC;
 void xchdir(const char *path) FAST_FUNC;
 void xfchdir(int fd) FAST_FUNC;
 void xchroot(const char *path) FAST_FUNC;
diff --git a/libbb/setup_environment.c b/libbb/setup_environment.c
index 37777204e..3549e2099 100644
--- a/libbb/setup_environment.c
+++ b/libbb/setup_environment.c
@@ -37,8 +37,7 @@ void FAST_FUNC setup_environment(const char *shell, int flags, const struct pass
 	/* Change the current working directory to be the home directory
 	 * of the user */
 	if (flags & SETUP_ENV_CHDIR) {
-		if (chdir(pw->pw_dir) != 0) {
-			bb_error_msg("can't change directory to '%s'", pw->pw_dir);
+		if (chdir_or_warn(pw->pw_dir) != 0) {
 			xchdir((flags & SETUP_ENV_TO_TMP) ? "/tmp" : "/");
 		}
 	}
diff --git a/libbb/xfuncs_printf.c b/libbb/xfuncs_printf.c
index fc630d176..842d10cd2 100644
--- a/libbb/xfuncs_printf.c
+++ b/libbb/xfuncs_printf.c
@@ -415,11 +415,18 @@ void FAST_FUNC xseteuid(uid_t euid)
 	if (seteuid(euid)) bb_simple_perror_msg_and_die("seteuid");
 }
 
+int FAST_FUNC chdir_or_warn(const char *path)
+{
+	int r = chdir(path);
+	if (r != 0)
+		bb_perror_msg("can't change directory to '%s'", path);
+	return r;
+}
 // Die if we can't chdir to a new path.
 void FAST_FUNC xchdir(const char *path)
 {
-	if (chdir(path))
-		bb_perror_msg_and_die("can't change directory to '%s'", path);
+	if (chdir_or_warn(path) != 0)
+		xfunc_die();
 }
 
 void FAST_FUNC xfchdir(int fd)
diff --git a/miscutils/crond.c b/miscutils/crond.c
index b74427351..1965af656 100644
--- a/miscutils/crond.c
+++ b/miscutils/crond.c
@@ -675,8 +675,7 @@ static void change_user(struct passwd *pas)
 {
 	/* careful: we're after vfork! */
 	change_identity(pas); /* - initgroups, setgid, setuid */
-	if (chdir(pas->pw_dir) < 0) {
-		bb_error_msg("can't change directory to '%s'", pas->pw_dir);
+	if (chdir_or_warn(pas->pw_dir) != 0) {
 		xchdir(CRON_DIR);
 	}
 }
diff --git a/networking/httpd.c b/networking/httpd.c
index 33045163f..ffc58e10b 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -1667,8 +1667,7 @@ static void send_cgi_and_exit(
 		script = last_slash;
 		if (script != url) { /* paranoia */
 			*script = '\0';
-			if (chdir(url + 1) != 0) {
-				bb_perror_msg("can't change directory to '%s'", url + 1);
+			if (chdir_or_warn(url + 1) != 0) {
 				goto error_execing_cgi;
 			}
 			// not needed: *script = '/';


More information about the busybox-cvs mailing list