[git commit] libbb: fix empty PATH components handling

Denys Vlasenko vda.linux at googlemail.com
Fri May 2 15:08:29 UTC 2014


commit: http://git.busybox.net/busybox/commit/?id=15a357e5962634c94ee322fee4da897312090a89
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
find_execable                                         81      86      +5
exists_execable                                       71      66      -5

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 libbb/execable.c |   30 ++++++++++++++++++------------
 1 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/libbb/execable.c b/libbb/execable.c
index 178a00a..a3caea6 100644
--- a/libbb/execable.c
+++ b/libbb/execable.c
@@ -30,6 +30,14 @@ int FAST_FUNC execable_file(const char *name)
  */
 char* FAST_FUNC find_execable(const char *filename, char **PATHp)
 {
+	/* About empty components in $PATH:
+	 * http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html
+	 * 8.3 Other Environment Variables - PATH
+	 * A zero-length prefix is a legacy feature that indicates the current
+	 * working directory. It appears as two adjacent colons ( "::" ), as an
+	 * initial colon preceding the rest of the list, or as a trailing colon
+	 * following the rest of the list.
+	 */
 	char *p, *n;
 
 	p = *PATHp;
@@ -37,14 +45,15 @@ char* FAST_FUNC find_execable(const char *filename, char **PATHp)
 		n = strchr(p, ':');
 		if (n)
 			*n++ = '\0';
-		if (*p != '\0') { /* it's not a PATH="foo::bar" situation */
-			p = concat_path_file(p, filename);
-			if (execable_file(p)) {
-				*PATHp = n;
-				return p;
-			}
-			free(p);
+		p = concat_path_file(
+			p[0] ? p : ".", /* handle "::" case */
+			filename
+		);
+		if (execable_file(p)) {
+			*PATHp = n;
+			return p;
 		}
+		free(p);
 		p = n;
 	} /* on loop exit p == NULL */
 	return p;
@@ -60,11 +69,8 @@ int FAST_FUNC exists_execable(const char *filename)
 	char *tmp = path;
 	char *ret = find_execable(filename, &tmp);
 	free(path);
-	if (ret) {
-		free(ret);
-		return 1;
-	}
-	return 0;
+	free(ret);
+	return ret != NULL;
 }
 
 #if ENABLE_FEATURE_PREFER_APPLETS


More information about the busybox-cvs mailing list