<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[23299] trunk/launchd/src/launchd_core_logic.c</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.macosforge.org/projects/launchd/changeset/23299">23299</a></dd>
<dt>Author</dt> <dd>zarzycki@apple.com</dd>
<dt>Date</dt> <dd>2007-07-10 13:24:39 -0700 (Tue, 10 Jul 2007)</dd>
</dl>
<h3>Log Message</h3>
<pre><rdar://problem/5318461> Bug: launchd_core_logic.c:3739 (23294):8: (errno = task_set_special_port(mach_task_self(), which_port, ms->port)) == KERN_SUCCESS</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunklaunchdsrclaunchd_core_logicc">trunk/launchd/src/launchd_core_logic.c</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunklaunchdsrclaunchd_core_logicc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_core_logic.c (23298 => 23299)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/launchd/src/launchd_core_logic.c        2007-07-06 21:38:57 UTC (rev 23298)
+++ trunk/launchd/src/launchd_core_logic.c        2007-07-10 20:24:39 UTC (rev 23299)
</span><span class="lines">@@ -121,16 +121,19 @@
</span><span class="cx">
</span><span class="cx"> struct machservice {
</span><span class="cx">         SLIST_ENTRY(machservice) sle;
</span><ins>+        SLIST_ENTRY(machservice) special_port_sle;
</ins><span class="cx">         LIST_ENTRY(machservice) name_hash_sle;
</span><span class="cx">         LIST_ENTRY(machservice) port_hash_sle;
</span><span class="cx">         job_t                        job;
</span><span class="cx">         uint64_t                bad_perf_cnt;
</span><span class="cx">         unsigned int                gen_num;
</span><span class="cx">         mach_port_name_t        port;
</span><del>-        unsigned int                isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, per_user_hack:1, debug_on_close:1, per_pid:1;
</del><ins>+        unsigned int                isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, per_user_hack:1, debug_on_close:1, per_pid:1, special_port_num:10;
</ins><span class="cx">         const char                name[0];
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+static SLIST_HEAD(, machservice) special_ports; /* hack, this should be per jobmgr_t */
+
</ins><span class="cx"> #define PORT_HASH_SIZE 32
</span><span class="cx"> #define HASH_PORT(x)        (IS_POWER_OF_TWO(PORT_HASH_SIZE) ? (MACH_PORT_INDEX(x) & (PORT_HASH_SIZE - 1)) : (MACH_PORT_INDEX(x) % PORT_HASH_SIZE))
</span><span class="cx">
</span><span class="lines">@@ -3740,7 +3743,8 @@
</span><span class="cx">                                 job_log(ms->job, LOG_WARNING, "Tried to set a reserved task special port: %d", which_port);
</span><span class="cx">                                 break;
</span><span class="cx">                         default:
</span><del>-                                job_assumes(ms->job, (errno = task_set_special_port(mach_task_self(), which_port, ms->port)) == KERN_SUCCESS);
</del><ins>+                                ms->special_port_num = which_port;
+                                SLIST_INSERT_HEAD(&special_ports, ms, special_port_sle);
</ins><span class="cx">                                 break;
</span><span class="cx">                         }
</span><span class="cx">                 } else if (strcasecmp(key, LAUNCH_JOBKEY_MACH_HOSTSPECIALPORT) == 0 && getpid() == 1) {
</span><span class="lines">@@ -4185,6 +4189,10 @@
</span><span class="cx">
</span><span class="cx">         job_log(j, LOG_INFO, "Mach service deleted%s: %s", port_died ? " (port died)" : "", ms->name);
</span><span class="cx">
</span><ins>+        if (ms->special_port_num) {
+                SLIST_REMOVE(&special_ports, ms, machservice, special_port_sle);
+        }
+
</ins><span class="cx">         SLIST_REMOVE(&j->machservices, ms, machservice, sle);
</span><span class="cx">         LIST_REMOVE(ms, name_hash_sle);
</span><span class="cx">         LIST_REMOVE(ms, port_hash_sle);
</span><span class="lines">@@ -5022,6 +5030,8 @@
</span><span class="cx"> kern_return_t
</span><span class="cx"> job_mig_post_fork_ping(job_t j, task_t child_task)
</span><span class="cx"> {
</span><ins>+        struct machservice *ms;
+
</ins><span class="cx">         if (!launchd_assumes(j != NULL)) {
</span><span class="cx">                 return BOOTSTRAP_NO_MEMORY;
</span><span class="cx">         }
</span><span class="lines">@@ -5030,6 +5040,14 @@
</span><span class="cx">
</span><span class="cx">         job_setup_exception_port(j, child_task);
</span><span class="cx">
</span><ins>+        SLIST_FOREACH(ms, &special_ports, special_port_sle) {
+                if (j->per_user && (ms->special_port_num != TASK_ACCESS_PORT)) {
+                        /* The TASK_ACCESS_PORT funny business is to workaround 5325399. */
+                        continue;
+                }
+                job_assumes(j, (errno = task_set_special_port(child_task, ms->special_port_num, ms->port)) == KERN_SUCCESS);
+        }
+
</ins><span class="cx">         job_assumes(j, launchd_mport_deallocate(child_task) == KERN_SUCCESS);
</span><span class="cx">
</span><span class="cx">         return 0;
</span></span></pre>
</div>
</div>
</body>
</html>