aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/roff.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-01-01 19:28:49 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-01-01 19:28:49 +0000
commit5cdf519064e2a4e99ff35d500e68650cc82dfa4e (patch)
tree7c9240853783cdf44298625b2d2ef419f90104cc /roff.c
parent031d1f01fc925d18b3af6e51565d51044023590b (diff)
downloadmandoc-5cdf519064e2a4e99ff35d500e68650cc82dfa4e.tar.gz
mandoc-5cdf519064e2a4e99ff35d500e68650cc82dfa4e.tar.zst
mandoc-5cdf519064e2a4e99ff35d500e68650cc82dfa4e.zip
Fix a buffer overrun triggered by a trailing backslash at EOF in
an unclosed conditional body. If the memory contained the byte sequence "\}" after the end of the buffer before the next NUL, this could even write beyond the end of the buffer, specifically '&' to the location of the '}'. Found by jsg@ with afl.
Diffstat (limited to 'roff.c')
-rw-r--r--roff.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/roff.c b/roff.c
index c421ea29..ef9c020d 100644
--- a/roff.c
+++ b/roff.c
@@ -1,7 +1,7 @@
-/* $Id: roff.c,v 1.246 2014/12/28 14:16:26 schwarze Exp $ */
+/* $Id: roff.c,v 1.247 2015/01/01 19:28:49 schwarze Exp $ */
/*
- * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2011, 2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -1163,7 +1163,8 @@ roff_cond_sub(ROFF_ARGS)
*ep = '&';
roff_ccond(r, ln, ep - buf->buf - 1);
}
- ++ep;
+ if (*ep != '\0')
+ ++ep;
}
return(rr ? ROFF_CONT : ROFF_IGN);
}
@@ -1183,7 +1184,8 @@ roff_cond_text(ROFF_ARGS)
*ep = '&';
roff_ccond(r, ln, ep - buf->buf - 1);
}
- ++ep;
+ if (*ep != '\0')
+ ++ep;
}
return(rr ? ROFF_CONT : ROFF_IGN);
}