In lib/tst_tmpdir.c, when TESTDIR is not an absolute patchname beginning with
'/',
The corresponding code logic would be below:
if (TESTDIR[0] != '/') {
if (getcwd(current_dir, PATH_MAX) == NULL)
strncpy(parent_dir, TESTDIR, PATH_MAX);
else
sprintf(parent_dir, "%s/%s", current_dir, TESTDIR);
} else {
...
}
The statement "sprintf(parent_dir, "%s/%s", current_dir, TESTDIR);" is wrong,
because we can change to any directory in test case, which TESTDIR may no be
child directory of current_dir, we should fix this.
Now we decide to use absolute pathname for TMPDIR, this will greatly simplify
the code in tst_rmdir().
If we still want to use relative path in TMPDIR, we may change the code in
tst_rmdir()
to chdir(test_start_work_dir) first, but this chdir() operation still will fail
sometimes,
this is because some components' search permission in test_start_work_dir may
be denied(
some test cases are run by root, but then may call setuid(), see access05.c).
So I think
we should obey the rule 'fail fast', just using absolute pathname instead.
Though this may be not friendly to to usrs, users rarely export a different
TMPDIR other than /tmp, so it's OK.
Signed-off-by: Xiaoguang Wang <[email protected]>
---
lib/tst_tmpdir.c | 65 +++++++++++++++++++-------------------------------------
1 file changed, 22 insertions(+), 43 deletions(-)
diff --git a/lib/tst_tmpdir.c b/lib/tst_tmpdir.c
index 8cbd89c..ede8f89 100644
--- a/lib/tst_tmpdir.c
+++ b/lib/tst_tmpdir.c
@@ -120,17 +120,30 @@ void tst_tmpdir(void)
{
char template[PATH_MAX];
char *env_tmpdir; /* temporary storage for TMPDIR env var */
- char *errmsg;
+ char *errmsg, *c;
/*
* Create a template for the temporary directory. Use the
* environment variable TMPDIR if it is available, otherwise
* use our default TEMPDIR.
*/
- if ((env_tmpdir = getenv("TMPDIR")))
+ env_tmpdir = getenv("TMPDIR");
+ if (env_tmpdir) {
+ c = strchr(env_tmpdir, '/');
+ /*
+ * Now we force environment variable TMPDIR to be an absolute
+ * pathname, which dose not make much sense, but it will
+ * greatly simplify code in tst_rmdir().
+ */
+ if (c != env_tmpdir) {
+ tst_brkm(TBROK, tmpdir_cleanup, "You must specify "
+ "an absolute pathname for environment "
+ "variable TMPDIR");
+ }
snprintf(template, PATH_MAX, "%s/%.3sXXXXXX", env_tmpdir, TCID);
- else
+ } else {
snprintf(template, PATH_MAX, "%s/%.3sXXXXXX", TEMPDIR, TCID);
+ }
/* Make the temporary directory in one shot using mkdtemp. */
if (mkdtemp(template) == NULL)
@@ -159,23 +172,21 @@ void tst_tmpdir(void)
* fails, also issue a TWARN message.
*/
if (chdir(TESTDIR) == -1) {
- tst_brkm(TBROK | TERRNO, NULL, "%s: chdir(%s) failed",
- __func__, TESTDIR);
+ tst_resm(TERRNO, "%s: chdir(%s) failed", __func__, TESTDIR);
/* Try to remove the directory */
- if (rmobj(TESTDIR, &errmsg) == -1)
+ if (rmobj(TESTDIR, &errmsg) == -1) {
tst_resm(TWARN, "%s: rmobj(%s) failed: %s",
__func__, TESTDIR, errmsg);
+ }
- tmpdir_cleanup();
+ tst_exit();
}
}
void tst_rmdir(void)
{
- char current_dir[PATH_MAX];
char *errmsg;
- char *parent_dir;
/*
* Check that TESTDIR is not NULL.
@@ -187,45 +198,13 @@ void tst_rmdir(void)
return;
}
- if ((parent_dir = malloc(PATH_MAX)) == NULL) {
- /* Make sure that we exit quickly and noisily. */
- tst_brkm(TBROK | TERRNO, NULL,
- "%s: malloc(%d) failed", __func__, PATH_MAX);
- }
-
- /*
- * Get the directory name of TESTDIR. If TESTDIR is a relative path,
- * get full path.
- */
- if (TESTDIR[0] != '/') {
- if (getcwd(current_dir, PATH_MAX) == NULL)
- strncpy(parent_dir, TESTDIR, PATH_MAX);
- else
- sprintf(parent_dir, "%s/%s", current_dir, TESTDIR);
- } else {
- strcpy(parent_dir, TESTDIR);
- }
-
- if ((parent_dir = dirname(parent_dir)) == NULL) {
- tst_resm(TWARN | TERRNO, "%s: dirname failed", __func__);
- return;
- }
-
- /*
- * Change directory to parent_dir (The dir above TESTDIR).
- */
- if (chdir(parent_dir) != 0) {
- tst_resm(TWARN | TERRNO,
- "%s: chdir(%s) failed\nAttempting to remove temp dir "
- "anyway", __func__, parent_dir);
- }
-
/*
* Attempt to remove the "TESTDIR" directory, using rmobj().
*/
- if (rmobj(TESTDIR, &errmsg) == -1)
+ if (rmobj(TESTDIR, &errmsg) == -1) {
tst_resm(TWARN, "%s: rmobj(%s) failed: %s",
__func__, TESTDIR, errmsg);
+ }
}
/*
--
1.8.2.1
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list