snprintf(env_orig_gid, sizeof(env_orig_gid), "ORIG_GID=%d", (int) getgid());
}
-static bool get_program_name(const char *arg0)
+static void get_script_name(const char *arg0)
{
// If arg0 is a path, extract the last component
const char *p = strrchr(arg0, '/');
p = arg0;
// Reject empty and oversized names
- if (!p[0] || strlen(p) >= PATH_MAX)
- return 0;
+ if (!p[0])
+ die("Script name is empty");
+ if (strlen(p) >= PATH_MAX)
+ die("Script name too long");
// Reject invalid characters
for (const char *q = p; *q; q++)
if (! (c >= 'a' && c <= 'z' ||
c >= 'A' && c <= 'Z' ||
c >= '0' && c <= '9' ||
+ c == '.' ||
c == '-' ||
c == '_'))
- return 0;
+ die("Script name contains an invalid character 0x%02x", c);
}
+ // Reject "." and ".."
+ if (!strcmp(p, ".") || !strcmp(p, ".."))
+ die("Script name must not be `.' or `..'");
+
DBG("Program name: <%s>\n", p);
strcpy(program_name, p);
- return 1;
}
static void find_script(void)
openlog("suidgw", LOG_NDELAY | LOG_PID, LOG_AUTH);
- if (!get_program_name(argv[0]))
- die("Unable to parse program name %s", argv[0]);
-
+ get_script_name(argv[0]);
find_script();
check_stat();
switch_ugid();