X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/e0da57358cc778436a5e5af1a2523611eb64f46e..dcf342f366706880e89bb5178c568094d05b21c4:/IkiWiki/Wrapper.pm diff --git a/IkiWiki/Wrapper.pm b/IkiWiki/Wrapper.pm index 558cdb1cc..16e5bd350 100644 --- a/IkiWiki/Wrapper.pm +++ b/IkiWiki/Wrapper.pm @@ -91,8 +91,14 @@ $envsave newenviron[i]=NULL; environ=newenviron; - if (setregid(getegid(), -1) != 0 || setreuid(geteuid(), -1) != 0) { - perror("failed to drop real uid/gid"); + if (setregid(getegid(), -1) != 0 && + setregid(getegid(), -1) != 0) { + perror("failed to drop real gid"); + exit(1); + } + if (setreuid(geteuid(), -1) != 0 && + setreuid(geteuid(), -1) != 0) { + perror("failed to drop real uid"); exit(1); } @@ -102,14 +108,28 @@ $envsave } EOF close OUT; - if (system("gcc", "$wrapper.c", "-o", $wrapper) != 0) { + + my $cc=exists $ENV{CC} ? possibly_foolish_untaint($ENV{CC}) : 'cc'; + if (system($cc, "$wrapper.c", "-o", "$wrapper.new") != 0) { #translators: The parameter is a C filename. error(sprintf(gettext("failed to compile %s"), "$wrapper.c")); } unlink("$wrapper.c"); + if (defined $config{wrappergroup}) { + my $gid=(getgrnam($config{wrappergroup}))[2]; + if (! defined $gid) { + error(sprintf("bad wrappergroup")); + } + if (! chown(-1, $gid, "$wrapper.new")) { + error("chown $wrapper.new: $!"); + } + } if (defined $config{wrappermode} && - ! chmod(oct($config{wrappermode}), $wrapper)) { - error("chmod $wrapper: $!"); + ! chmod(oct($config{wrappermode}), "$wrapper.new")) { + error("chmod $wrapper.new: $!"); + } + if (! rename("$wrapper.new", $wrapper)) { + error("rename $wrapper.new $wrapper: $!"); } #translators: The parameter is a filename. printf(gettext("successfully generated %s"), $wrapper);