summaryrefslogtreecommitdiffstats
path: root/source4/librpc
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2014-02-07 16:17:04 +0100
committerGünther Deschner <gd@samba.org>2014-02-13 11:54:15 +0100
commitc2e1dedb81d72a6ccc7fb695bc35bf43862316ad (patch)
treeee8b115edc1ab7dc7dfb60771e72ddd99dd6b78d /source4/librpc
parentf2c058bf2a46915d73daedd87ef5273e880abf50 (diff)
downloadsamba-c2e1dedb81d72a6ccc7fb695bc35bf43862316ad.tar.gz
samba-c2e1dedb81d72a6ccc7fb695bc35bf43862316ad.tar.xz
samba-c2e1dedb81d72a6ccc7fb695bc35bf43862316ad.zip
s4:librpc/tests: use dcerpc_binding_get*() functions
We should not dereference struct dcerpc_binding. Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Guenther Deschner <gd@samba.org>
Diffstat (limited to 'source4/librpc')
-rw-r--r--source4/librpc/tests/binding_string.c84
1 files changed, 63 insertions, 21 deletions
diff --git a/source4/librpc/tests/binding_string.c b/source4/librpc/tests/binding_string.c
index 4ea4633e365..bda92096bc7 100644
--- a/source4/librpc/tests/binding_string.c
+++ b/source4/librpc/tests/binding_string.c
@@ -31,9 +31,10 @@ static bool test_BindingString(struct torture_context *tctx,
{
const char *binding = test_data;
struct dcerpc_binding *b, *b2;
- const char *s, *s2;
+ char *s, *s2, *p;
struct epm_tower tower;
TALLOC_CTX *mem_ctx = tctx;
+ const char *host;
/* Parse */
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(mem_ctx, binding, &b),
@@ -54,19 +55,44 @@ static bool test_BindingString(struct torture_context *tctx,
torture_assert_ntstatus_ok(tctx, dcerpc_binding_from_tower(mem_ctx, &tower, &b2),
"Error generating binding from tower for original binding");
- /* Compare to a stripped down version of the binding string because
- * the protocol tower doesn't contain the extra option data */
- b->options = NULL;
-
- b->flags = 0;
-
s = dcerpc_binding_string(mem_ctx, b);
torture_assert(tctx, s != NULL, "Error converting binding back to string for (stripped down)");
+ /*
+ * Compare to a stripped down version of the binding string because
+ * the protocol tower doesn't contain the extra option data
+ *
+ * We remove all options except of the endpoint.
+ */
+ p = strchr(s, '[');
+ if (p != NULL) {
+ char *p2;
+
+ p2 = strchr(p + 1, ',');
+ if (p2 != NULL) {
+ /*
+ * We only look at the first option,
+ * which might be the endpoint.
+ */
+ p2[0] = ']';
+ p2[1] = '\0';
+ }
+
+ p2 = strchr(p + 1, '=');
+ if (p2 != NULL) {
+ /*
+ * It's not the endpoint, so remove the
+ * whole option section.
+ */
+ *p = '\0';
+ }
+ }
+
s2 = dcerpc_binding_string(mem_ctx, b2);
torture_assert(tctx, s != NULL, "Error converting binding back to string");
- if (b->host && is_ipaddress(b->host)) {
+ host = dcerpc_binding_get_string_option(b, "host");
+ if (host && is_ipaddress_v4(host)) {
torture_assert_casestr_equal(tctx, s, s2, "Mismatch while comparing original and from protocol tower generated binding strings");
}
@@ -102,36 +128,50 @@ static bool test_parse_check_results(struct torture_context *tctx)
{
struct dcerpc_binding *b;
struct GUID uuid;
+ struct GUID object;
+ enum dcerpc_transport_t transport;
+ const char *endpoint;
+ uint32_t flags;
torture_assert_ntstatus_ok(tctx,
GUID_from_string("308FB580-1EB2-11CA-923B-08002B1075A7", &uuid),
"parsing uuid");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER", &b), "parse");
- torture_assert(tctx, b->transport == NCACN_NP, "ncacn_np expected");
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCACN_NP, "ncacn_np expected");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_ip_tcp:$SERVER", &b), "parse");
- torture_assert(tctx, b->transport == NCACN_IP_TCP, "ncacn_ip_tcp expected");
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCACN_IP_TCP, "ncacn_ip_tcp expected");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER[rpcecho]", &b), "parse");
- torture_assert_str_equal(tctx, b->endpoint, "rpcecho", "endpoint");
+ endpoint = dcerpc_binding_get_string_option(b, "endpoint");
+ torture_assert_str_equal(tctx, endpoint, "rpcecho", "endpoint");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER[/pipe/rpcecho]", &b), "parse");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER[/pipe/rpcecho,sign,seal]", &b), "parse");
- torture_assert(tctx, b->flags == DCERPC_SIGN+DCERPC_SEAL, "sign+seal flags");
- torture_assert_str_equal(tctx, b->endpoint, "/pipe/rpcecho", "endpoint");
+ flags = dcerpc_binding_get_flags(b);
+ torture_assert(tctx, flags == DCERPC_SIGN+DCERPC_SEAL, "sign+seal flags");
+ endpoint = dcerpc_binding_get_string_option(b, "endpoint");
+ torture_assert_str_equal(tctx, endpoint, "/pipe/rpcecho", "endpoint");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_np:$SERVER[,sign]", &b), "parse");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_ip_tcp:$SERVER[,sign]", &b), "parse");
- torture_assert(tctx, b->endpoint == NULL, "endpoint");
- torture_assert(tctx, b->flags == DCERPC_SIGN, "sign flag");
+ endpoint = dcerpc_binding_get_string_option(b, "endpoint");
+ torture_assert(tctx, endpoint == NULL, "endpoint");
+ flags = dcerpc_binding_get_flags(b);
+ torture_assert(tctx, flags == DCERPC_SIGN, "sign flag");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncalrpc:", &b), "parse");
- torture_assert(tctx, b->transport == NCALRPC, "ncalrpc expected");
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCALRPC, "ncalrpc expected");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx,
"308FB580-1EB2-11CA-923B-08002B1075A7@ncacn_np:$SERVER", &b), "parse");
- torture_assert(tctx, GUID_equal(&b->object.uuid, &uuid), "object uuid");
- torture_assert_int_equal(tctx, b->object.if_version, 0, "object version");
+ object = dcerpc_binding_get_object(b);
+ torture_assert(tctx, GUID_equal(&object, &uuid), "object uuid");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx,
"308FB580-1EB2-11CA-923B-08002B1075A7@ncacn_ip_tcp:$SERVER", &b), "parse");
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, "ncacn_ip_tcp:$SERVER[,sign,localaddress=192.168.1.1]", &b), "parse");
- torture_assert(tctx, b->transport == NCACN_IP_TCP, "ncacn_ip_tcp expected");
- torture_assert(tctx, b->flags == DCERPC_SIGN, "sign flag");
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCACN_IP_TCP, "ncacn_ip_tcp expected");
+ flags = dcerpc_binding_get_flags(b);
+ torture_assert(tctx, flags == DCERPC_SIGN, "sign flag");
torture_assert_str_equal(tctx, dcerpc_binding_get_string_option(b, "localaddress"),
"192.168.1.1", "localaddress");
torture_assert_str_equal(tctx, "ncacn_ip_tcp:$SERVER[,sign,localaddress=192.168.1.1]",
@@ -144,13 +184,15 @@ static bool test_no_transport(struct torture_context *tctx)
{
const char *binding = "somehost";
struct dcerpc_binding *b;
+ enum dcerpc_transport_t transport;
const char *s;
/* Parse */
torture_assert_ntstatus_ok(tctx, dcerpc_parse_binding(tctx, binding, &b),
"Error parsing binding string");
- torture_assert(tctx, b->transport == NCA_UNKNOWN, "invalid transport");
+ transport = dcerpc_binding_get_transport(b);
+ torture_assert(tctx, transport == NCA_UNKNOWN, "invalid transport");
s = dcerpc_binding_string(tctx, b);
torture_assert(tctx, s != NULL, "Error converting binding back to string");