The branch, master has been updated
       via  3accf9e80f52d4beba8fd4988d17e563e4e70325 (commit)
       via  4f6556d6c0c9b82770e14ce9002a90fd187e9b6c (commit)
       via  40227ef3bf42c048e321edec714bd2618bdc89c3 (commit)
      from  145fe37766cf1ecffb16a03b58b44d08f7ed7558 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 3accf9e80f52d4beba8fd4988d17e563e4e70325
Author: Günther Deschner <g...@samba.org>
Date:   Thu Feb 5 02:08:40 2009 +0100

    s3: use pidl to pull a KRB5_EDATA_NTSTATUS.
    
    Guenther

commit 4f6556d6c0c9b82770e14ce9002a90fd187e9b6c
Author: Günther Deschner <g...@samba.org>
Date:   Thu Feb 5 02:08:04 2009 +0100

    s3: re-run make samba3-idl.
    
    Guenther

commit 40227ef3bf42c048e321edec714bd2618bdc89c3
Author: Günther Deschner <g...@samba.org>
Date:   Thu Feb 5 02:07:39 2009 +0100

    idl: add KRB5_EDATA_NTSTATUS to misc.idl.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 librpc/gen_ndr/misc.h     |    6 ++++++
 librpc/gen_ndr/ndr_misc.c |   36 ++++++++++++++++++++++++++++++++++++
 librpc/gen_ndr/ndr_misc.h |    3 +++
 librpc/idl/misc.idl       |    6 ++++++
 source3/include/ads.h     |    6 ------
 source3/libads/kerberos.c |   42 ++++++------------------------------------
 6 files changed, 57 insertions(+), 42 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/misc.h b/librpc/gen_ndr/misc.h
index de4abdc..e000cb0 100644
--- a/librpc/gen_ndr/misc.h
+++ b/librpc/gen_ndr/misc.h
@@ -42,4 +42,10 @@ enum netr_SchannelType
 #endif
 ;
 
+struct KRB5_EDATA_NTSTATUS {
+       NTSTATUS ntstatus;
+       uint32_t unknown1;
+       uint32_t unknown2;
+}/* [public] */;
+
 #endif /* _HEADER_misc */
diff --git a/librpc/gen_ndr/ndr_misc.c b/librpc/gen_ndr/ndr_misc.c
index 83c9772..28c8560 100644
--- a/librpc/gen_ndr/ndr_misc.c
+++ b/librpc/gen_ndr/ndr_misc.c
@@ -132,3 +132,39 @@ _PUBLIC_ void ndr_print_netr_SchannelType(struct ndr_print 
*ndr, const char *nam
        ndr_print_enum(ndr, name, "ENUM", val, r);
 }
 
+_PUBLIC_ enum ndr_err_code ndr_push_KRB5_EDATA_NTSTATUS(struct ndr_push *ndr, 
int ndr_flags, const struct KRB5_EDATA_NTSTATUS *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_push_align(ndr, 4));
+               NDR_CHECK(ndr_push_NTSTATUS(ndr, NDR_SCALARS, r->ntstatus));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown1));
+               NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->unknown2));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_KRB5_EDATA_NTSTATUS(struct ndr_pull *ndr, 
int ndr_flags, struct KRB5_EDATA_NTSTATUS *r)
+{
+       if (ndr_flags & NDR_SCALARS) {
+               NDR_CHECK(ndr_pull_align(ndr, 4));
+               NDR_CHECK(ndr_pull_NTSTATUS(ndr, NDR_SCALARS, &r->ntstatus));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown1));
+               NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->unknown2));
+       }
+       if (ndr_flags & NDR_BUFFERS) {
+       }
+       return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_KRB5_EDATA_NTSTATUS(struct ndr_print *ndr, const char 
*name, const struct KRB5_EDATA_NTSTATUS *r)
+{
+       ndr_print_struct(ndr, name, "KRB5_EDATA_NTSTATUS");
+       ndr->depth++;
+       ndr_print_NTSTATUS(ndr, "ntstatus", r->ntstatus);
+       ndr_print_uint32(ndr, "unknown1", r->unknown1);
+       ndr_print_uint32(ndr, "unknown2", r->unknown2);
+       ndr->depth--;
+}
+
diff --git a/librpc/gen_ndr/ndr_misc.h b/librpc/gen_ndr/ndr_misc.h
index a38b3c9..938c946 100644
--- a/librpc/gen_ndr/ndr_misc.h
+++ b/librpc/gen_ndr/ndr_misc.h
@@ -20,4 +20,7 @@ void ndr_print_policy_handle(struct ndr_print *ndr, const 
char *name, const stru
 enum ndr_err_code ndr_push_netr_SchannelType(struct ndr_push *ndr, int 
ndr_flags, enum netr_SchannelType r);
 enum ndr_err_code ndr_pull_netr_SchannelType(struct ndr_pull *ndr, int 
ndr_flags, enum netr_SchannelType *r);
 void ndr_print_netr_SchannelType(struct ndr_print *ndr, const char *name, enum 
netr_SchannelType r);
+enum ndr_err_code ndr_push_KRB5_EDATA_NTSTATUS(struct ndr_push *ndr, int 
ndr_flags, const struct KRB5_EDATA_NTSTATUS *r);
+enum ndr_err_code ndr_pull_KRB5_EDATA_NTSTATUS(struct ndr_pull *ndr, int 
ndr_flags, struct KRB5_EDATA_NTSTATUS *r);
+void ndr_print_KRB5_EDATA_NTSTATUS(struct ndr_print *ndr, const char *name, 
const struct KRB5_EDATA_NTSTATUS *r);
 #endif /* _HEADER_NDR_misc */
diff --git a/librpc/idl/misc.idl b/librpc/idl/misc.idl
index 1ef0d91..c4d8c62 100644
--- a/librpc/idl/misc.idl
+++ b/librpc/idl/misc.idl
@@ -35,4 +35,10 @@ interface misc
                SEC_CHAN_DOMAIN      = 4,
                SEC_CHAN_BDC         = 6
        } netr_SchannelType;
+
+       typedef [public] struct {
+               NTSTATUS ntstatus;
+               uint32 unknown1;
+               uint32 unknown2; /* 0x00000001 */
+       } KRB5_EDATA_NTSTATUS;
 }
diff --git a/source3/include/ads.h b/source3/include/ads.h
index abff9ea..0fa19b5 100644
--- a/source3/include/ads.h
+++ b/source3/include/ads.h
@@ -364,12 +364,6 @@ typedef void **ADS_MODLIST;
 
 #ifdef HAVE_KRB5
 typedef struct {
-       NTSTATUS ntstatus;
-       uint32 unknown1;
-       uint32 unknown2; /* 0x00000001 */
-} KRB5_EDATA_NTSTATUS;
-
-typedef struct {
 #if defined(HAVE_MAGIC_IN_KRB5_ADDRESS) && 
defined(HAVE_ADDRTYPE_IN_KRB5_ADDRESS) /* MIT */
        krb5_address **addrs;
 #elif defined(HAVE_KRB5_ADDRESSES) /* Heimdal */
diff --git a/source3/libads/kerberos.c b/source3/libads/kerberos.c
index b752fc2..56d7b06 100644
--- a/source3/libads/kerberos.c
+++ b/source3/libads/kerberos.c
@@ -56,47 +56,14 @@ kerb_prompter(krb5_context ctx, void *data,
        return 0;
 }
 
-static bool smb_krb5_err_io_nstatus(TALLOC_CTX *mem_ctx, 
-                                   DATA_BLOB *edata_blob, 
-                                   KRB5_EDATA_NTSTATUS *edata)
-{
-       bool ret = False;
-       prs_struct ps;
-
-       if (!mem_ctx || !edata_blob || !edata) 
-               return False;
-
-       if (!prs_init(&ps, edata_blob->length, mem_ctx, UNMARSHALL))
-               return False;
-
-       if (!prs_copy_data_in(&ps, (char *)edata_blob->data, 
edata_blob->length))
-               goto out;
-
-       prs_set_offset(&ps, 0);
-
-       if (!prs_ntstatus("ntstatus", &ps, 1, &edata->ntstatus))
-               goto out;
-
-       if (!prs_uint32("unknown1", &ps, 1, &edata->unknown1))
-               goto out;
-
-       if (!prs_uint32("unknown2", &ps, 1, &edata->unknown2)) /* only seen 
00000001 here */
-               goto out;
-
-       ret = True;
- out:
-       prs_mem_free(&ps);
-
-       return ret;
-}
-
  static bool smb_krb5_get_ntstatus_from_krb5_error(krb5_error *error,
                                                   NTSTATUS *nt_status)
 {
        DATA_BLOB edata;
        DATA_BLOB unwrapped_edata;
        TALLOC_CTX *mem_ctx;
-       KRB5_EDATA_NTSTATUS parsed_edata;
+       struct KRB5_EDATA_NTSTATUS parsed_edata;
+       enum ndr_err_code ndr_err;
 
 #ifdef HAVE_E_DATA_POINTER_IN_KRB5_ERROR
        edata = data_blob(error->e_data->data, error->e_data->length);
@@ -122,7 +89,10 @@ static bool smb_krb5_err_io_nstatus(TALLOC_CTX *mem_ctx,
 
        data_blob_free(&edata);
 
-       if (!smb_krb5_err_io_nstatus(mem_ctx, &unwrapped_edata, &parsed_edata)) 
{
+       ndr_err = ndr_pull_struct_blob_all(&unwrapped_edata, mem_ctx, NULL,
+                       &parsed_edata,
+                       (ndr_pull_flags_fn_t)ndr_pull_KRB5_EDATA_NTSTATUS);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                data_blob_free(&unwrapped_edata);
                TALLOC_FREE(mem_ctx);
                return False;


-- 
Samba Shared Repository

Reply via email to