diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/proto.h | 1 | ||||
-rwxr-xr-x | source3/include/rpc_spoolss.h | 12 | ||||
-rw-r--r-- | source3/include/smb.h | 1 | ||||
-rw-r--r-- | source3/rpc_parse/parse_spoolss.c | 40 | ||||
-rwxr-xr-x | source3/rpc_server/srv_spoolss.c | 11 | ||||
-rw-r--r-- | source3/rpc_server/srv_spoolss_nt.c | 5 |
6 files changed, 67 insertions, 3 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index 1d8bf77020..d96d2f77c0 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -2429,6 +2429,7 @@ BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth); BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth); BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth); +BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth); BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth); BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth); BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth); diff --git a/source3/include/rpc_spoolss.h b/source3/include/rpc_spoolss.h index aef9afd590..0777a602b1 100755 --- a/source3/include/rpc_spoolss.h +++ b/source3/include/rpc_spoolss.h @@ -1192,6 +1192,17 @@ typedef struct spool_r_enumforms SPOOL_R_ENUMFORMS; +typedef struct spool_printer_info_level_1 +{ + uint32 flags; + uint32 description_ptr; + uint32 name_ptr; + uint32 comment_ptr; + UNISTR2 description; + UNISTR2 name; + UNISTR2 comment; +} SPOOL_PRINTER_INFO_LEVEL_1; + typedef struct spool_printer_info_level_2 { uint32 servername_ptr; @@ -1234,6 +1245,7 @@ typedef struct spool_printer_info_level { uint32 level; uint32 info_ptr; + SPOOL_PRINTER_INFO_LEVEL_1 *info_1; SPOOL_PRINTER_INFO_LEVEL_2 *info_2; } SPOOL_PRINTER_INFO_LEVEL; diff --git a/source3/include/smb.h b/source3/include/smb.h index a179a7808e..6da6fc67e8 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -171,6 +171,7 @@ implemented */ #define ERRbaddirectory 267 /* Invalid directory name in a path. */ #define ERRunknownipc 2142 +#define ERROR_ACCESS_DENIED (5) #define ERROR_INVALID_PARAMETER (87) #define ERROR_INSUFFICIENT_BUFFER (122) #define ERROR_INVALID_NAME (123) diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c index 85d295eb3f..8ff26e090c 100644 --- a/source3/rpc_parse/parse_spoolss.c +++ b/source3/rpc_parse/parse_spoolss.c @@ -3046,6 +3046,36 @@ BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, } /******************************************************************* + Parse a SPOOL_PRINTER_INFO_LEVEL_1 structure. +********************************************************************/ +BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth) +{ + prs_debug(ps, depth, desc, "spool_io_printer_info_level_1"); + depth++; + + if(!prs_align(ps)) + return False; + + if(!prs_uint32("flags", ps, depth, &il->flags)) + return False; + if(!prs_uint32("description_ptr", ps, depth, &il->description_ptr)) + return False; + if(!prs_uint32("name_ptr", ps, depth, &il->name_ptr)) + return False; + if(!prs_uint32("comment_ptr", ps, depth, &il->comment_ptr)) + return False; + + if(!smb_io_unistr2("description", &il->description, il->description_ptr, ps, depth)) + return False; + if(!smb_io_unistr2("name", &il->name, il->name_ptr, ps, depth)) + return False; + if(!smb_io_unistr2("comment", &il->comment, il->comment_ptr, ps, depth)) + return False; + + return True; +} + +/******************************************************************* Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure. ********************************************************************/ BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth) @@ -3142,8 +3172,10 @@ BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_s /* if no struct inside just return */ if (il->info_ptr==0) { - if (UNMARSHALLING(ps)) + if (UNMARSHALLING(ps)) { + il->info_1=NULL; il->info_2=NULL; + } return True; } @@ -3158,6 +3190,12 @@ BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_s * level 2 is used by addprinter * and by setprinter when updating printer's info */ + case 1: + if (UNMARSHALLING(ps)) + il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_1)); + if (!spool_io_printer_info_level_1("", il->info_1, ps, depth)) + return False; + break; case 2: if (UNMARSHALLING(ps)) il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2)); diff --git a/source3/rpc_server/srv_spoolss.c b/source3/rpc_server/srv_spoolss.c index 1cf187d825..1649df8608 100755 --- a/source3/rpc_server/srv_spoolss.c +++ b/source3/rpc_server/srv_spoolss.c @@ -759,6 +759,17 @@ static BOOL api_spoolss_addprinterex(uint16 vuid, prs_struct *data, prs_struct * return False; } + if (q_u.info.info_ptr!=0) { + switch (q_u.info.level) { + case 1: + safe_free(q_u.info.info_1); + break; + case 2: + safe_free(q_u.info.info_2); + break; + } + } + return True; } diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c index 340d776493..de994a1b5d 100644 --- a/source3/rpc_server/srv_spoolss_nt.c +++ b/source3/rpc_server/srv_spoolss_nt.c @@ -2855,9 +2855,10 @@ uint32 _spoolss_setprinter(const POLICY_HND *handle, uint32 level, case 2: return update_printer(handle, level, info, devmode_ctr.devmode); break; + default: + return ERROR_INVALID_LEVEL; + break; } - - return NT_STATUS_INVALID_INFO_CLASS; } /**************************************************************************** |