Revision: 23565 http://trac.macosforge.org/projects/launchd/changeset/23565 Author: zarzycki@apple.com Date: 2008-03-21 15:54:36 -0700 (Fri, 21 Mar 2008) Log Message: ----------- Validate job labels. Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2008-03-21 22:53:56 UTC (rev 23564) +++ trunk/launchd/src/launchd_core_logic.c 2008-03-21 22:54:36 UTC (rev 23565) @@ -304,6 +304,7 @@ static job_t jobmgr_import2(jobmgr_t jm, launch_data_t pload); static jobmgr_t jobmgr_parent(jobmgr_t jm); static jobmgr_t jobmgr_do_garbage_collection(jobmgr_t jm); +static bool jobmgr_label_test(jobmgr_t jm, const char *str); static void jobmgr_reap_bulk(jobmgr_t jm, struct kevent *kev); static void jobmgr_log_stray_children(jobmgr_t jm); static void jobmgr_remove(jobmgr_t jm); @@ -1956,10 +1957,7 @@ if (unlikely((j = job_find(label)) != NULL)) { errno = EEXIST; return NULL; - } else if (unlikely(label[0] == '\0' || (strncasecmp(label, "", strlen("com.apple.launchd")) == 0) || - (strtol(label, NULL, 10) != 0))) { - jobmgr_log(jm, LOG_ERR, "Somebody attempted to use a reserved prefix for a label: %s", label); - /* the empty string, com.apple.launchd and number prefixes for labels are reserved */ + } else if (unlikely(!jobmgr_label_test(jm, label))) { errno = EINVAL; return NULL; } @@ -1971,6 +1969,40 @@ return j; } +bool +jobmgr_label_test(jobmgr_t jm, const char *str) +{ + char *endstr = NULL; + const char *ptr; + + if (str[0] == '\0') { + jobmgr_log(jm, LOG_ERR, "Empty job labels are not allowed"); + return false; + } + + for (ptr = str; *ptr; ptr++) { + if (iscntrl(*ptr)) { + jobmgr_log(jm, LOG_ERR, "ASCII control characters are not allowed in job labels. Index: %td Value: 0x%hhx", ptr - str, *ptr); + return false; + } + } + + strtoll(str, &endstr, 0); + + if (str != endstr) { + jobmgr_log(jm, LOG_ERR, "Job labels are not allowed to begin with numbers: %s", str); + return false; + } + + if ((strncasecmp(str, "com.apple.launchd", strlen("com.apple.launchd")) == 0) || + (strncasecmp(str, "com.apple.launchctl", strlen("com.apple.launchctl")) == 0)) { + jobmgr_log(jm, LOG_ERR, "Job labels are not allowed to use a reserved prefix: %s", str); + return false; + } + + return true; +} + INTERNAL_ABI job_t job_find(const char *label) {