]> granicus.if.org Git - graphviz/commitdiff
cgraph agxbput_n: take an early exit when input string is zero
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 7 Aug 2022 02:52:18 +0000 (19:52 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Mon, 8 Aug 2022 14:59:33 +0000 (07:59 -0700)
An upcoming change makes it possible to enter this function with `xb->ptr` as
`NULL`. It looks as if there is nothing wrong with this; a zero-sized string
fits in any agxbuf, including an unallocated one. However UBSan educates us that
calling `memcpy` with a `NULL` destination pointer is undefined behavior, even
when the passed size is 0. So this change avoids reaching `memcpy` when we know
the function will be a no-op.

Note that this is sort of fixing a latent bug, in that an agxbuf user could
already cause the scenario described above by `agxbdisown`ing an agxbuf and then
calling `agxbput_n` on it with size 0. However no existing callers do this.

lib/cgraph/agxbuf.h

index 12bf6c3f65a79edbb2d7a092fb7fe52c75e337ec..7412114bdb11ac961684b7cebd0c9a549efac771 100644 (file)
@@ -150,6 +150,9 @@ static inline PRINTF_LIKE(2, 3) int agxbprint(agxbuf *xb, const char *fmt,
  * Append string s of length ssz into xb
  */
 static inline size_t agxbput_n(agxbuf *xb, const char *s, size_t ssz) {
+  if (ssz == 0) {
+    return 0;
+  }
   if (xb->ptr + ssz > xb->eptr)
     agxbmore(xb, ssz);
   memcpy(xb->ptr, s, ssz);