dbus-marshal-validate.c revision c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68
15c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */
25c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington/* dbus-marshal-validate.c Validation routines for marshaled data
35c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington *
45c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * Copyright (C) 2005 Red Hat, Inc.
55c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington *
65c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * Licensed under the Academic Free License version 2.1
75c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington *
85c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * This program is free software; you can redistribute it and/or modify
95c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * it under the terms of the GNU General Public License as published by
105c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * the Free Software Foundation; either version 2 of the License, or
115c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * (at your option) any later version.
125c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington *
135c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * This program is distributed in the hope that it will be useful,
145c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
165c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * GNU General Public License for more details.
175c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington *
185c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * You should have received a copy of the GNU General Public License
195c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * along with this program; if not, write to the Free Software
205c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
215c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington *
225c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington */
235c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington
245c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington#include "dbus-internals.h"
255c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington#include "dbus-marshal-validate.h"
269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington#include "dbus-marshal-recursive.h"
27fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington#include "dbus-marshal-basic.h"
28fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington#include "dbus-string.h"
295c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington
305c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington/**
315c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * @addtogroup DBusMarshal
325c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington *
335c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington * @{
345c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington */
355c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington
369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/**
379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Verifies that the range of type_str from type_pos to type_end is a
389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * valid signature.  If this function returns #TRUE, it will be safe
399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * to iterate over the signature with a types-only #DBusTypeReader.
409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * The range passed in should NOT include the terminating
419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * nul/DBUS_TYPE_INVALID.
429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
43c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * @todo verify that dict entries have exactly two fields
44c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington *
45c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington * @todo require that dict entries are in an array
46c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington *
479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param type_str the string
489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param type_pos where the typecodes start
499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param len length of typecodes
509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #DBUS_VALID if valid, reason why invalid otherwise
519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */
529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusValidity
539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_validate_signature_with_reason (const DBusString *type_str,
549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                      int               type_pos,
559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                      int               len)
569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *p;
589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *end;
599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int last;
609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int struct_depth;
619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int array_depth;
62c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington  int dict_entry_depth;
639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (type_str != NULL);
653ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington  _dbus_assert (type_pos < _DBUS_INT32_MAX - len);
669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (len >= 0);
679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (type_pos >= 0);
689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len > DBUS_MAXIMUM_SIGNATURE_LENGTH)
709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return DBUS_INVALID_SIGNATURE_TOO_LONG;
719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  p = _dbus_string_get_const_data_len (type_str, type_pos, 0);
739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  end = _dbus_string_get_const_data_len (type_str, type_pos + len, 0);
749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  struct_depth = 0;
759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  array_depth = 0;
76c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington  dict_entry_depth = 0;
779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  last = DBUS_TYPE_INVALID;
789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while (p != end)
809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      switch (*p)
829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_BYTE:
849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_BOOLEAN:
853ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington        case DBUS_TYPE_INT16:
863ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington        case DBUS_TYPE_UINT16:
879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_INT32:
889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_UINT32:
899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_INT64:
909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_UINT64:
919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_DOUBLE:
929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_STRING:
939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_OBJECT_PATH:
949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_SIGNATURE:
959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_VARIANT:
969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_ARRAY:
999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          array_depth += 1;
1009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          if (array_depth > DBUS_MAXIMUM_TYPE_RECURSION_DEPTH)
1019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return DBUS_INVALID_EXCEEDED_MAXIMUM_ARRAY_RECURSION;
1029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
1039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_STRUCT_BEGIN_CHAR:
1059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          struct_depth += 1;
1069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          if (struct_depth > DBUS_MAXIMUM_TYPE_RECURSION_DEPTH)
1089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return DBUS_INVALID_EXCEEDED_MAXIMUM_STRUCT_RECURSION;
1099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
1109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_STRUCT_END_CHAR:
1129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          if (struct_depth == 0)
1139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return DBUS_INVALID_STRUCT_ENDED_BUT_NOT_STARTED;
1149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          if (last == DBUS_STRUCT_BEGIN_CHAR)
1169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return DBUS_INVALID_STRUCT_HAS_NO_FIELDS;
1179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          struct_depth -= 1;
1199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
1209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
121c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington        case DBUS_DICT_ENTRY_BEGIN_CHAR:
122c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington          if (last != DBUS_TYPE_ARRAY)
123c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington            return DBUS_INVALID_DICT_ENTRY_NOT_INSIDE_ARRAY;
124c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington
125c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington          dict_entry_depth += 1;
126c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington
127c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington          if (dict_entry_depth > DBUS_MAXIMUM_TYPE_RECURSION_DEPTH)
128c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington            return DBUS_INVALID_EXCEEDED_MAXIMUM_DICT_ENTRY_RECURSION;
129c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington          break;
130c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington
131c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington        case DBUS_DICT_ENTRY_END_CHAR:
132c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington          if (dict_entry_depth == 0)
133c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington            return DBUS_INVALID_DICT_ENTRY_ENDED_BUT_NOT_STARTED;
134c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington
135c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington          if (last == DBUS_DICT_ENTRY_BEGIN_CHAR)
136c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington            return DBUS_INVALID_DICT_ENTRY_HAS_NO_FIELDS;
137c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington
138c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington          dict_entry_depth -= 1;
139c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington          break;
140c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington
141c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington        case DBUS_TYPE_STRUCT:     /* doesn't appear in signatures */
142c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington        case DBUS_TYPE_DICT_ENTRY: /* ditto */
1439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        default:
1449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          return DBUS_INVALID_UNKNOWN_TYPECODE;
1459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
1469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (*p != DBUS_TYPE_ARRAY)
1489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        array_depth = 0;
1499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      last = *p;
1519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      ++p;
1529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
1539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (array_depth > 0)
1559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return DBUS_INVALID_MISSING_ARRAY_ELEMENT_TYPE;
1569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (struct_depth > 0)
1589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return DBUS_INVALID_STRUCT_STARTED_BUT_NOT_ENDED;
1599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
160c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington  if (dict_entry_depth > 0)
161c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington    return DBUS_INVALID_DICT_ENTRY_STARTED_BUT_NOT_ENDED;
162c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington
1639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  return DBUS_VALID;
1649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
1659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic DBusValidity
1679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonvalidate_body_helper (DBusTypeReader       *reader,
1689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                      int                   byte_order,
1699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                      dbus_bool_t           walk_reader_to_end,
1709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                      const unsigned char  *p,
1719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                      const unsigned char  *end,
1729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                      const unsigned char **new_p)
1739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
1749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int current_type;
1759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while ((current_type = _dbus_type_reader_get_current_type (reader)) != DBUS_TYPE_INVALID)
1779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
1789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      const unsigned char *a;
1799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      int alignment;
1809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      _dbus_verbose ("   validating value of type %s type reader %p type_pos %d p %p end %p %d remain\n",
1829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                     _dbus_type_to_string (current_type), reader, reader->type_pos, p, end,
1839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                     (int) (end - p));
1849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      /* Guarantee that p has one byte to look at */
1869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (p == end)
1879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        return DBUS_INVALID_NOT_ENOUGH_DATA;
1889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
1899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      switch (current_type)
1909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
1919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_BYTE:
1929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          ++p;
1939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
1943ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington
1959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_BOOLEAN:
1963ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington        case DBUS_TYPE_INT16:
1973ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington        case DBUS_TYPE_UINT16:
1989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_INT32:
1999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_UINT32:
2009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_INT64:
2019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_UINT64:
2029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_DOUBLE:
2039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          alignment = _dbus_type_get_alignment (current_type);
2049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          a = _DBUS_ALIGN_ADDRESS (p, alignment);
2059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          if (a >= end)
2069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return DBUS_INVALID_NOT_ENOUGH_DATA;
2079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          while (p != a)
2089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            {
2099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              if (*p != '\0')
2109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                return DBUS_INVALID_ALIGNMENT_PADDING_NOT_NUL;
2119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              ++p;
2129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            }
21362e465339a306fa564b69935da494dad6e1b474aHavoc Pennington
21462e465339a306fa564b69935da494dad6e1b474aHavoc Pennington          if (current_type == DBUS_TYPE_BOOLEAN)
21562e465339a306fa564b69935da494dad6e1b474aHavoc Pennington            {
21662e465339a306fa564b69935da494dad6e1b474aHavoc Pennington              dbus_uint32_t v = _dbus_unpack_uint32 (byte_order,
21762e465339a306fa564b69935da494dad6e1b474aHavoc Pennington                                                     p);
21862e465339a306fa564b69935da494dad6e1b474aHavoc Pennington              if (!(v == 0 || v == 1))
21962e465339a306fa564b69935da494dad6e1b474aHavoc Pennington                return DBUS_INVALID_BOOLEAN_NOT_ZERO_OR_ONE;
22062e465339a306fa564b69935da494dad6e1b474aHavoc Pennington            }
22162e465339a306fa564b69935da494dad6e1b474aHavoc Pennington
2229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          p += alignment;
2239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
2249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_ARRAY:
2269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_STRING:
2279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_OBJECT_PATH:
2289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          {
2299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            dbus_uint32_t claimed_len;
2309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            a = _DBUS_ALIGN_ADDRESS (p, 4);
23272c433f80ba964f03688b61ff754b1c93d0fb4adHavoc Pennington            if (a + 4 > end)
2339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_NOT_ENOUGH_DATA;
2349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            while (p != a)
2359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              {
2369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                if (*p != '\0')
2379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  return DBUS_INVALID_ALIGNMENT_PADDING_NOT_NUL;
2389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                ++p;
2399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              }
2409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            claimed_len = _dbus_unpack_uint32 (byte_order, p);
2429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            p += 4;
2439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
24472c433f80ba964f03688b61ff754b1c93d0fb4adHavoc Pennington            /* p may now be == end */
24572c433f80ba964f03688b61ff754b1c93d0fb4adHavoc Pennington            _dbus_assert (p <= end);
24672c433f80ba964f03688b61ff754b1c93d0fb4adHavoc Pennington
2479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (current_type == DBUS_TYPE_ARRAY)
2489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              {
24931988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington                int array_elem_type = _dbus_type_reader_get_element_type (reader);
2509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                alignment = _dbus_type_get_alignment (array_elem_type);
2519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                p = _DBUS_ALIGN_ADDRESS (p, alignment);
2529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              }
2539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (claimed_len > (unsigned long) (end - p))
2559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_STRING_LENGTH_OUT_OF_BOUNDS;
2569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (current_type == DBUS_TYPE_OBJECT_PATH)
2589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              {
2599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                DBusString str;
2609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                _dbus_string_init_const_len (&str, p, claimed_len);
2619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                if (!_dbus_validate_path (&str, 0,
2629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                          _dbus_string_get_length (&str)))
2639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  return DBUS_INVALID_BAD_PATH;
2649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                p += claimed_len;
2669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              }
2679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            else if (current_type == DBUS_TYPE_STRING)
2689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              {
2699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                DBusString str;
2709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                _dbus_string_init_const_len (&str, p, claimed_len);
2719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                if (!_dbus_string_validate_utf8 (&str, 0,
2729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                 _dbus_string_get_length (&str)))
2739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  return DBUS_INVALID_BAD_UTF8_IN_STRING;
2749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                p += claimed_len;
2769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              }
2779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            else if (current_type == DBUS_TYPE_ARRAY && claimed_len > 0)
2789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              {
2799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                DBusTypeReader sub;
2809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                DBusValidity validity;
2819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                const unsigned char *array_end;
2829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                /* Remember that the reader is types only, so we can't
2849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                 * use it to iterate over elements. It stays the same
2859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                 * for all elements.
2869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                 */
2879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                _dbus_type_reader_recurse (reader, &sub);
2889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                array_end = p + claimed_len;
2909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
2919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                while (p < array_end)
2929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  {
293fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington                    /* FIXME we are calling a function per array element! very bad
294fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington                     * need if (dbus_type_is_fixed(elem_type)) here to just skip
295fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington                     * big blocks of ints/bytes/etc.
296fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington                     */
297fddbc09c4a9125fcb168fb31ff300d4132919ea6Havoc Pennington
2989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                    validity = validate_body_helper (&sub, byte_order, FALSE, p, end, &p);
2999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                    if (validity != DBUS_VALID)
3009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                      return validity;
3019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  }
3029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                if (p != array_end)
3049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  return DBUS_INVALID_ARRAY_LENGTH_INCORRECT;
3059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              }
3069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            /* check nul termination */
3089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (current_type != DBUS_TYPE_ARRAY)
3099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              {
3109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                if (p == end)
3119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  return DBUS_INVALID_NOT_ENOUGH_DATA;
3129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                if (*p != '\0')
3149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  return DBUS_INVALID_STRING_MISSING_NUL;
3159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                ++p;
3169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              }
3179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          }
3189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
3199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_SIGNATURE:
3219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          {
3229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            dbus_uint32_t claimed_len;
3239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            DBusString str;
3249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            claimed_len = *p;
3269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            ++p;
3279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            /* 1 is for nul termination */
3299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (claimed_len + 1 > (unsigned long) (end - p))
3309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_SIGNATURE_LENGTH_OUT_OF_BOUNDS;
3319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            _dbus_string_init_const_len (&str, p, claimed_len);
3339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (!_dbus_validate_signature (&str, 0,
3349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                           _dbus_string_get_length (&str)))
3359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_BAD_SIGNATURE;
3369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            p += claimed_len;
3389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            _dbus_assert (p < end);
3409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (*p != DBUS_TYPE_INVALID)
3419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_SIGNATURE_MISSING_NUL;
3429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            ++p;
3449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            _dbus_verbose ("p = %p end = %p claimed_len %u\n", p, end, claimed_len);
3469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          }
3479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
3489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_VARIANT:
3509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          {
351ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington            /* 1 byte sig len, sig typecodes, align to
352ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington             * contained-type-boundary, values.
353ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington             */
354ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington
3559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            /* In addition to normal signature validation, we need to be sure
3569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington             * the signature contains only a single (possibly container) type.
3579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington             */
3589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            dbus_uint32_t claimed_len;
3599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            DBusString sig;
3609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            DBusTypeReader sub;
3619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            DBusValidity validity;
362ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington            int contained_alignment;
3639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            claimed_len = *p;
3659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            ++p;
3669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            /* + 1 for nul */
3689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (claimed_len + 1 > (unsigned long) (end - p))
3699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_VARIANT_SIGNATURE_LENGTH_OUT_OF_BOUNDS;
3709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            _dbus_string_init_const_len (&sig, p, claimed_len);
3729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (!_dbus_validate_signature (&sig, 0,
3739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                           _dbus_string_get_length (&sig)))
3749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_VARIANT_SIGNATURE_BAD;
3759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            p += claimed_len;
3779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (*p != DBUS_TYPE_INVALID)
3799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_VARIANT_SIGNATURE_MISSING_NUL;
3809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            ++p;
3819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
382ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington            contained_alignment = _dbus_type_get_alignment (_dbus_first_type_in_signature (&sig, 0));
383ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington
384ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington            a = _DBUS_ALIGN_ADDRESS (p, contained_alignment);
3859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (a > end)
3869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_NOT_ENOUGH_DATA;
3879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            while (p != a)
3889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              {
3899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                if (*p != '\0')
3909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  return DBUS_INVALID_ALIGNMENT_PADDING_NOT_NUL;
3919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                ++p;
3929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              }
3939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            _dbus_type_reader_init_types_only (&sub, &sig, 0);
3959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (_dbus_type_reader_get_current_type (&sub) == DBUS_TYPE_INVALID)
3979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_VARIANT_SIGNATURE_EMPTY;
3989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
3999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            validity = validate_body_helper (&sub, byte_order, FALSE, p, end, &p);
4009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (validity != DBUS_VALID)
4019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return validity;
4029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (_dbus_type_reader_next (&sub))
4049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_VARIANT_SIGNATURE_SPECIFIES_MULTIPLE_VALUES;
4059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            _dbus_assert (_dbus_type_reader_get_current_type (&sub) == DBUS_TYPE_INVALID);
4079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          }
4089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
4099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
410c7816d45e82ba8dd7e1e969c2cb6c3a27577cf68Havoc Pennington        case DBUS_TYPE_DICT_ENTRY:
4119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        case DBUS_TYPE_STRUCT:
4129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          {
4139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            DBusTypeReader sub;
4149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            DBusValidity validity;
4159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            a = _DBUS_ALIGN_ADDRESS (p, 8);
4179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (a > end)
4189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return DBUS_INVALID_NOT_ENOUGH_DATA;
4199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            while (p != a)
4209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              {
4219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                if (*p != '\0')
4229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                  return DBUS_INVALID_ALIGNMENT_PADDING_NOT_NUL;
4239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                ++p;
4249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              }
4259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            _dbus_type_reader_recurse (reader, &sub);
4279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            validity = validate_body_helper (&sub, byte_order, TRUE, p, end, &p);
4299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            if (validity != DBUS_VALID)
4309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington              return validity;
4319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          }
4329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
4339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        default:
4359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          _dbus_assert_not_reached ("invalid typecode in supposedly-validated signature");
4369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          break;
4379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
4389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      _dbus_verbose ("   validated value of type %s type reader %p type_pos %d p %p end %p %d remain\n",
4409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                     _dbus_type_to_string (current_type), reader, reader->type_pos, p, end,
4419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                     (int) (end - p));
4429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (p > end)
4449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
4459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          _dbus_verbose ("not enough data!!! p = %p end = %p end-p = %d\n",
4469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                         p, end, (int) (end - p));
4479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          return DBUS_INVALID_NOT_ENOUGH_DATA;
4489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
4499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (walk_reader_to_end)
4519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        _dbus_type_reader_next (reader);
4529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      else
4539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        break;
4549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
4559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (new_p)
4579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    *new_p = p;
4589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  return DBUS_VALID;
4609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
4619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/**
4639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Verifies that the range of value_str from value_pos to value_end is
4649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * a legitimate value of type expected_signature.  If this function
4659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * returns #TRUE, it will be safe to iterate over the values with
4669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBusTypeReader. The signature is assumed to be already valid.
4679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
4689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * If bytes_remaining is not #NULL, then leftover bytes will be stored
4699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * there and #DBUS_VALID returned. If it is #NULL, then
4709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * #DBUS_INVALID_TOO_MUCH_DATA will be returned if bytes are left
4719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * over.
4729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
4739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param expected_signature the expected types in the value_str
4749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param expected_signature_start where in expected_signature is the signature
4759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param byte_order the byte order
4769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param bytes_remaining place to store leftover bytes
47731988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington * @param value_str the string containing the body
4789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param value_pos where the values start
4799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param len length of values after value_pos
4809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #DBUS_VALID if valid, reason why invalid otherwise
4819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */
4829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDBusValidity
4839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_validate_body_with_reason (const DBusString *expected_signature,
4849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 int               expected_signature_start,
4859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 int               byte_order,
4869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 int              *bytes_remaining,
4879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 const DBusString *value_str,
4889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 int               value_pos,
4899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                 int               len)
4909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
4919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  DBusTypeReader reader;
4929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *p;
4939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *end;
4949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  DBusValidity validity;
4959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
4969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (len >= 0);
4979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (value_pos >= 0);
4989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (value_pos <= _dbus_string_get_length (value_str) - len);
4999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_verbose ("validating body from pos %d len %d sig '%s'\n",
5019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                 value_pos, len, _dbus_string_get_const_data_len (expected_signature,
5029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                                  expected_signature_start,
5039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                                                  0));
5049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_type_reader_init_types_only (&reader,
5069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                     expected_signature, expected_signature_start);
5079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  p = _dbus_string_get_const_data_len (value_str, value_pos, len);
5099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  end = p + len;
5109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  validity = validate_body_helper (&reader, byte_order, TRUE, p, end, &p);
5129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (validity != DBUS_VALID)
5139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return validity;
514ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington
515ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington  if (bytes_remaining)
5169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
517ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington      *bytes_remaining = end - p;
518ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington      return DBUS_VALID;
519ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington    }
520ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington  else if (p < end)
521ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington    return DBUS_INVALID_TOO_MUCH_DATA;
522ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington  else
523ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington    {
524ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington      _dbus_assert (p == end);
525ad937e16957c76f21b0df79d742cb4c401d2abb9Havoc Pennington      return DBUS_VALID;
5269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
5279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
5289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/**
5304fce285052c143296cd9e08a48de0175b5207853Havoc Pennington * Determine wether the given charater is valid as the first charater
5314fce285052c143296cd9e08a48de0175b5207853Havoc Pennington * in a name.
5324fce285052c143296cd9e08a48de0175b5207853Havoc Pennington */
5334fce285052c143296cd9e08a48de0175b5207853Havoc Pennington#define VALID_INITIAL_NAME_CHARACTER(c)         \
5344fce285052c143296cd9e08a48de0175b5207853Havoc Pennington  ( ((c) >= 'A' && (c) <= 'Z') ||               \
5354fce285052c143296cd9e08a48de0175b5207853Havoc Pennington    ((c) >= 'a' && (c) <= 'z') ||               \
5364fce285052c143296cd9e08a48de0175b5207853Havoc Pennington    ((c) == '_') )
5374fce285052c143296cd9e08a48de0175b5207853Havoc Pennington
5384fce285052c143296cd9e08a48de0175b5207853Havoc Pennington/**
5394fce285052c143296cd9e08a48de0175b5207853Havoc Pennington * Determine wether the given charater is valid as a second or later
5404fce285052c143296cd9e08a48de0175b5207853Havoc Pennington * character in a name
5414fce285052c143296cd9e08a48de0175b5207853Havoc Pennington */
5424fce285052c143296cd9e08a48de0175b5207853Havoc Pennington#define VALID_NAME_CHARACTER(c)                 \
5434fce285052c143296cd9e08a48de0175b5207853Havoc Pennington  ( ((c) >= '0' && (c) <= '9') ||               \
5444fce285052c143296cd9e08a48de0175b5207853Havoc Pennington    ((c) >= 'A' && (c) <= 'Z') ||               \
5454fce285052c143296cd9e08a48de0175b5207853Havoc Pennington    ((c) >= 'a' && (c) <= 'z') ||               \
5464fce285052c143296cd9e08a48de0175b5207853Havoc Pennington    ((c) == '_') )
5474fce285052c143296cd9e08a48de0175b5207853Havoc Pennington
5484fce285052c143296cd9e08a48de0175b5207853Havoc Pennington/**
5499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks that the given range of the string is a valid object path
5509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * name in the D-BUS protocol. Part of the validation ensures that
5519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * the object path contains only ASCII.
5529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
5539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo this is inconsistent with most of DBusString in that
5549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * it allows a start,len range that extends past the string end.
5559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
5569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo change spec to disallow more things, such as spaces in the
5579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * path name
5589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
5599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param str the string
5609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param start first byte index to check
5619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param len number of bytes to check
5629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the byte range exists and is a valid name
5639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */
5649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t
5659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_validate_path (const DBusString  *str,
5669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                     int                start,
5679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                     int                len)
5689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
5699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *s;
5709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *end;
5719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *last_slash;
5729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start >= 0);
5749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (len >= 0);
5759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start <= _dbus_string_get_length (str));
5769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len > _dbus_string_get_length (str) - start)
5789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
5799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len == 0)
5819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
5829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  s = _dbus_string_get_const_data (str) + start;
5849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  end = s + len;
5859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (*s != '/')
5879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
5889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  last_slash = s;
5899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  ++s;
5909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while (s != end)
5929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
5939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (*s == '/')
5949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
5959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          if ((s - last_slash) < 2)
5969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return FALSE; /* no empty path components allowed */
5979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
5989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          last_slash = s;
5999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
6009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      else
6019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
6024fce285052c143296cd9e08a48de0175b5207853Havoc Pennington          if (_DBUS_UNLIKELY (!VALID_NAME_CHARACTER (*s)))
6039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return FALSE;
6049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
6059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      ++s;
6079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
6089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if ((end - last_slash) < 2 &&
6109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      len > 1)
6119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE; /* trailing slash not allowed unless the string is "/" */
6129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  return TRUE;
6149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
6159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/**
6179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks that the given range of the string is a valid interface name
6189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * in the D-BUS protocol. This includes a length restriction and an
6199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * ASCII subset, see the specification.
6209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
6219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo this is inconsistent with most of DBusString in that
6229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * it allows a start,len range that extends past the string end.
6239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
6249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param str the string
6259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param start first byte index to check
6269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param len number of bytes to check
6279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the byte range exists and is a valid name
6289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */
6299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t
6309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_validate_interface (const DBusString  *str,
6319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                          int                start,
6329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                          int                len)
6339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
6349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *s;
6359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *end;
6369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *iface;
6379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *last_dot;
6389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start >= 0);
6409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (len >= 0);
6419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start <= _dbus_string_get_length (str));
6429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len > _dbus_string_get_length (str) - start)
6449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
6459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len > DBUS_MAXIMUM_NAME_LENGTH)
6479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
6489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len == 0)
6509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
6519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  last_dot = NULL;
6539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  iface = _dbus_string_get_const_data (str) + start;
6549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  end = iface + len;
6559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  s = iface;
6569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  /* check special cases of first char so it doesn't have to be done
6589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington   * in the loop. Note we know len > 0
6599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington   */
6609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (_DBUS_UNLIKELY (*s == '.')) /* disallow starting with a . */
6619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
6629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  else if (_DBUS_UNLIKELY (!VALID_INITIAL_NAME_CHARACTER (*s)))
6639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
6649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  else
6659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    ++s;
6669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while (s != end)
6689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
6699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (*s == '.')
6709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
6719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          if (_DBUS_UNLIKELY ((s + 1) == end))
6729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return FALSE;
6739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          else if (_DBUS_UNLIKELY (!VALID_INITIAL_NAME_CHARACTER (*(s + 1))))
6749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return FALSE;
6759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          last_dot = s;
6769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          ++s; /* we just validated the next char, so skip two */
6779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
6789c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      else if (_DBUS_UNLIKELY (!VALID_NAME_CHARACTER (*s)))
6799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
6809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          return FALSE;
6819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
6829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      ++s;
6849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
6859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (_DBUS_UNLIKELY (last_dot == NULL))
6879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
6889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  return TRUE;
6909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
6919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
6929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/**
6939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks that the given range of the string is a valid member name
6949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * in the D-BUS protocol. This includes a length restriction, etc.,
6959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * see the specification.
6969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
6979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo this is inconsistent with most of DBusString in that
6989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * it allows a start,len range that extends past the string end.
6999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
7009c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param str the string
7019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param start first byte index to check
7029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param len number of bytes to check
7039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the byte range exists and is a valid name
7049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */
7059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t
7069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_validate_member (const DBusString  *str,
7079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                       int                start,
7089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                       int                len)
7099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
7109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *s;
7119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *end;
7129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *member;
7139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start >= 0);
7159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (len >= 0);
7169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start <= _dbus_string_get_length (str));
7179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len > _dbus_string_get_length (str) - start)
7199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
7209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len > DBUS_MAXIMUM_NAME_LENGTH)
7229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
7239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len == 0)
7259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
7269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  member = _dbus_string_get_const_data (str) + start;
7289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  end = member + len;
7299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  s = member;
7309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  /* check special cases of first char so it doesn't have to be done
7329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington   * in the loop. Note we know len > 0
7339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington   */
7349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (_DBUS_UNLIKELY (!VALID_INITIAL_NAME_CHARACTER (*s)))
7369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
7379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  else
7389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    ++s;
7399c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while (s != end)
7419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
7429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (_DBUS_UNLIKELY (!VALID_NAME_CHARACTER (*s)))
7439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
7449c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          return FALSE;
7459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
7469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      ++s;
7489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
7499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  return TRUE;
7519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
7529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/**
7549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks that the given range of the string is a valid error name
7559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * in the D-BUS protocol. This includes a length restriction, etc.,
7569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * see the specification.
7579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
7589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo this is inconsistent with most of DBusString in that
7599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * it allows a start,len range that extends past the string end.
7609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
7619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param str the string
7629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param start first byte index to check
7639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param len number of bytes to check
7649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the byte range exists and is a valid name
7659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */
7669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t
7679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_validate_error_name (const DBusString  *str,
7689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                           int                start,
7699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                           int                len)
7709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
7719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  /* Same restrictions as interface name at the moment */
7729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  return _dbus_validate_interface (str, start, len);
7739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
7749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/* This assumes the first char exists and is ':' */
7769c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtonstatic dbus_bool_t
7778873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington_dbus_validate_unique_name (const DBusString  *str,
7788873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                            int                start,
7798873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                            int                len)
7809c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
7819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *s;
7829c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const unsigned char *end;
7838873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  const unsigned char *name;
7849c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start >= 0);
7869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (len >= 0);
7879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start <= _dbus_string_get_length (str));
7889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7899c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len > _dbus_string_get_length (str) - start)
7909c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
7919c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7929c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len > DBUS_MAXIMUM_NAME_LENGTH)
7939c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
7949c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7959c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (len > 0);
7969c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
7978873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  name = _dbus_string_get_const_data (str) + start;
7988873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  end = name + len;
7998873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  _dbus_assert (*name == ':');
8008873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington  s = name + 1;
8019c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
8029c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while (s != end)
8039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
8049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (*s == '.')
8059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
8069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          if (_DBUS_UNLIKELY ((s + 1) == end))
8079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return FALSE;
8089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          if (_DBUS_UNLIKELY (!VALID_NAME_CHARACTER (*(s + 1))))
8099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington            return FALSE;
8109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          ++s; /* we just validated the next char, so skip two */
8119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
8129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      else if (_DBUS_UNLIKELY (!VALID_NAME_CHARACTER (*s)))
8139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        {
8149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington          return FALSE;
8159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        }
8169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
8179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      ++s;
8189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
8199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
8209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  return TRUE;
8219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
8229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
8239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/**
8248873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * Checks that the given range of the string is a valid bus name in
8258873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * the D-BUS protocol. This includes a length restriction, etc., see
8268873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington * the specification.
8279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
8289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo this is inconsistent with most of DBusString in that
8299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * it allows a start,len range that extends past the string end.
8309c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
8319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param str the string
8329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param start first byte index to check
8339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param len number of bytes to check
8349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the byte range exists and is a valid name
8359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */
8369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t
8378873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington_dbus_validate_bus_name (const DBusString  *str,
8388873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                         int                start,
8398873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington                         int                len)
8409c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
8419c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (_DBUS_UNLIKELY (len == 0))
8429c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
8439c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (_dbus_string_get_byte (str, start) == ':')
8448873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington    return _dbus_validate_unique_name (str, start, len);
8459c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  else
8469c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return _dbus_validate_interface (str, start, len);
8479c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
8489c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
8499c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington/**
8509c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * Checks that the given range of the string is a valid message type
8519c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * signature in the D-BUS protocol.
8529c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
8539c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @todo this is inconsistent with most of DBusString in that
8549c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * it allows a start,len range that extends past the string end.
8559c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington *
8569c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param str the string
8579c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param start first byte index to check
8589c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @param len number of bytes to check
8599c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington * @returns #TRUE if the byte range exists and is a valid signature
8609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington */
8619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Penningtondbus_bool_t
8629c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington_dbus_validate_signature (const DBusString  *str,
8639c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                          int                start,
8649c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                          int                len)
8659c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington{
8669c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start >= 0);
8679c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (start <= _dbus_string_get_length (str));
8689c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  _dbus_assert (len >= 0);
8699c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
8709c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (len > _dbus_string_get_length (str) - start)
8719c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    return FALSE;
8729c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
8739c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  return _dbus_validate_signature_with_reason (str, start, len) == DBUS_VALID;
8749c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington}
8759c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
87631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** define _dbus_check_is_valid_path() */
8779c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDEFINE_DBUS_NAME_CHECK(path);
87831988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** define _dbus_check_is_valid_interface() */
8799c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDEFINE_DBUS_NAME_CHECK(interface);
88031988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** define _dbus_check_is_valid_member() */
8819c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDEFINE_DBUS_NAME_CHECK(member);
88231988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** define _dbus_check_is_valid_error_name() */
8839c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDEFINE_DBUS_NAME_CHECK(error_name);
8848873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington/** define _dbus_check_is_valid_bus_name() */
8858873c90f99303f9cc308f15f8d03e637911f5b9eHavoc PenningtonDEFINE_DBUS_NAME_CHECK(bus_name);
88631988af4089f3793940417535f8eabaae1ac26c8Havoc Pennington/** define _dbus_check_is_valid_signature() */
8879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc PenningtonDEFINE_DBUS_NAME_CHECK(signature);
8889c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
8895c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington/** @} */
8905c486a24e50ef731b8f970060ab10e928cd0e7cdHavoc Pennington
891382d5ad0b4adf0070948fc2da623bc52894a7788Havoc Pennington/* tests in dbus-marshal-validate-util.c */
892