summaryrefslogtreecommitdiff
path: root/usr/src/cmd/svc/startd/restarter.c
diff options
context:
space:
mode:
authorJohn Sonnenschein <johns@joyent.com>2012-05-17 18:26:57 +0000
committerJohn Sonnenschein <johns@joyent.com>2012-05-17 18:26:57 +0000
commit04b244dd661c24b510ac22936decfc0972d202d3 (patch)
tree3ebfef98afc303fddf3415d6fba64e8682f495e8 /usr/src/cmd/svc/startd/restarter.c
parenteac250589e41f1b705e1b7427b02b3379aac9f9e (diff)
parenta69187741b83640a90dd8586195456dd50c016a8 (diff)
downloadillumos-joyent-20120517.tar.gz
Merge git.joyent.com:illumos-joyent20120517
Diffstat (limited to 'usr/src/cmd/svc/startd/restarter.c')
-rw-r--r--usr/src/cmd/svc/startd/restarter.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/usr/src/cmd/svc/startd/restarter.c b/usr/src/cmd/svc/startd/restarter.c
index a088592d14..a55fb489ad 100644
--- a/usr/src/cmd/svc/startd/restarter.c
+++ b/usr/src/cmd/svc/startd/restarter.c
@@ -373,9 +373,11 @@ rep_retry:
if (inst->ri_logstem != NULL)
startd_free(inst->ri_logstem, PATH_MAX);
if (inst->ri_common_name != NULL)
- startd_free(inst->ri_common_name, max_scf_value_size);
+ startd_free(inst->ri_common_name,
+ strlen(inst->ri_common_name) + 1);
if (inst->ri_C_common_name != NULL)
- startd_free(inst->ri_C_common_name, max_scf_value_size);
+ startd_free(inst->ri_C_common_name,
+ strlen(inst->ri_C_common_name) + 1);
snap = NULL;
inst->ri_logstem = NULL;
inst->ri_common_name = NULL;
@@ -529,8 +531,25 @@ rep_retry:
abort();
}
- switch (libscf_get_template_values(scf_inst, snap,
- &inst->ri_common_name, &inst->ri_C_common_name)) {
+ r = libscf_get_template_values(scf_inst, snap,
+ &inst->ri_common_name, &inst->ri_C_common_name);
+
+ /*
+ * Copy our names to smaller buffers to reduce our memory footprint.
+ */
+ if (inst->ri_common_name != NULL) {
+ char *tmp = safe_strdup(inst->ri_common_name);
+ startd_free(inst->ri_common_name, max_scf_value_size);
+ inst->ri_common_name = tmp;
+ }
+
+ if (inst->ri_C_common_name != NULL) {
+ char *tmp = safe_strdup(inst->ri_C_common_name);
+ startd_free(inst->ri_C_common_name, max_scf_value_size);
+ inst->ri_C_common_name = tmp;
+ }
+
+ switch (r) {
case 0:
break;
@@ -678,9 +697,11 @@ deleted:
if (inst->ri_logstem != NULL)
startd_free(inst->ri_logstem, PATH_MAX);
if (inst->ri_common_name != NULL)
- startd_free(inst->ri_common_name, max_scf_value_size);
+ startd_free(inst->ri_common_name,
+ strlen(inst->ri_common_name) + 1);
if (inst->ri_C_common_name != NULL)
- startd_free(inst->ri_C_common_name, max_scf_value_size);
+ startd_free(inst->ri_C_common_name,
+ strlen(inst->ri_C_common_name) + 1);
startd_free(inst->ri_utmpx_prefix, max_scf_value_size);
startd_free(inst, sizeof (restarter_inst_t));
return (ENOENT);
@@ -740,9 +761,11 @@ restarter_delete_inst(restarter_inst_t *ri)
startd_free((void *)ri->ri_i.i_fmri, strlen(ri->ri_i.i_fmri) + 1);
startd_free(ri->ri_logstem, PATH_MAX);
if (ri->ri_common_name != NULL)
- startd_free(ri->ri_common_name, max_scf_value_size);
+ startd_free(ri->ri_common_name,
+ strlen(ri->ri_common_name) + 1);
if (ri->ri_C_common_name != NULL)
- startd_free(ri->ri_C_common_name, max_scf_value_size);
+ startd_free(ri->ri_C_common_name,
+ strlen(ri->ri_C_common_name) + 1);
startd_free(ri->ri_utmpx_prefix, max_scf_value_size);
(void) pthread_mutex_destroy(&ri->ri_lock);
(void) pthread_mutex_destroy(&ri->ri_queue_lock);
@@ -1841,6 +1864,7 @@ cont:
rip->ri_queue_thread = 0;
MUTEX_UNLOCK(&rip->ri_queue_lock);
+
out:
(void) scf_handle_unbind(h);
scf_handle_destroy(h);