Skip to content

Commit

Permalink
spoolss: make spoolss deal with ndr64 SetForm by using proper contain…
Browse files Browse the repository at this point in the history
…er object.

Guenther

Signed-off-by: Günther Deschner <[email protected]>
Reviewed-by: David Disseldorp <[email protected]>
  • Loading branch information
gd authored and ddiss committed Jan 17, 2013
1 parent 8304fe7 commit 3b94b64
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 21 deletions.
3 changes: 1 addition & 2 deletions librpc/idl/spoolss.idl
Original file line number Diff line number Diff line change
Expand Up @@ -2072,8 +2072,7 @@ cpp_quote("#define spoolss_security_descriptor security_descriptor")
WERROR spoolss_SetForm(
[in,ref] policy_handle *handle,
[in] [string,charset(UTF16)] uint16 form_name[],
[in] uint32 level,
[in,switch_is(level)] spoolss_AddFormInfo info
[in,ref] spoolss_AddFormInfoCtr *info_ctr
);

/******************/
Expand Down
11 changes: 10 additions & 1 deletion source3/rpc_server/spoolss/srv_spoolss_nt.c
Original file line number Diff line number Diff line change
Expand Up @@ -8799,7 +8799,7 @@ WERROR _spoolss_DeleteForm(struct pipes_struct *p,
WERROR _spoolss_SetForm(struct pipes_struct *p,
struct spoolss_SetForm *r)
{
struct spoolss_AddFormInfo1 *form = r->in.info.info1;
struct spoolss_AddFormInfo1 *form;
const char *form_name = r->in.form_name;
int snum = -1;
WERROR status = WERR_OK;
Expand All @@ -8826,6 +8826,15 @@ WERROR _spoolss_SetForm(struct pipes_struct *p,
return WERR_ACCESS_DENIED;
}

if (r->in.info_ctr->level != 1) {
return WERR_INVALID_LEVEL;
}

form = r->in.info_ctr->info.info1;
if (!form) {
return WERR_INVALID_PARAM;
}

tmp_ctx = talloc_new(p->mem_ctx);
if (!tmp_ctx) {
return WERR_NOMEM;
Expand Down
8 changes: 4 additions & 4 deletions source3/rpcclient/cmd_spoolss.c
Original file line number Diff line number Diff line change
Expand Up @@ -2203,7 +2203,7 @@ static WERROR cmd_spoolss_setform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
WERROR werror;
NTSTATUS status;
const char *printername;
union spoolss_AddFormInfo info;
struct spoolss_AddFormInfoCtr info_ctr;
struct spoolss_AddFormInfo1 info1;
struct dcerpc_binding_handle *b = cli->binding_handle;

Expand Down Expand Up @@ -2236,15 +2236,15 @@ static WERROR cmd_spoolss_setform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_c
info1.area.bottom = 3000;
info1.form_name = argv[2];

info.info1 = &info1;
info_ctr.info.info1 = &info1;
info_ctr.level = 1;

/* Set the form */

status = dcerpc_spoolss_SetForm(b, mem_ctx,
&handle,
argv[2],
1,
info,
&info_ctr,
&werror);
if (!NT_STATUS_IS_OK(status)) {
werror = ntstatus_to_werror(status);
Expand Down
22 changes: 11 additions & 11 deletions source4/ntptr/simple_ldb/ntptr_simple_ldb.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,16 +383,16 @@ static WERROR sptr_SetPrintServerForm(struct ntptr_GenericHandle *server, TALLOC
* }
*/

switch (r->in.level) {
switch (r->in.info_ctr->level) {
case 1:
if (!r->in.info.info1) {
if (!r->in.info_ctr->info.info1) {
return WERR_FOOBAR;
}

count = sptr_db_search(sptr_db, mem_ctx,
ldb_dn_new(mem_ctx, sptr_db, "CN=Forms,CN=PrintServer"),
&msgs, attrs, "(&(form-name=%s)(objectClass=form))",
r->in.info.info1->form_name);
r->in.info_ctr->info.info1->form_name);

if (count == 0) return WERR_FOOBAR;
if (count > 1) return WERR_FOOBAR;
Expand All @@ -409,17 +409,17 @@ static WERROR sptr_SetPrintServerForm(struct ntptr_GenericHandle *server, TALLOC
/* add core elements to the ldb_message for the user */
msg->dn = msgs[0]->dn;

SET_UINT(sptr_db, msg, "flags", r->in.info.info1->flags);
SET_UINT(sptr_db, msg, "flags", r->in.info_ctr->info.info1->flags);

SET_STRING(sptr_db, msg, "form-name", r->in.info.info1->form_name);
SET_STRING(sptr_db, msg, "form-name", r->in.info_ctr->info.info1->form_name);

SET_UINT(sptr_db, msg, "size-width", r->in.info.info1->size.width);
SET_UINT(sptr_db, msg, "size-height", r->in.info.info1->size.height);
SET_UINT(sptr_db, msg, "size-width", r->in.info_ctr->info.info1->size.width);
SET_UINT(sptr_db, msg, "size-height", r->in.info_ctr->info.info1->size.height);

SET_UINT(sptr_db, msg, "area-left", r->in.info.info1->area.left);
SET_UINT(sptr_db, msg, "area-top", r->in.info.info1->area.top);
SET_UINT(sptr_db, msg, "area-right", r->in.info.info1->area.right);
SET_UINT(sptr_db, msg, "area-bottom", r->in.info.info1->area.bottom);
SET_UINT(sptr_db, msg, "area-left", r->in.info_ctr->info.info1->area.left);
SET_UINT(sptr_db, msg, "area-top", r->in.info_ctr->info.info1->area.top);
SET_UINT(sptr_db, msg, "area-right", r->in.info_ctr->info.info1->area.right);
SET_UINT(sptr_db, msg, "area-bottom", r->in.info_ctr->info.info1->area.bottom);
break;
default:
return WERR_UNKNOWN_LEVEL;
Expand Down
9 changes: 6 additions & 3 deletions source4/torture/rpc/spoolss.c
Original file line number Diff line number Diff line change
Expand Up @@ -2713,14 +2713,17 @@ static bool test_SetForm(struct torture_context *tctx,
union spoolss_AddFormInfo *info)
{
struct spoolss_SetForm r;
struct spoolss_AddFormInfoCtr info_ctr;

info_ctr.level = level;
info_ctr.info = *info;

r.in.handle = handle;
r.in.form_name = form_name;
r.in.level = level;
r.in.info = *info;
r.in.info_ctr = &info_ctr;

torture_comment(tctx, "Testing SetForm(%s) level %d\n",
form_name, r.in.level);
form_name, level);

torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_SetForm_r(b, tctx, &r),
"SetForm failed");
Expand Down

0 comments on commit 3b94b64

Please sign in to comment.