summaryrefslogtreecommitdiff
path: root/src/dbusbind.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbusbind.c')
-rw-r--r--src/dbusbind.c69
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;
}