libopkg/opkg_cmd.c: more robust PATH handling
authorGlenn Strauss <gstrauss@gluelogic.com>
Thu, 2 Mar 2017 22:53:42 +0000 (17:53 -0500)
committerJo-Philipp Wich <jo@mein.io>
Wed, 15 Mar 2017 00:42:49 +0000 (01:42 +0100)
preserve semantics of PATH when PATH is not set in environment

error and undefined behavior reported in
  https://github.com/openwrt/packages/issues/1922
when PATH not set in environment
(lighttpd executes CGI with empty base env, plus standard CGI env vars)

Signed-off-by: Glenn Strauss <gstrauss@gluelogic.com>
[Jo-Philipp Wich: avoid free() on NULL, use default from cmake cache string]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
libopkg/opkg_cmd.c

index d52bcb1..2ef2ff4 100644 (file)
@@ -214,13 +214,19 @@ static opkg_intercept_t opkg_prep_intercepts(void)
 
        ctx = xcalloc(1, sizeof(*ctx));
        ctx->oldpath = xstrdup(getenv("PATH"));
-       sprintf_alloc(&newpath, "%s/opkg/intercept:%s", DATADIR, ctx->oldpath);
+
+       sprintf_alloc(&newpath, "%s/opkg/intercept:%s", DATADIR,
+                     ctx->oldpath ? ctx->oldpath : PATH_SPEC);
+
        sprintf_alloc(&ctx->statedir, "%s/opkg-intercept-XXXXXX",
-                     conf->tmp_dir);
+                     conf->tmp_dir);
 
        if (mkdtemp(ctx->statedir) == NULL) {
                opkg_perror(ERROR, "Failed to make temp dir %s", ctx->statedir);
-               free(ctx->oldpath);
+
+               if (ctx->oldpath)
+                       free(ctx->oldpath);
+
                free(ctx->statedir);
                free(newpath);
                free(ctx);
@@ -239,8 +245,13 @@ static int opkg_finalize_intercepts(opkg_intercept_t ctx)
        DIR *dir;
        int err = 0;
 
-       setenv("PATH", ctx->oldpath, 1);
-       free(ctx->oldpath);
+       if (ctx->oldpath) {
+               setenv("PATH", ctx->oldpath, 1);
+               free(ctx->oldpath);
+       }
+       else {
+               unsetenv("PATH");
+       }
 
        dir = opendir(ctx->statedir);
        if (dir) {