about summary refs log tree commit diff
path: root/chat.h
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2021-06-09 14:34:57 -0700
committerJune McEnroe <june@causal.agency>2021-06-09 17:54:26 -0400
commit0a1cfca0f41ca4ee5d981253b8f151c67aacf4f6 (patch)
treea3876a6d59daf3d0ad25832c79b9645d5fc88aa7 /chat.h
parentRemove catf (diff)
downloadcatgirl-0a1cfca0f41ca4ee5d981253b8f151c67aacf4f6.tar.gz
catgirl-0a1cfca0f41ca4ee5d981253b8f151c67aacf4f6.zip
Avoid creating out-of-bounds pointer when checking for seprintf truncation
It is technically undefined behavior (see C11 6.5.6p8) to construct
a pointer more than one past the end of an array. To prevent this,
compare n with the remaining space in the array before adding to
ptr.
Diffstat (limited to 'chat.h')
-rw-r--r--chat.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/chat.h b/chat.h
index e75112a..327262b 100644
--- a/chat.h
+++ b/chat.h
@@ -52,8 +52,8 @@ static inline char *seprintf(char *ptr, char *end, const char *fmt, ...) {
 	int n = vsnprintf(ptr, end - ptr, fmt, ap);
 	va_end(ap);
 	if (n < 0) return NULL;
-	ptr += n;
-	return (ptr > end ? end : ptr);
+	if (n > end - ptr) return end;
+	return ptr + n;
 }
 
 enum Attr {