]> granicus.if.org Git - graphviz/commitdiff
common protect_rsqb: avoid accessing agxbuf internals
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 10 Dec 2022 04:50:53 +0000 (20:50 -0800)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Wed, 21 Dec 2022 02:54:30 +0000 (18:54 -0800)
Avoiding this will ease some upcoming changes.

Gitlab: #2302

lib/common/htmllex.c

index a69e62966308bce420f4e07838a16ca7a7b47c36..02ad93ea0fdb9a47b396f968db1a5745afe74342 100644 (file)
@@ -897,15 +897,20 @@ static void protect_rsqb(agxbuf *xb) {
     return;
   }
 
-  // if the buffer does not end in a ], we have nothing to do
-  if (xb->ptr[-1] != ']') {
+  // check the last character and if it is not ], we have nothing to do
+  char *data = agxbuse(xb);
+  size_t size = strlen(data);
+  assert(size > 0);
+  if (data[size - 1] != ']') {
+    agxbput_move(xb, data);
     return;
   }
 
-  // rewind over the ]
-  --xb->ptr;
+  // truncate ] and write back the remaining prefix
+  data[size - 1] = '\0';
+  agxbput_move(xb, data);
 
-  // write an XML-escaped version of ]
+  // write an XML-escaped version of ] as a replacement
   agxbput(xb, "&#93;");
 }
 #endif