summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2009-06-28 01:37:42 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2009-06-28 01:37:42 +0800
commit146fddfdb1876d311653042a5545a729a9692725 (patch)
tree1cfe9e3994fa6e9682c3e2adbfe3262c23b454de /common
parentc52d9652d75e3f71875c0c9b11e9d133c6470e99 (diff)
downloadpttbbs-146fddfdb1876d311653042a5545a729a9692725.tar
pttbbs-146fddfdb1876d311653042a5545a729a9692725.tar.gz
pttbbs-146fddfdb1876d311653042a5545a729a9692725.tar.bz2
pttbbs-146fddfdb1876d311653042a5545a729a9692725.tar.lz
pttbbs-146fddfdb1876d311653042a5545a729a9692725.tar.xz
pttbbs-146fddfdb1876d311653042a5545a729a9692725.tar.zst
pttbbs-146fddfdb1876d311653042a5545a729a9692725.zip
* make Rename() return real status result when SIGCHLD was set to SIG_IGN.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4706 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'common')
-rw-r--r--common/sys/file.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/common/sys/file.c b/common/sys/file.c
index 9e993905..b86899dd 100644
--- a/common/sys/file.c
+++ b/common/sys/file.c
@@ -198,26 +198,35 @@ int copy_file(const char *src, const char *dst)
return copy_file_to_file(src, dst);
}
+#include <signal.h>
int
Rename(const char *src, const char *dst)
{
+ pid_t pid;
+ sig_t s;
+ int ret = -1;
+
if (rename(src, dst) == 0)
return 0;
- if (!strchr(src, ';') && !strchr(dst, ';'))
+
+ // prevent malicious shell escapes
+ if (strchr(src, ';') || !strchr(dst, ';'))
+ return -1;
+
+ // because we need the return value, override the signal handler
+ s = signal(SIGCHLD, NULL);
+ pid = fork();
+
+ if (pid == 0)
+ execl("/bin/mv", "mv", "-f", src, dst, (char *)NULL);
+ else if (pid > 0)
{
- pid_t pid = fork();
- if (pid == 0)
- execl("/bin/mv", "mv", "-f", src, dst, (char *)NULL);
- else if (pid > 0)
- {
- int status = -1;
- waitpid(pid, &status, 0);
- return WEXITSTATUS(status) == 0 ? 0 : -1;
- }
- else
- return -1;
+ waitpid(pid, &ret, 0);
+ ret = WEXITSTATUS(ret) == 0 ? 0 : -1;
}
- return -1;
+
+ signal(SIGCHLD, s);
+ return ret;
}
int