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
This commit is contained in:
parent
edefbdd7cb
commit
9425bee7a0
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user