summaryrefslogtreecommitdiff
path: root/usr/src/cmd/svc/startd/restarter.c
diff options
context:
space:
mode:
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);