[launchd-changes] [22981] trunk/launchd/src/launchd_core_logic.c

source_changes at macosforge.org source_changes at macosforge.org
Thu Dec 14 11:18:26 PST 2006


Revision: 22981
          http://trac.macosforge.org/projects/launchd/changeset/22981
Author:   zarzycki at apple.com
Date:     2006-12-14 11:18:26 -0800 (Thu, 14 Dec 2006)

Log Message:
-----------
<rdar://problem/4881530> launchd crashes when parsing malformed plist

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2006-12-14 18:08:28 UTC (rev 22980)
+++ trunk/launchd/src/launchd_core_logic.c	2006-12-14 19:18:26 UTC (rev 22981)
@@ -1377,24 +1377,52 @@
 	if (pload == NULL) {
 		return NULL;
 	}
+
 	if (launch_data_get_type(pload) != LAUNCH_DATA_DICTIONARY) {
+		errno = EINVAL;
 		return NULL;
 	}
 
 	if ((tmp = launch_data_dict_lookup(pload, LAUNCH_JOBKEY_LABEL)) &&
 			(launch_data_get_type(tmp) == LAUNCH_DATA_STRING)) {
-		label = launch_data_get_string(tmp);
+		if (!(label = launch_data_get_string(tmp))) {
+			errno = EINVAL;
+			return NULL;
+		}
 	}
+
 	if ((tmp = launch_data_dict_lookup(pload, LAUNCH_JOBKEY_PROGRAM)) &&
 			(launch_data_get_type(tmp) == LAUNCH_DATA_STRING)) {
 		prog = launch_data_get_string(tmp);
 	}
-	ldpa = launch_data_dict_lookup(pload, LAUNCH_JOBKEY_PROGRAMARGUMENTS);
 
-	if (label == NULL) {
-		errno = EINVAL;
-		return NULL;
-	} else if ((j = jobmgr_find(root_jobmgr, label)) != NULL) {
+	if ((ldpa = launch_data_dict_lookup(pload, LAUNCH_JOBKEY_PROGRAMARGUMENTS))) {
+		size_t i, c;
+
+		if (launch_data_get_type(ldpa) != LAUNCH_DATA_ARRAY) {
+			errno = EINVAL;
+			return NULL;
+		}
+
+		c = launch_data_array_get_count(ldpa);
+
+		argv = alloca((c + 1) * sizeof(char *));
+
+		for (i = 0; i < c; i++) {
+			tmp = launch_data_array_get_index(ldpa, i);
+
+			if (launch_data_get_type(tmp) != LAUNCH_DATA_STRING) {
+				errno = EINVAL;
+				return NULL;
+			}
+
+			argv[i] = launch_data_get_string(tmp);
+		}
+
+		argv[i] = NULL;
+	}
+
+	if ((j = jobmgr_find(root_jobmgr, label)) != NULL) {
 		errno = EEXIST;
 		return NULL;
 	} else if (label[0] == '\0' || (strncasecmp(label, "", strlen("com.apple.launchd")) == 0) ||
@@ -1405,16 +1433,6 @@
 		return NULL;
 	}
 
-	if (ldpa) {
-		size_t i, c = launch_data_array_get_count(ldpa);
-
-		argv = alloca((c + 1) * sizeof(char *));
-
-		for (i = 0; i < c; i++)
-			argv[i] = launch_data_get_string(launch_data_array_get_index(ldpa, i));
-		argv[i] = NULL;
-	}
-
 	if ((j = job_new(root_jobmgr, label, prog, argv, NULL))) {
 		launch_data_dict_iterate(pload, job_import_keys, j);
 	}

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20061214/80635fbf/attachment.html


More information about the launchd-changes mailing list