Projects
Browse Source     Search     Timeline     Wiki

Changeset 23565

Show
Ignore:
Timestamp:
03/21/08 15:54:36 (8 months ago)
Author:
zarzycki@…
Message:

Validate job labels.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/launchd/src/launchd_core_logic.c

    r23562 r23565  
    305305static jobmgr_t jobmgr_parent(jobmgr_t jm); 
    306306static jobmgr_t jobmgr_do_garbage_collection(jobmgr_t jm); 
     307static bool jobmgr_label_test(jobmgr_t jm, const char *str); 
    307308static void jobmgr_reap_bulk(jobmgr_t jm, struct kevent *kev); 
    308309static void jobmgr_log_stray_children(jobmgr_t jm); 
     
    19571958                errno = EEXIST; 
    19581959                return NULL; 
    1959         } else if (unlikely(label[0] == '\0' || (strncasecmp(label, "", strlen("com.apple.launchd")) == 0) || 
    1960                         (strtol(label, NULL, 10) != 0))) { 
    1961                 jobmgr_log(jm, LOG_ERR, "Somebody attempted to use a reserved prefix for a label: %s", label); 
    1962                 /* the empty string, com.apple.launchd and number prefixes for labels are reserved */ 
     1960        } else if (unlikely(!jobmgr_label_test(jm, label))) { 
    19631961                errno = EINVAL; 
    19641962                return NULL; 
     
    19701968 
    19711969        return j; 
     1970} 
     1971 
     1972bool 
     1973jobmgr_label_test(jobmgr_t jm, const char *str) 
     1974{ 
     1975        char *endstr = NULL; 
     1976        const char *ptr; 
     1977 
     1978        if (str[0] == '\0') { 
     1979                jobmgr_log(jm, LOG_ERR, "Empty job labels are not allowed"); 
     1980                return false; 
     1981        } 
     1982 
     1983        for (ptr = str; *ptr; ptr++) { 
     1984                if (iscntrl(*ptr)) { 
     1985                        jobmgr_log(jm, LOG_ERR, "ASCII control characters are not allowed in job labels. Index: %td Value: 0x%hhx", ptr - str, *ptr); 
     1986                        return false; 
     1987                } 
     1988        } 
     1989 
     1990        strtoll(str, &endstr, 0); 
     1991 
     1992        if (str != endstr) { 
     1993                jobmgr_log(jm, LOG_ERR, "Job labels are not allowed to begin with numbers: %s", str); 
     1994                return false; 
     1995        } 
     1996 
     1997        if ((strncasecmp(str, "com.apple.launchd", strlen("com.apple.launchd")) == 0) || 
     1998                        (strncasecmp(str, "com.apple.launchctl", strlen("com.apple.launchctl")) == 0)) { 
     1999                jobmgr_log(jm, LOG_ERR, "Job labels are not allowed to use a reserved prefix: %s", str); 
     2000                return false; 
     2001        } 
     2002 
     2003        return true; 
    19722004} 
    19732005