diff options
| author | Paul Eggert | 2019-09-04 17:43:16 -0700 |
|---|---|---|
| committer | Paul Eggert | 2019-09-04 17:44:15 -0700 |
| commit | 507d5548349540dbde67d3e535a4607fd2207c49 (patch) | |
| tree | 5530eb2b4c815c1050e6c53e457ef08da5cd02c3 /src | |
| parent | 95becaaf3b65d6227a41f4cb3f0f114bcfbe5562 (diff) | |
| download | emacs-507d5548349540dbde67d3e535a4607fd2207c49.tar.gz emacs-507d5548349540dbde67d3e535a4607fd2207c49.zip | |
Tweak xd_append_arg to pacify -Wnull-dereference
* 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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/dbusbind.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/src/dbusbind.c b/src/dbusbind.c index 90ba461c6bc..7f4c8717f42 100644 --- a/src/dbusbind.c +++ b/src/dbusbind.c | |||
| @@ -728,22 +728,27 @@ xd_append_arg (int dtype, Lisp_Object object, DBusMessageIter *iter) | |||
| 728 | strcpy (signature, DBUS_TYPE_STRING_AS_STRING); | 728 | strcpy (signature, DBUS_TYPE_STRING_AS_STRING); |
| 729 | 729 | ||
| 730 | else | 730 | else |
| 731 | /* If the element type is DBUS_TYPE_SIGNATURE, and this is | 731 | { |
| 732 | the only element, the value of this element is used as | 732 | /* If the element type is DBUS_TYPE_SIGNATURE, and this is |
| 733 | the array's element signature. */ | 733 | the only element, the value of this element is used as |
| 734 | if ((XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (object)) | 734 | the array's element signature. */ |
| 735 | == DBUS_TYPE_SIGNATURE) | 735 | if (CONSP (object) && (XD_OBJECT_TO_DBUS_TYPE (XCAR (object)) |
| 736 | && STRINGP (CAR_SAFE (XD_NEXT_VALUE (object))) | 736 | == DBUS_TYPE_SIGNATURE)) |
| 737 | && NILP (CDR_SAFE (XD_NEXT_VALUE (object)))) | 737 | { |
| 738 | { | 738 | Lisp_Object val = XD_NEXT_VALUE (object); |
| 739 | lispstpcpy (signature, CAR_SAFE (XD_NEXT_VALUE (object))); | 739 | if (CONSP (val) && STRINGP (XCAR (val)) && NILP (XCDR (val)) |
| 740 | object = CDR_SAFE (XD_NEXT_VALUE (object)); | 740 | && SBYTES (XCAR (val)) < DBUS_MAXIMUM_SIGNATURE_LENGTH) |
| 741 | } | 741 | { |
| 742 | 742 | lispstpcpy (signature, XCAR (val)); | |
| 743 | else | 743 | object = Qnil; |
| 744 | xd_signature (signature, | 744 | } |
| 745 | XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (object)), | 745 | } |
| 746 | dtype, CAR_SAFE (XD_NEXT_VALUE (object))); | 746 | |
| 747 | if (!NILP (object)) | ||
| 748 | xd_signature (signature, | ||
| 749 | XD_OBJECT_TO_DBUS_TYPE (CAR_SAFE (object)), | ||
| 750 | dtype, CAR_SAFE (XD_NEXT_VALUE (object))); | ||
| 751 | } | ||
| 747 | 752 | ||
| 748 | XD_DEBUG_MESSAGE ("%c %s %s", dtype, signature, | 753 | XD_DEBUG_MESSAGE ("%c %s %s", dtype, signature, |
| 749 | XD_OBJECT_TO_STRING (object)); | 754 | XD_OBJECT_TO_STRING (object)); |