[PATCH kefir] Treat zero-length environment variables as unset
Export this patch
Idiomatically, environment variables set to '' are treated as unset, as they
are in the shell. This patch fixes behaviour a user may not expect:
* `make CC=kefir KEFIR_LD=': kefir tries to exec an empty string
* `TMPDIR= kefir ...': kefir writes temporary files to current working
directory, rather than using a default TMPDIR
Also a manpage typo
---
docs/man/kefir.1 | 2 +-
source/driver/externals.c | 48 ++++++++++++++++++++++----------------
source/platform/tempfile.c | 4 ++--
3 files changed, 31 insertions(+), 23 deletions(-)
diff --git a/docs/man/kefir.1 b/docs/man/kefir.1
index 949f991b..63e8a98a 100644
--- a/docs/man/kefir.1
+++ b/docs/man/kefir.1
@@ -628,7 +628,7 @@ Override kefir temporary directory
Normally
.Nm
exits with 0 exit code. In case of any errors in any of compilation stages, all further compilation is aborted and
-non-zero exit code retruned.
+non-zero exit code returned.
.\"
.Sh STANDARDS
.Nm
diff --git a/source/driver/externals.c b/source/driver/externals.c
index 764cd151..3f11e0de 100644
--- a/source/driver/externals.c
+++ b/source/driver/externals.c
@@ -28,6 +28,14 @@ static void set_if_null(const char **target, const char *value) {
}
}
+static const char *getenv_nonzero(const char *envvar) {
+ const char *value = getenv(envvar);
+ if (value != NULL && *value == '\0') {
+ value = NULL;
+ }
+ return value;
+}
+
kefir_result_t kefir_driver_external_resources_init_from_env(struct kefir_mem *mem,
struct kefir_driver_external_resources *externals,
struct kefir_tempfile_manager *tmpmgr) {
@@ -41,9 +49,9 @@ kefir_result_t kefir_driver_external_resources_init_from_env(struct kefir_mem *m
externals->default_target = getenv("KEFIR_TARGET");
externals->assembler_path_explicit = false;
- externals->assembler_path = getenv("KEFIR_AS");
+ externals->assembler_path = getenv_nonzero("KEFIR_AS");
if (externals->assembler_path == NULL) {
- externals->assembler_path = getenv("AS");
+ externals->assembler_path = getenv_nonzero("AS");
}
if (externals->assembler_path != NULL) {
externals->assembler_path_explicit = true;
@@ -55,9 +63,9 @@ kefir_result_t kefir_driver_external_resources_init_from_env(struct kefir_mem *m
externals->assembler_path = "as";
}
- externals->linker_path = getenv("KEFIR_LD");
+ externals->linker_path = getenv_nonzero("KEFIR_LD");
if (externals->linker_path == NULL) {
- externals->linker_path = getenv("LD");
+ externals->linker_path = getenv_nonzero("LD");
}
#ifdef KEFIR_CONFIG_HOST_LD
set_if_null(&externals->linker_path, KEFIR_CONFIG_HOST_LD);
@@ -66,22 +74,22 @@ kefir_result_t kefir_driver_external_resources_init_from_env(struct kefir_mem *m
externals->linker_path = "ld";
}
- externals->runtime_include = getenv("KEFIR_RTINC");
- externals->musl.include_path = getenv("KEFIR_MUSL_INCLUDE");
- externals->musl.library_path = getenv("KEFIR_MUSL_LIB");
- externals->musl.dynamic_linker = getenv("KEFIR_MUSL_DYNAMIC_LINKER");
- externals->gnu.include_path = getenv("KEFIR_GNU_INCLUDE");
- externals->gnu.library_path = getenv("KEFIR_GNU_LIB");
- externals->gnu.dynamic_linker = getenv("KEFIR_GNU_DYNAMIC_LINKER");
- externals->freebsd.include_path = getenv("KEFIR_FREEBSD_INCLUDE");
- externals->freebsd.library_path = getenv("KEFIR_FREEBSD_LIB");
- externals->freebsd.dynamic_linker = getenv("KEFIR_FREEBSD_DYNAMIC_LINKER");
- externals->openbsd.include_path = getenv("KEFIR_OPENBSD_INCLUDE");
- externals->openbsd.library_path = getenv("KEFIR_OPENBSD_LIB");
- externals->openbsd.dynamic_linker = getenv("KEFIR_OPENBSD_DYNAMIC_LINKER");
- externals->netbsd.include_path = getenv("KEFIR_NETBSD_INCLUDE");
- externals->netbsd.library_path = getenv("KEFIR_NETBSD_LIB");
- externals->netbsd.dynamic_linker = getenv("KEFIR_NETBSD_DYNAMIC_LINKER");
+ externals->runtime_include = getenv_nonzero("KEFIR_RTINC");
+ externals->musl.include_path = getenv_nonzero("KEFIR_MUSL_INCLUDE");
+ externals->musl.library_path = getenv_nonzero("KEFIR_MUSL_LIB");
+ externals->musl.dynamic_linker = getenv_nonzero("KEFIR_MUSL_DYNAMIC_LINKER");
+ externals->gnu.include_path = getenv_nonzero("KEFIR_GNU_INCLUDE");
+ externals->gnu.library_path = getenv_nonzero("KEFIR_GNU_LIB");
+ externals->gnu.dynamic_linker = getenv_nonzero("KEFIR_GNU_DYNAMIC_LINKER");
+ externals->freebsd.include_path = getenv_nonzero("KEFIR_FREEBSD_INCLUDE");
+ externals->freebsd.library_path = getenv_nonzero("KEFIR_FREEBSD_LIB");
+ externals->freebsd.dynamic_linker = getenv_nonzero("KEFIR_FREEBSD_DYNAMIC_LINKER");
+ externals->openbsd.include_path = getenv_nonzero("KEFIR_OPENBSD_INCLUDE");
+ externals->openbsd.library_path = getenv_nonzero("KEFIR_OPENBSD_LIB");
+ externals->openbsd.dynamic_linker = getenv_nonzero("KEFIR_OPENBSD_DYNAMIC_LINKER");
+ externals->netbsd.include_path = getenv_nonzero("KEFIR_NETBSD_INCLUDE");
+ externals->netbsd.library_path = getenv_nonzero("KEFIR_NETBSD_LIB");
+ externals->netbsd.dynamic_linker = getenv_nonzero("KEFIR_NETBSD_DYNAMIC_LINKER");
UNUSED(set_if_null);
diff --git a/source/platform/tempfile.c b/source/platform/tempfile.c
index 2fa69a3f..ee3a6644 100644
--- a/source/platform/tempfile.c
+++ b/source/platform/tempfile.c
@@ -93,10 +93,10 @@ kefir_result_t kefir_tempfile_manager_free(struct kefir_mem *mem, struct kefir_t
static const char *get_tmp_directory(void) {
const char *tmp_directory = getenv("KEFIR_TMPDIR");
- if (tmp_directory == NULL) {
+ if (tmp_directory == NULL || *tmp_directory == '\0') {
tmp_directory = getenv("TMPDIR");
}
- if (tmp_directory == NULL) {
+ if (tmp_directory == NULL || *tmp_directory == '\0') {
#ifdef P_tmpdir
tmp_directory = P_tmpdir;
#else
--
2.48.1
kefir/patches: FAILED in 2h27m53s
[Treat zero-length environment variables as unset][0] from [remph][1]
[0]: https://lists.sr.ht/~jprotopopov/public-inbox/patches/57367
[1]: mailto:lhr@disroot.org
✗ #1425541 FAILED kefir/patches/openbsd.yml https://builds.sr.ht/~jprotopopov/job/1425541
✗ #1425540 FAILED kefir/patches/netbsd.yml https://builds.sr.ht/~jprotopopov/job/1425540
✗ #1425539 FAILED kefir/patches/freebsd.yml https://builds.sr.ht/~jprotopopov/job/1425539
✗ #1425542 FAILED kefir/patches/ubuntu.yml https://builds.sr.ht/~jprotopopov/job/1425542