]> git.eshelyaron.com Git - emacs.git/commitdiff
Tweak xd_append_arg to pacify -Wnull-dereference
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 5 Sep 2019 00:43:16 +0000 (17:43 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 5 Sep 2019 00:44:15 +0000 (17:44 -0700)
* src/dbusbind.c (xd_append_arg): Redo to pacify gcc
-Wnull-dereference.  Also, check that the Lisp string won’t
overrun the C signature buffer.

src/dbusbind.c

index 90ba461c6bc083857706b0441f5effb8423633cf..7f4c8717f42d3d909bc6f1495c3e2029e0bd92e4 100644 (file)
@@ -728,22 +728,27 @@ xd_append_arg (int dtype, Lisp_Object object, DBusMessageIter *iter)
            strcpy (signature, DBUS_TYPE_STRING_AS_STRING);
 
          else
-           /* If the element type is DBUS_TYPE_SIGNATURE, and this is
-              the only element, the value of this element is used as
-              the array's element signature.  */
-           if ((XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (object))
-                == DBUS_TYPE_SIGNATURE)
-               && STRINGP (CAR_SAFE (XD_NEXT_VALUE (object)))
-               && NILP (CDR_SAFE (XD_NEXT_VALUE (object))))
-             {
-               lispstpcpy (signature, CAR_SAFE (XD_NEXT_VALUE (object)));
-               object = CDR_SAFE (XD_NEXT_VALUE (object));
-             }
-
-           else
-             xd_signature (signature,
-                           XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (object)),
-                           dtype, CAR_SAFE (XD_NEXT_VALUE (object)));
+           {
+             /* If the element type is DBUS_TYPE_SIGNATURE, and this is
+                the only element, the value of this element is used as
+                the array's element signature.  */
+             if (CONSP (object) && (XD_OBJECT_TO_DBUS_TYPE (XCAR (object))
+                                    == DBUS_TYPE_SIGNATURE))
+               {
+                 Lisp_Object val = XD_NEXT_VALUE (object);
+                 if (CONSP (val) && STRINGP (XCAR (val)) && NILP (XCDR (val))
+                     && SBYTES (XCAR (val)) < DBUS_MAXIMUM_SIGNATURE_LENGTH)
+                   {
+                     lispstpcpy (signature, XCAR (val));
+                     object = Qnil;
+                   }
+               }
+
+             if (!NILP (object))
+               xd_signature (signature,
+                             XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (object)),
+                             dtype, CAR_SAFE (XD_NEXT_VALUE (object)));
+           }
 
          XD_DEBUG_MESSAGE ("%c %s %s", dtype, signature,
                            XD_OBJECT_TO_STRING (object));