2005
static bool test_EnumPrinterKey(struct torture_context *tctx,
2006
struct dcerpc_pipe *p,
2007
struct policy_handle *handle,
2008
const char *key_name,
2009
const char ***array)
2011
struct spoolss_EnumPrinterKey r;
2012
uint32_t needed = 0;
2013
union spoolss_KeyNames key_buffer;
2014
int32_t offered[] = { 0, 1, 2, 3, 4, 5, -1, -2, -3, -4, -5, 256, 512, 1024, 2048 };
2018
r.in.handle = handle;
2019
r.in.key_name = key_name;
2020
r.out.key_buffer = &key_buffer;
2021
r.out.needed = &needed;
2022
r.out._ndr_size = &_ndr_size;
2024
for (i=0; i < ARRAY_SIZE(offered); i++) {
2026
if (offered[i] < 0 && needed) {
2030
r.in.offered = needed + offered[i];
2032
r.in.offered = offered[i];
2035
ZERO_STRUCT(key_buffer);
2037
torture_comment(tctx, "Testing EnumPrinterKey(%s) with %d offered\n", r.in.key_name, r.in.offered);
2039
torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterKey(p, tctx, &r),
2040
"failed to call EnumPrinterKey");
2041
if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
2043
torture_assert(tctx, (_ndr_size == r.in.offered/2),
2044
talloc_asprintf(tctx, "EnumPrinterKey size mismatch, _ndr_size %d (expected %d)",
2045
_ndr_size, r.in.offered/2));
2047
r.in.offered = needed;
2048
torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterKey(p, tctx, &r),
2049
"failed to call EnumPrinterKey");
2052
if (offered[i] > 0) {
2053
torture_assert_werr_ok(tctx, r.out.result,
2054
"failed to call EnumPrinterKey");
2057
torture_assert(tctx, (_ndr_size == r.in.offered/2),
2058
talloc_asprintf(tctx, "EnumPrinterKey size mismatch, _ndr_size %d (expected %d)",
2059
_ndr_size, r.in.offered/2));
2061
torture_assert(tctx, (*r.out.needed <= r.in.offered),
2062
talloc_asprintf(tctx, "EnumPrinterKey size mismatch: needed %d is not <= offered %d", *r.out.needed, r.in.offered));
2064
torture_assert(tctx, (*r.out.needed <= _ndr_size * 2),
2065
talloc_asprintf(tctx, "EnumPrinterKey size mismatch: needed %d is not <= _ndr_size %d * 2", *r.out.needed, _ndr_size));
2067
if (key_buffer.string_array) {
2068
uint32_t calc_needed = 0;
2070
for (s=0; key_buffer.string_array[s]; s++) {
2071
calc_needed += strlen_m_term(key_buffer.string_array[s])*2;
2073
if (!key_buffer.string_array[0]) {
2078
torture_assert_int_equal(tctx, *r.out.needed, calc_needed,
2079
"EnumPrinterKey unexpected size");
2084
*array = key_buffer.string_array;
2090
bool test_printer_keys(struct torture_context *tctx,
2091
struct dcerpc_pipe *p,
2092
struct policy_handle *handle)
2094
const char **key_array = NULL;
2098
struct spoolss_EnumPrinterKey r;
2100
struct spoolss_StringArray2 key_buffer;
2102
r.in.handle = handle;
2105
r.out.key_buffer = &key_buffer;
2106
r.out.needed = &needed;
2108
torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterKey(p, tctx, &r),
2109
"failed to call EnumPrinterKey");
2110
if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
2111
r.in.offered = needed;
2112
torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterKey(p, tctx, &r),
2113
"failed to call EnumPrinterKey");
2115
torture_assert_werr_ok(tctx, r.out.result,
2116
"failed to call EnumPrinterKey");
2118
key_array = key_buffer.string;
2121
for (i=0; key_array[i]; i++) {
2122
struct spoolss_EnumPrinterDataEx r;
2124
struct spoolss_PrinterEnumValues *info;
2127
r.in.handle = handle;
2128
r.in.key_name = key_array[i];
2130
r.out.count = &count;
2132
r.out.needed = &needed;
2134
torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r),
2135
"failed to call EnumPrinterDataEx");
2136
if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
2137
r.in.offered = needed;
2138
torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_EnumPrinterDataEx(p, tctx, &r),
2139
"failed to call EnumPrinterDataEx");
2141
torture_assert_werr_ok(tctx, r.out.result,
2142
"failed to call EnumPrinterDataEx");
2003
2148
bool torture_rpc_spoolss(struct torture_context *torture)
2005
2150
NTSTATUS status;