diff options
author | jhb <jhb@FreeBSD.org> | 2009-09-10 12:58:37 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2009-09-10 12:58:37 +0000 |
commit | cedb32d24aa57ad6f241ae194a01bd194a10e0d5 (patch) | |
tree | ebf45e94c89fac9c31d2246b25dea1f9f46b8072 /sys/dev/syscons | |
parent | b9f96dd3c05dc496081fe2e9cf86821da07743bc (diff) | |
download | FreeBSD-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.c | 18 |
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; |