it* Add contextual error information in die() - sup - small tool for privilege escalation Err parazyd.org 70 hgit clone https://git.parazyd.org/sup URL:https://git.parazyd.org/sup parazyd.org 70 1Log /git/sup/log.gph parazyd.org 70 1Files /git/sup/files.gph parazyd.org 70 1Refs /git/sup/refs.gph parazyd.org 70 1README /git/sup/file/README.gph parazyd.org 70 1LICENSE /git/sup/file/LICENSE.gph parazyd.org 70 i--- Err parazyd.org 70 1commit 8078fe60673809c9ce32dd85613e9f96d7278742 /git/sup/commit/8078fe60673809c9ce32dd85613e9f96d7278742.gph parazyd.org 70 1parent 0492cb034b11bc7ae89a4be974cf80678c74bfe8 /git/sup/commit/0492cb034b11bc7ae89a4be974cf80678c74bfe8.gph parazyd.org 70 hAuthor: pancake@dazo URL:mailto:unknown parazyd.org 70 iDate: Mon, 4 Jan 2010 00:06:28 +0100 Err parazyd.org 70 i Err parazyd.org 70 i* Add contextual error information in die() Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i M sup.c | 24 ++++++++++++------------ Err parazyd.org 70 i Err parazyd.org 70 i1 file changed, 12 insertions(+), 12 deletions(-) Err parazyd.org 70 i--- Err parazyd.org 70 1diff --git a/sup.c b/sup.c /git/sup/file/sup.c.gph parazyd.org 70 it@@ -18,8 +18,8 @@ struct rule_t { Err parazyd.org 70 i Err parazyd.org 70 i #include "config.h" Err parazyd.org 70 i Err parazyd.org 70 i-static int die(int ret, const char *str) { Err parazyd.org 70 i- fprintf (stderr, "%s\n", str); Err parazyd.org 70 i+static int die(int ret, const char *org, const char *str) { Err parazyd.org 70 i+ fprintf (stderr, "%s%s%s\n", org, org?": ":"", str); Err parazyd.org 70 i return ret; Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 it@@ -27,10 +27,10 @@ int main(int argc, char **argv) { Err parazyd.org 70 i int i, uid, gid, ret; Err parazyd.org 70 i Err parazyd.org 70 i if (argc < 2 || !strcmp (argv[1], "-h")) Err parazyd.org 70 i- return die (1, HELP); Err parazyd.org 70 i+ return die (1, NULL, HELP); Err parazyd.org 70 i Err parazyd.org 70 i if (!strcmp (argv[1], "-v")) Err parazyd.org 70 i- return die (1, VERSION); Err parazyd.org 70 i+ return die (1, NULL, VERSION); Err parazyd.org 70 i Err parazyd.org 70 i if (!strcmp (argv[1], "-l")) { Err parazyd.org 70 i for (i = 0; rules[i].cmd != NULL; i++) Err parazyd.org 70 it@@ -48,29 +48,29 @@ int main(int argc, char **argv) { Err parazyd.org 70 i struct stat st; Err parazyd.org 70 i lstat (rules[i].path, &st); Err parazyd.org 70 i if (st.st_mode & 0222) Err parazyd.org 70 i- return die (1, "Cannot run writable binaries."); Err parazyd.org 70 i+ return die (1, "stat", "Cannot run writable binaries."); Err parazyd.org 70 i #endif Err parazyd.org 70 i if (uid != SETUID && rules[i].uid != -1 && rules[i].uid != uid) Err parazyd.org 70 i- return die (1, "User does not match"); Err parazyd.org 70 i+ return die (1, "urule", "User does not match"); Err parazyd.org 70 i Err parazyd.org 70 i if (gid != SETGID && rules[i].gid != -1 && rules[i].gid != gid) Err parazyd.org 70 i- return die (1, "Group id does not match"); Err parazyd.org 70 i+ return die (1, "grule", "Group id does not match"); Err parazyd.org 70 i Err parazyd.org 70 i if (setuid (SETUID) == -1 || setgid (SETGID) == -1 || Err parazyd.org 70 i seteuid (SETUID) == -1 || setegid (SETGID) == -1) Err parazyd.org 70 i- return die (1, strerror (errno)); Err parazyd.org 70 i+ return die (1, "set[e][ug]id", strerror (errno)); Err parazyd.org 70 i #ifdef CHROOT Err parazyd.org 70 i if (*CHROOT) Err parazyd.org 70 i if (chdir (CHROOT) == -1 || chroot (".") == -1) Err parazyd.org 70 i- return die (1, strerror (errno)); Err parazyd.org 70 i+ return die (1, "chroot", strerror (errno)); Err parazyd.org 70 i if (*CHRDIR) Err parazyd.org 70 i if (chdir (CHRDIR) == -1) Err parazyd.org 70 i- return die (1, strerror (errno)); Err parazyd.org 70 i+ return die (1, "chdir", strerror (errno)); Err parazyd.org 70 i #endif Err parazyd.org 70 i ret = execv (*rules[i].path? rules[i].path:argv[1], argv+1); Err parazyd.org 70 i- return die (ret, strerror (errno)); Err parazyd.org 70 i+ return die (ret, "execv", strerror (errno)); Err parazyd.org 70 i } Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 i- return die (1, "Sorry"); Err parazyd.org 70 i+ return die (1, NULL, "Sorry"); Err parazyd.org 70 i } Err parazyd.org 70 .