r4105: Fix IDL for QueryValue() and add a torture test for it.
authorJelmer Vernooij <jelmer@samba.org>
Wed, 8 Dec 2004 22:02:49 +0000 (22:02 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:06:27 +0000 (13:06 -0500)
Thanks to Michael Allen for some hints on what was wrong with the previous IDL.

source/librpc/idl/winreg.idl
source/torture/rpc/winreg.c

index 03b48be02a749bb36620f6e933d5d16eaef45c26..a3e81f3a9444d857ec16df77ecb9ae106fcdf6f1 100644 (file)
        /* Function: 0x11 */
        WERROR winreg_QueryValue(
                [in,ref] policy_handle *handle,
-               [in] winreg_String valuename,
-               [in] uint32 *reserved,
+               [in] winreg_String value_name,
+               [in,out] uint32 *type,
                [in] uint32 *offered,
-               [in] uint32 *unknown1,
-               [in] uint32 *unknown2,
-               [out] uint32 *type, 
-               [out] uint8 *data,
-               [in,out] uint32 *offered2,
-               [in,out] uint32 *val_length
+               [in] uint32 unknown1,
+               [in] uint32 unknown2,
+               [out] EnumValueOut *value_out,
+               [in,out] uint32 *value_len1,
+               [in,out] uint32 *value_len2
        );
 
        /******************/
index 9cb41c032b5cbe87201d54da0f018320eca62184..ebadbc87e2171ea99595b42f691b9c31f04fe45c 100644 (file)
@@ -168,6 +168,8 @@ static BOOL test_OpenKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        }
 
        if (!W_ERROR_IS_OK(r.out.result)) {
+               printf("OpenKey failed - %s\n", win_errstr(r.out.result));
+
                return False;
        }
 
@@ -263,9 +265,6 @@ static BOOL test_EnumKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                        if (!test_OpenKey(
                                    p, mem_ctx, handle, r.out.out_name->name,
                                    &key_handle)) {
-                               printf("OpenKey(%s) failed - %s\n",
-                                      r.out.out_name->name, 
-                                      win_errstr(r.out.result));
                        } else {
                                test_key(p, mem_ctx, &key_handle, depth + 1);
                        }
@@ -290,6 +289,41 @@ static BOOL test_EnumKey(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        return True;
 }
 
+static BOOL test_QueryValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *handle, const char *valuename)
+{
+       struct winreg_QueryValue r;
+       NTSTATUS status;
+       struct EnumValueNameOut valname;
+       uint32 zero = 0;
+       uint32 offered = 0xfff;
+
+       valname.name = valuename;
+
+       printf("Testing QueryValue\n");
+
+       r.in.handle = handle;
+       r.in.value_name.name = valuename;
+       r.in.type = &zero;
+       r.in.unknown1 = 0;
+       r.in.unknown2 = 0;
+       r.in.offered = &offered;
+       r.in.value_len1 = &offered;
+       r.in.value_len2 = &zero;
+
+       status = dcerpc_winreg_QueryValue(p, mem_ctx, &r);
+       if(NT_STATUS_IS_ERR(status)) {
+               printf("QueryValue failed - %s\n", nt_errstr(status));
+               return False;
+       }
+
+       if (!W_ERROR_IS_OK(r.out.result)) {
+               printf("QueryValue failed - %s\n", win_errstr(r.out.result));
+               return False;
+       }
+
+       return True;
+}
+
 static BOOL test_EnumValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 
                           struct policy_handle *handle, int max_valnamelen, int max_valbufsize)
 {
@@ -298,6 +332,7 @@ static BOOL test_EnumValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        struct EnumValueIn buf_val;
        uint32 type;
        uint32 len1 = max_valbufsize, len2 = 0;
+       BOOL ret = True;
 
        printf("testing EnumValue\n");
 
@@ -324,6 +359,10 @@ static BOOL test_EnumValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                        return False;
                }
 
+               if (W_ERROR_IS_OK(r.out.result)) {
+                       ret &= test_QueryValue(p, mem_ctx, handle, r.out.name_out.name);
+               }
+
                r.in.enum_index++;
        } while (W_ERROR_IS_OK(r.out.result));
 
@@ -332,7 +371,7 @@ static BOOL test_EnumValue(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                return False;
        }
 
-       return True;
+       return ret;
 }
 
 static BOOL test_OpenHKLM(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,