Skip to content

Commit dedd3d4

Browse files
marcrittinghausunikraft-bot
authored andcommitted
lib/ukdebug: Fix overrun in outf for OUTDEV_BUFFER
This patch fixes two bugs: 1) The return value of vsnprintf does not include the null-terminator. Subtracting one is thus not necessary. 2) In case the buffer is too small, vsnprintf returns the number of characters that would have been written if the buffer had enough space. The return value must therefore be tested against the remaining buffer space. Signed-off-by: Marc Rittinghaus <[email protected]> Reviewed-by: Vlad-Andrei Badoiu <[email protected]> Tested-by: Unikraft CI <[email protected]> GitHub-Pull-Request: unikraft#232
1 parent 93a6888 commit dedd3d4

File tree

1 file changed

+4
-5
lines changed

1 file changed

+4
-5
lines changed

lib/ukdebug/outf.c

+4-5
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
int outf(struct out_dev *dev, const char *fmt, ...)
4444
{
4545
int ret = 0;
46+
size_t rem;
4647
va_list ap;
4748

4849
UK_ASSERT(dev);
@@ -57,11 +58,9 @@ int outf(struct out_dev *dev, const char *fmt, ...)
5758
ret = __uk_vsnprintf(dev->buffer.pos, dev->buffer.left, fmt, ap);
5859

5960
if (ret > 0) {
60-
/* in order to overwrite '\0' by successive calls,
61-
* we move the buffer pointer by (ret-1) characters
62-
*/
63-
dev->buffer.pos += (ret - 1);
64-
dev->buffer.left -= (ret - 1);
61+
rem = MIN(dev->buffer.left, (size_t)ret);
62+
dev->buffer.pos += rem;
63+
dev->buffer.left -= rem;
6564
}
6665
break;
6766
case OUTDEV_DEBUG:

0 commit comments

Comments
 (0)