summaryrefslogtreecommitdiffstats
path: root/sys/dev/syscons
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2009-09-10 12:58:37 +0000
committerjhb <jhb@FreeBSD.org>2009-09-10 12:58:37 +0000
commitcedb32d24aa57ad6f241ae194a01bd194a10e0d5 (patch)
treeebf45e94c89fac9c31d2246b25dea1f9f46b8072 /sys/dev/syscons
parentb9f96dd3c05dc496081fe2e9cf86821da07743bc (diff)
downloadFreeBSD-src-cedb32d24aa57ad6f241ae194a01bd194a10e0d5.zip
FreeBSD-src-cedb32d24aa57ad6f241ae194a01bd194a10e0d5.tar.gz
Don't malloc a buffer while holding the prison0 mutex. Instead, use a loop
where we figure out the hostname length under the lock, malloc the buffer with the lock dropped, then recheck the length under the lock and loop again if the buffer is now too small. Tested by: Norbert Koch nkoch demig de MFC after: 3 days
Diffstat (limited to 'sys/dev/syscons')
-rw-r--r--sys/dev/syscons/daemon/daemon_saver.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/sys/dev/syscons/daemon/daemon_saver.c b/sys/dev/syscons/daemon/daemon_saver.c
index 3009d31..816795e 100644
--- a/sys/dev/syscons/daemon/daemon_saver.c
+++ b/sys/dev/syscons/daemon/daemon_saver.c
@@ -351,11 +351,23 @@ daemon_saver(video_adapter_t *adp, int blank)
static int
daemon_init(video_adapter_t *adp)
{
+ size_t hostlen;
mtx_lock(&prison0.pr_mtx);
- messagelen = strlen(prison0.pr_hostname) + 3 + strlen(ostype) + 1 +
- strlen(osrelease);
- message = malloc(messagelen + 1, M_DEVBUF, M_WAITOK);
+ for (;;) {
+ hostlen = strlen(prison0.pr_hostname);
+ mtx_unlock(&prison0.pr_mtx);
+
+ messagelen = hostlen + 3 + strlen(ostype) + 1 +
+ strlen(osrelease);
+ message = malloc(messagelen + 1, M_DEVBUF, M_WAITOK);
+ mtx_lock(&prison0.pr_mtx);
+ if (hostlen < strlen(prison0.pr_hostname)) {
+ free(message, M_DEVBUF);
+ continue;
+ }
+ break;
+ }
sprintf(message, "%s - %s %s", prison0.pr_hostname, ostype, osrelease);
mtx_unlock(&prison0.pr_mtx);
blanked = 0;
OpenPOWER on IntegriCloud