]> git.eshelyaron.com Git - emacs.git/commitdiff
bindat (strz): Error on null byte if packing variable-length string
authorRichard Hansen <rhansen@rhansen.org>
Mon, 13 Jun 2022 12:32:01 +0000 (14:32 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 13 Jun 2022 13:33:12 +0000 (15:33 +0200)
* lisp/emacs-lisp/bindat.el (strz): Signal an error if a null byte is
encountered while packing a string to a variable-length strz field.
* test/lisp/emacs-lisp/bindat-tests.el (strz): Add tests (bug#55938).

lisp/emacs-lisp/bindat.el
test/lisp/emacs-lisp/bindat-tests.el

index 2d6589b52def789e458745919587149ac6e335c4..9ba89a5e3fe9fde8cefabcec351f81ee32d7f13b 100644 (file)
@@ -444,6 +444,11 @@ e.g. corresponding to STRUCT.FIELD1[INDEX2].FIELD3..."
   (let* ((v (string-to-unibyte v))
          (len (length v)))
     (dotimes (i len)
+      (when (= (aref v i) 0)
+        ;; Alternatively we could pretend that this was the end of
+        ;; the string and stop packing, but then bindat-length would
+        ;; need to scan the input string looking for a null byte.
+        (error "Null byte encountered in input strz string"))
       (aset bindat-raw (+ bindat-idx i) (aref v i)))
     (setq bindat-idx (+ bindat-idx len 1))))
 
index 8bb3baa485e3be6d658e88f1c63bc0c4d622662f..7d1233ded7cad40bafe57e43abe941f004210180 100644 (file)
 
   (ert-deftest bindat-test--strz-varlen-pack ()
     (should (equal (bindat-pack spec "") "\0"))
-    (should (equal (bindat-pack spec "abc") "abc\0")))
+    (should (equal (bindat-pack spec "abc") "abc\0"))
+    ;; Null bytes in the input string break unpacking.
+    (should-error (bindat-pack spec "\0"))
+    (should-error (bindat-pack spec "\0x"))
+    (should-error (bindat-pack spec "x\0"))
+    (should-error (bindat-pack spec "x\0y")))
 
   (ert-deftest bindat-test--strz-varlen-unpack ()
     (should (equal (bindat-unpack spec "\0") ""))