diff options
Diffstat (limited to 'src/dbusbind.c')
-rw-r--r-- | src/dbusbind.c | 69 |
1 files changed, 62 insertions, 7 deletions
diff --git a/src/dbusbind.c b/src/dbusbind.c index 62923b462b5..2ed7369c9dc 100644 --- a/src/dbusbind.c +++ b/src/dbusbind.c @@ -538,6 +538,54 @@ xd_signature (char *signature, unsigned int dtype, unsigned int parent_type, Lis XD_DEBUG_MESSAGE ("%s", signature); } +/* Convert X to a signed integer with bounds LO and HI. */ +static intmax_t +extract_signed (Lisp_Object x, intmax_t lo, intmax_t hi) +{ + CHECK_NUMBER_OR_FLOAT (x); + if (INTEGERP (x)) + { + if (lo <= XINT (x) && XINT (x) <= hi) + return XINT (x); + } + else + { + double d = XFLOAT_DATA (x); + if (lo <= d && d <= hi) + { + intmax_t n = d; + if (n == d) + return n; + } + } + args_out_of_range_3 (x, + make_fixnum_or_float (lo), + make_fixnum_or_float (hi)); +} + +/* Convert X to an unsigned integer with bounds 0 and HI. */ +static uintmax_t +extract_unsigned (Lisp_Object x, uintmax_t hi) +{ + CHECK_NUMBER_OR_FLOAT (x); + if (INTEGERP (x)) + { + if (0 <= XINT (x) && XINT (x) <= hi) + return XINT (x); + } + else + { + double d = XFLOAT_DATA (x); + if (0 <= d && d <= hi) + { + uintmax_t n = d; + if (n == d) + return n; + } + } + args_out_of_range_2 (x, make_fixnum_or_float (hi)); +} + /* Append C value, extracted from Lisp OBJECT, to iteration ITER. DTYPE must be a valid DBusType. It is used to convert Lisp objects, being arguments of `dbus-call-method' or @@ -572,7 +620,7 @@ xd_append_arg (unsigned int dtype, Lisp_Object object, DBusMessageIter *iter) } case DBUS_TYPE_INT16: - CHECK_NUMBER (object); + CHECK_TYPE_RANGED_INTEGER (dbus_int16_t, object); { dbus_int16_t val = XINT (object); int pval = val; @@ -583,7 +631,7 @@ xd_append_arg (unsigned int dtype, Lisp_Object object, DBusMessageIter *iter) } case DBUS_TYPE_UINT16: - CHECK_NATNUM (object); + CHECK_TYPE_RANGED_INTEGER (dbus_uint16_t, object); { dbus_uint16_t val = XFASTINT (object); unsigned int pval = val; @@ -595,7 +643,9 @@ xd_append_arg (unsigned int dtype, Lisp_Object object, DBusMessageIter *iter) case DBUS_TYPE_INT32: { - dbus_int32_t val = extract_float (object); + dbus_int32_t val = extract_signed (object, + TYPE_MINIMUM (dbus_int32_t), + TYPE_MAXIMUM (dbus_int32_t)); int pval = val; XD_DEBUG_MESSAGE ("%c %d", dtype, pval); if (!dbus_message_iter_append_basic (iter, dtype, &val)) @@ -608,7 +658,8 @@ xd_append_arg (unsigned int dtype, Lisp_Object object, DBusMessageIter *iter) case DBUS_TYPE_UNIX_FD: #endif { - dbus_uint32_t val = extract_float (object); + dbus_uint32_t val = extract_unsigned (object, + TYPE_MAXIMUM (dbus_uint32_t)); unsigned int pval = val; XD_DEBUG_MESSAGE ("%c %u", dtype, pval); if (!dbus_message_iter_append_basic (iter, dtype, &val)) @@ -617,8 +668,11 @@ xd_append_arg (unsigned int dtype, Lisp_Object object, DBusMessageIter *iter) } case DBUS_TYPE_INT64: + CHECK_TYPE_RANGED_INTEGER_OR_FLOAT (dbus_int64_t, object); { - dbus_int64_t val = extract_float (object); + dbus_int64_t val = extract_signed (object, + TYPE_MINIMUM (dbus_int64_t), + TYPE_MAXIMUM (dbus_int64_t)); printmax_t pval = val; XD_DEBUG_MESSAGE ("%c %"pMd, dtype, pval); if (!dbus_message_iter_append_basic (iter, dtype, &val)) @@ -628,7 +682,8 @@ xd_append_arg (unsigned int dtype, Lisp_Object object, DBusMessageIter *iter) case DBUS_TYPE_UINT64: { - dbus_uint64_t val = extract_float (object); + dbus_uint64_t val = extract_unsigned (object, + TYPE_MAXIMUM (dbus_uint64_t)); uprintmax_t pval = val; XD_DEBUG_MESSAGE ("%c %"pMu, dtype, pval); if (!dbus_message_iter_append_basic (iter, dtype, &val)) @@ -1363,7 +1418,7 @@ usage: (dbus-message-internal &rest REST) */) if ((count+2 <= nargs) && (EQ ((args[count]), QCdbus_timeout))) { CHECK_NATNUM (args[count+1]); - timeout = XFASTINT (args[count+1]); + timeout = min (XFASTINT (args[count+1]), INT_MAX); count = count+2; } |