diff options
Diffstat (limited to 'source4/librpc')
-rw-r--r-- | source4/librpc/rpc/dcerpc.h | 6 | ||||
-rw-r--r-- | source4/librpc/rpc/dcerpc_util.c | 61 | ||||
-rw-r--r-- | source4/librpc/tests/binding_string.c | 23 |
3 files changed, 61 insertions, 29 deletions
diff --git a/source4/librpc/rpc/dcerpc.h b/source4/librpc/rpc/dcerpc.h index 746f6b6d50..f075075c02 100644 --- a/source4/librpc/rpc/dcerpc.h +++ b/source4/librpc/rpc/dcerpc.h @@ -28,9 +28,9 @@ #include "librpc/ndr/libndr.h" enum dcerpc_transport_t { - NCACN_NP, NCACN_IP_TCP, NCACN_IP_UDP, NCACN_VNS_IPC, NCACN_VNS_SPP, - NCACN_AT_DSP, NCADG_AT_DDP, NCALRPC, NCACN_UNIX_STREAM, NCADG_UNIX_DGRAM, - NCACN_HTTP, NCADG_IPX, NCACN_SPX }; + NCA_UNKNOWN, NCACN_NP, NCACN_IP_TCP, NCACN_IP_UDP, NCACN_VNS_IPC, + NCACN_VNS_SPP, NCACN_AT_DSP, NCADG_AT_DDP, NCALRPC, NCACN_UNIX_STREAM, + NCADG_UNIX_DGRAM, NCACN_HTTP, NCADG_IPX, NCACN_SPX }; /* this defines a generic security context for signed/sealed dcerpc pipes. diff --git a/source4/librpc/rpc/dcerpc_util.c b/source4/librpc/rpc/dcerpc_util.c index 66ce2bda85..e1fb4c1d86 100644 --- a/source4/librpc/rpc/dcerpc_util.c +++ b/source4/librpc/rpc/dcerpc_util.c @@ -235,15 +235,17 @@ char *dcerpc_binding_string(TALLOC_CTX *mem_ctx, const struct dcerpc_binding *b) { char *s = talloc_strdup(mem_ctx, ""); int i; - const char *t_name=NULL; + const char *t_name = NULL; - for (i=0;i<ARRAY_SIZE(transports);i++) { - if (transports[i].transport == b->transport) { - t_name = transports[i].name; + if (b->transport != NCA_UNKNOWN) { + for (i=0;i<ARRAY_SIZE(transports);i++) { + if (transports[i].transport == b->transport) { + t_name = transports[i].name; + } + } + if (!t_name) { + return NULL; } - } - if (!t_name) { - return NULL; } if (!GUID_all_zero(&b->object.uuid)) { @@ -251,8 +253,13 @@ char *dcerpc_binding_string(TALLOC_CTX *mem_ctx, const struct dcerpc_binding *b) GUID_string(mem_ctx, &b->object.uuid)); } - s = talloc_asprintf_append(s, "%s:", t_name); - if (!s) return NULL; + if (t_name != NULL) { + s = talloc_asprintf_append(s, "%s:", t_name); + if (s == NULL) + return NULL; + } else { + s = NULL; + } if (b->host) { s = talloc_asprintf_append(s, "%s", b->host); @@ -323,27 +330,29 @@ NTSTATUS dcerpc_parse_binding(TALLOC_CTX *mem_ctx, const char *s, struct dcerpc_ b->object.if_version = 0; p = strchr(s, ':'); - if (!p) { - return NT_STATUS_INVALID_PARAMETER; - } - type = talloc_strndup(mem_ctx, s, PTR_DIFF(p, s)); - if (!type) { - return NT_STATUS_NO_MEMORY; - } + if (p == NULL) { + b->transport = NCA_UNKNOWN; + } else { + type = talloc_strndup(mem_ctx, s, PTR_DIFF(p, s)); + if (!type) { + return NT_STATUS_NO_MEMORY; + } - for (i=0;i<ARRAY_SIZE(transports);i++) { - if (strcasecmp(type, transports[i].name) == 0) { - b->transport = transports[i].transport; - break; + for (i=0;i<ARRAY_SIZE(transports);i++) { + if (strcasecmp(type, transports[i].name) == 0) { + b->transport = transports[i].transport; + break; + } + } + + if (i==ARRAY_SIZE(transports)) { + DEBUG(0,("Unknown dcerpc transport '%s'\n", type)); + return NT_STATUS_INVALID_PARAMETER; } - } - if (i==ARRAY_SIZE(transports)) { - DEBUG(0,("Unknown dcerpc transport '%s'\n", type)); - return NT_STATUS_INVALID_PARAMETER; - } - s = p+1; + s = p+1; + } p = strchr(s, '['); if (p) { diff --git a/source4/librpc/tests/binding_string.c b/source4/librpc/tests/binding_string.c index c4ffe19e6b..18cf4dfb46 100644 --- a/source4/librpc/tests/binding_string.c +++ b/source4/librpc/tests/binding_string.c @@ -95,6 +95,27 @@ static const char *test_strings[] = { "ncacn_unix_stream:[/tmp/epmapper,sign]", }; +static bool test_no_transport(struct torture_context *tctx) +{ + const char *binding = "somehost"; + struct dcerpc_binding *b; + 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"); + + s = dcerpc_binding_string(tctx, b); + torture_assert(tctx, s != NULL, "Error converting binding back to string"); + + torture_assert_casestr_equal(tctx, binding, s, + "Mismatch while comparing original and regenerated binding strings"); + + return true; +} + struct torture_suite *torture_local_binding_string(TALLOC_CTX *mem_ctx) { int i; @@ -106,5 +127,7 @@ struct torture_suite *torture_local_binding_string(TALLOC_CTX *mem_ctx) test_BindingString, test_strings[i]); } + torture_suite_add_simple_test(suite, "no transport", test_no_transport); + return suite; } |