1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-02 00:22:11 +03:00

Move to talloc control of SPOOL_XXX structs. Move to talloc control of

security descriptors and pointers. Syncup with 2.2 tree.
Jeremy.
This commit is contained in:
Jeremy Allison
-
parent 2d3429cfe2
commit 14d5997dc8
13 changed files with 451 additions and 707 deletions

View File

@ -369,6 +369,7 @@ void talloc_destroy_pool(TALLOC_CTX *t);
void talloc_destroy(TALLOC_CTX *t); void talloc_destroy(TALLOC_CTX *t);
size_t talloc_pool_size(TALLOC_CTX *t); size_t talloc_pool_size(TALLOC_CTX *t);
void *talloc_zero(TALLOC_CTX *t, size_t size); void *talloc_zero(TALLOC_CTX *t, size_t size);
void *talloc_memdup(TALLOC_CTX *t, void *p, size_t size);
/*The following definitions come from lib/time.c */ /*The following definitions come from lib/time.c */
@ -522,7 +523,7 @@ struct cli_connection* RpcHndList_get_connection(const POLICY_HND *hnd);
void se_map_generic(uint32 *access_mask, struct generic_mapping *mapping); void se_map_generic(uint32 *access_mask, struct generic_mapping *mapping);
BOOL se_access_check(SEC_DESC *sd, struct current_user *user, BOOL se_access_check(SEC_DESC *sd, struct current_user *user,
uint32 acc_desired, uint32 *acc_granted, uint32 *status); uint32 acc_desired, uint32 *acc_granted, uint32 *status);
SEC_DESC_BUF *se_create_child_secdesc(SEC_DESC *parent_ctr, SEC_DESC_BUF *se_create_child_secdesc(TALLOC_CTX *ctx, SEC_DESC *parent_ctr,
BOOL child_container); BOOL child_container);
/*The following definitions come from lib/util_sec.c */ /*The following definitions come from lib/util_sec.c */
@ -1993,7 +1994,7 @@ BOOL get_specific_param_by_index(NT_PRINTER_INFO_LEVEL printer, uint32 level, ui
BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level, BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
fstring value, uint8 **data, uint32 *type, uint32 *len); fstring value, uint8 **data, uint32 *type, uint32 *len);
uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr); uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr);
BOOL nt_printing_getsec(char *printername, SEC_DESC_BUF **secdesc_ctr); BOOL nt_printing_getsec(TALLOC_CTX *ctx, char *printername, SEC_DESC_BUF **secdesc_ctr);
void map_printer_permissions(SEC_DESC *sd); void map_printer_permissions(SEC_DESC *sd);
BOOL print_access_check(struct current_user *user, int snum, int access_type); BOOL print_access_check(struct current_user *user, int snum, int access_type);
BOOL print_time_access_check(int snum); BOOL print_time_access_check(int snum);
@ -2969,26 +2970,23 @@ void init_sec_access(SEC_ACCESS *t, uint32 mask);
BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth); BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth);
void init_sec_ace(SEC_ACE *t, DOM_SID *sid, uint8 type, SEC_ACCESS mask, uint8 flag); void init_sec_ace(SEC_ACE *t, DOM_SID *sid, uint8 type, SEC_ACCESS mask, uint8 flag);
BOOL sec_io_ace(char *desc, SEC_ACE *psa, prs_struct *ps, int depth); BOOL sec_io_ace(char *desc, SEC_ACE *psa, prs_struct *ps, int depth);
SEC_ACL *make_sec_acl(uint16 revision, int num_aces, SEC_ACE *ace_list); SEC_ACL *make_sec_acl(TALLOC_CTX *ctx, uint16 revision, int num_aces, SEC_ACE *ace_list);
SEC_ACL *dup_sec_acl( SEC_ACL *src); SEC_ACL *dup_sec_acl(TALLOC_CTX *ctx, SEC_ACL *src);
void free_sec_acl(SEC_ACL **ppsa);
BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth); BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth);
size_t sec_desc_size(SEC_DESC *psd); size_t sec_desc_size(SEC_DESC *psd);
BOOL sec_ace_equal(SEC_ACE *s1, SEC_ACE *s2); BOOL sec_ace_equal(SEC_ACE *s1, SEC_ACE *s2);
BOOL sec_acl_equal(SEC_ACL *s1, SEC_ACL *s2); BOOL sec_acl_equal(SEC_ACL *s1, SEC_ACL *s2);
BOOL sec_desc_equal(SEC_DESC *s1, SEC_DESC *s2); BOOL sec_desc_equal(SEC_DESC *s1, SEC_DESC *s2);
SEC_DESC_BUF *sec_desc_merge(SEC_DESC_BUF *new_sdb, SEC_DESC_BUF *old_sdb); SEC_DESC_BUF *sec_desc_merge(TALLOC_CTX *ctx, SEC_DESC_BUF *new_sdb, SEC_DESC_BUF *old_sdb);
SEC_DESC *make_sec_desc(uint16 revision, SEC_DESC *make_sec_desc(TALLOC_CTX *ctx, uint16 revision,
DOM_SID *owner_sid, DOM_SID *grp_sid, DOM_SID *owner_sid, DOM_SID *grp_sid,
SEC_ACL *sacl, SEC_ACL *dacl, size_t *sd_size); SEC_ACL *sacl, SEC_ACL *dacl, size_t *sd_size);
SEC_DESC *dup_sec_desc( SEC_DESC *src); SEC_DESC *dup_sec_desc( TALLOC_CTX *ctx, SEC_DESC *src);
void free_sec_desc(SEC_DESC **ppsd); SEC_DESC *make_standard_sec_desc(TALLOC_CTX *ctx, DOM_SID *owner_sid, DOM_SID *grp_sid,
SEC_DESC *make_standard_sec_desc(DOM_SID *owner_sid, DOM_SID *grp_sid,
SEC_ACL *dacl, size_t *sd_size); SEC_ACL *dacl, size_t *sd_size);
BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth); BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth);
SEC_DESC_BUF *make_sec_desc_buf(size_t len, SEC_DESC *sec_desc); SEC_DESC_BUF *make_sec_desc_buf(TALLOC_CTX *ctx, size_t len, SEC_DESC *sec_desc);
SEC_DESC_BUF *dup_sec_desc_buf(SEC_DESC_BUF *src); SEC_DESC_BUF *dup_sec_desc_buf(TALLOC_CTX *ctx, SEC_DESC_BUF *src);
void free_sec_desc_buf(SEC_DESC_BUF **ppsdb);
BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth); BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth);
/*The following definitions come from rpc_parse/parse_spoolss.c */ /*The following definitions come from rpc_parse/parse_spoolss.c */
@ -2996,21 +2994,18 @@ BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth
BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime); BOOL make_systemtime(SYSTEMTIME *systime, struct tm *unixtime);
BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data, BOOL smb_io_notify_info_data_strings(char *desc,SPOOL_NOTIFY_INFO_DATA *data,
prs_struct *ps, int depth); prs_struct *ps, int depth);
void free_spoolss_devmode(DEVICEMODE *devmode);
BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u,
const fstring printername, const fstring printername,
const fstring datatype, const fstring datatype,
uint32 access_required, uint32 access_required,
const fstring clientname, const fstring clientname,
const fstring user_name); const fstring user_name);
BOOL make_spoolss_q_addprinterex(SPOOL_Q_ADDPRINTEREX *q_u, const char *srv_name, BOOL make_spoolss_q_addprinterex(TALLOC_CTX *ctx, SPOOL_Q_ADDPRINTEREX *q_u, const char *srv_name,
const char* clientname, const char* user_name, const char* clientname, const char* user_name,
uint32 level, PRINTER_INFO_2 *info); uint32 level, PRINTER_INFO_2 *info);
void free_spoolss_q_addprinterex(SPOOL_Q_ADDPRINTEREX *q_u); BOOL make_spool_printer_info_2(TALLOC_CTX *ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
BOOL make_spool_printer_info_2(SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2,
PRINTER_INFO_2 *info); PRINTER_INFO_2 *info);
BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth); BOOL spoolss_io_q_open_printer_ex(char *desc, SPOOL_Q_OPEN_PRINTER_EX *q_u, prs_struct *ps, int depth);
void free_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u);
BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth); BOOL spoolss_io_r_open_printer_ex(char *desc, SPOOL_R_OPEN_PRINTER_EX *r_u, prs_struct *ps, int depth);
BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u, BOOL make_spoolss_q_getprinterdata(SPOOL_Q_GETPRINTERDATA *q_u,
const POLICY_HND *handle, const POLICY_HND *handle,
@ -3054,8 +3049,6 @@ BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int
BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth); BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth);
BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth); BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth);
void new_spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest); void new_spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest);
BOOL new_spoolss_allocate_buffer(NEW_BUFFER **buffer);
void new_spoolss_free_buffer(NEW_BUFFER *buffer);
uint32 new_get_buffer_size(NEW_BUFFER *buffer); uint32 new_get_buffer_size(NEW_BUFFER *buffer);
BOOL new_smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth); BOOL new_smb_io_driverdir_1(char *desc, NEW_BUFFER *buffer, DRIVER_DIRECTORY_1 *info, int depth);
BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth); BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth);
@ -3103,7 +3096,6 @@ BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps
BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level, BOOL make_spoolss_q_getprinter(SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level,
NEW_BUFFER *buffer, uint32 offered); NEW_BUFFER *buffer, uint32 offered);
BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth); BOOL spoolss_io_r_setprinter(char *desc, SPOOL_R_SETPRINTER *r_u, prs_struct *ps, int depth);
void free_spoolss_q_setprinter(SPOOL_Q_SETPRINTER *q_u);
BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth); BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps, int depth);
BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth); BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth);
BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth); BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth);
@ -3143,23 +3135,17 @@ BOOL spoolss_io_r_addprinterex(char *desc, SPOOL_R_ADDPRINTEREX *r_u,
prs_struct *ps, int depth); prs_struct *ps, int depth);
BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u, BOOL spool_io_printer_driver_info_level_3(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u,
prs_struct *ps, int depth); prs_struct *ps, int depth);
void free_spool_printer_driver_info_level_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **q_u);
BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u, BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u,
prs_struct *ps, int depth); prs_struct *ps, int depth);
void free_spool_printer_driver_info_level_6(SPOOL_PRINTER_DRIVER_INFO_LEVEL_6 **q_u);
BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth); BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth);
BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth); BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth);
void free_spool_printer_driver_info_level(SPOOL_PRINTER_DRIVER_INFO_LEVEL *il); BOOL make_spoolss_q_addprinterdriver(TALLOC_CTX *ctx, SPOOL_Q_ADDPRINTERDRIVER *q_u,
BOOL make_spoolss_q_addprinterdriver(SPOOL_Q_ADDPRINTERDRIVER *q_u,
const char* srv_name, uint32 level, const char* srv_name, uint32 level,
PRINTER_DRIVER_CTR *info); PRINTER_DRIVER_CTR *info);
BOOL make_spool_driver_info_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *spool_drv_info, BOOL make_spool_driver_info_3(TALLOC_CTX *ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *spool_drv_info,
DRIVER_INFO_3 *info3); DRIVER_INFO_3 *info3);
void free_spool_driver_info_3 (SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *info); BOOL make_spool_buffer5(TALLOC_CTX *ctx, BUFFER5 *buf5, uint32 len, uint16 *src);
BOOL make_spool_buffer5(BUFFER5 *buf5, uint32 len, uint16 *src);
void free_spool_buffer5(BUFFER5 *buf);
BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth); BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth);
void free_spoolss_q_addprinterdriver(SPOOL_Q_ADDPRINTERDRIVER *q_u);
BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth); BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth);
BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni, BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni,
NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc); NT_PRINTER_DRIVER_INFO_LEVEL_3 **asc);
@ -3184,7 +3170,6 @@ BOOL make_spoolss_q_enumprinterdata(SPOOL_Q_ENUMPRINTERDATA *q_u,
const POLICY_HND *hnd, const POLICY_HND *hnd,
uint32 idx, uint32 valuelen, uint32 datalen); uint32 idx, uint32 valuelen, uint32 datalen);
BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth); BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth);
void free_spoolss_q_setprinterdata(SPOOL_Q_SETPRINTERDATA *q_u);
BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth); BOOL spoolss_io_r_setprinterdata(char *desc, SPOOL_R_SETPRINTERDATA *r_u, prs_struct *ps, int depth);
BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value, BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
uint32 type, const uint8 *data, uint32 len); uint32 type, const uint8 *data, uint32 len);
@ -3200,10 +3185,6 @@ void free_devmode(DEVICEMODE *devmode);
void free_printer_info_1(PRINTER_INFO_1 *printer); void free_printer_info_1(PRINTER_INFO_1 *printer);
void free_printer_info_2(PRINTER_INFO_2 *printer); void free_printer_info_2(PRINTER_INFO_2 *printer);
void free_printer_info_3(PRINTER_INFO_3 *printer); void free_printer_info_3(PRINTER_INFO_3 *printer);
void free_spool_printer_info_1(SPOOL_PRINTER_INFO_LEVEL_1 *printer);
void free_spool_printer_info_2(SPOOL_PRINTER_INFO_LEVEL_2 *printer);
void free_spool_printer_info_3(SPOOL_PRINTER_INFO_LEVEL_3 *printer);
void free_spool_printer_info_level(SPOOL_PRINTER_INFO_LEVEL *pil);
void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries); void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries);
void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries); void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries);
void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries); void free_job1_array(uint32 num_entries, JOB_INFO_1 **entries);
@ -3436,7 +3417,7 @@ BOOL convert_devicemode(char *printername, const DEVICEMODE *devmode,
NT_DEVICEMODE **pp_nt_devmode); NT_DEVICEMODE **pp_nt_devmode);
uint32 _spoolss_closeprinter(POLICY_HND *handle); uint32 _spoolss_closeprinter(POLICY_HND *handle);
uint32 _spoolss_deleteprinter(POLICY_HND *handle); uint32 _spoolss_deleteprinter(POLICY_HND *handle);
uint32 _spoolss_getprinterdata(POLICY_HND *handle, UNISTR2 *valuename, uint32 _spoolss_getprinterdata(pipes_struct *p, POLICY_HND *handle, UNISTR2 *valuename,
uint32 in_size, uint32 in_size,
uint32 *type, uint32 *type,
uint32 *out_size, uint32 *out_size,
@ -3445,9 +3426,8 @@ uint32 _spoolss_getprinterdata(POLICY_HND *handle, UNISTR2 *valuename,
uint32 _spoolss_rffpcnex(POLICY_HND *handle, uint32 flags, uint32 options, uint32 _spoolss_rffpcnex(POLICY_HND *handle, uint32 flags, uint32 options,
const UNISTR2 *localmachine, uint32 printerlocal, const UNISTR2 *localmachine, uint32 printerlocal,
SPOOL_NOTIFY_OPTION *option); SPOOL_NOTIFY_OPTION *option);
uint32 _spoolss_rfnpcnex( POLICY_HND *handle, uint32 change, uint32 _spoolss_rfnpcnex( pipes_struct *p, POLICY_HND *handle, uint32 change,
SPOOL_NOTIFY_OPTION *option, TALLOC_CTX *mem_ctx, SPOOL_NOTIFY_OPTION *option, SPOOL_NOTIFY_INFO *info);
SPOOL_NOTIFY_INFO *info);
uint32 _spoolss_enumprinters( uint32 flags, const UNISTR2 *servername, uint32 level, uint32 _spoolss_enumprinters( uint32 flags, const UNISTR2 *servername, uint32 level,
NEW_BUFFER *buffer, uint32 offered, NEW_BUFFER *buffer, uint32 offered,
uint32 *needed, uint32 *returned); uint32 *needed, uint32 *returned);
@ -3503,7 +3483,7 @@ uint32 _spoolss_addprinterdriver(pipes_struct *p, const UNISTR2 *server_name,
uint32 _spoolss_getprinterdriverdirectory(UNISTR2 *name, UNISTR2 *uni_environment, uint32 level, uint32 _spoolss_getprinterdriverdirectory(UNISTR2 *name, UNISTR2 *uni_environment, uint32 level,
NEW_BUFFER *buffer, uint32 offered, NEW_BUFFER *buffer, uint32 offered,
uint32 *needed); uint32 *needed);
uint32 _spoolss_enumprinterdata(POLICY_HND *handle, uint32 idx, uint32 _spoolss_enumprinterdata(pipes_struct *p, POLICY_HND *handle, uint32 idx,
uint32 in_value_len, uint32 in_data_len, uint32 in_value_len, uint32 in_data_len,
uint32 *out_max_value_len, uint16 **out_value, uint32 *out_value_len, uint32 *out_max_value_len, uint16 **out_value, uint32 *out_value_len,
uint32 *out_type, uint32 *out_type,

View File

@ -105,6 +105,10 @@ typedef struct security_ace_info
#define ACL_REVISION 0x3 #define ACL_REVISION 0x3
#endif #endif
#ifndef NT4_ACL_REVISION
#define NT4_ACL_REVISION 0x2
#endif
#ifndef _SEC_ACL #ifndef _SEC_ACL
/* SEC_ACL */ /* SEC_ACL */
typedef struct security_acl_info typedef struct security_acl_info
@ -149,7 +153,7 @@ typedef struct security_descriptor_info
typedef struct sec_desc_buf_info typedef struct sec_desc_buf_info
{ {
uint32 max_len; uint32 max_len;
uint32 undoc; uint32 ptr;
uint32 len; uint32 len;
SEC_DESC *sec; SEC_DESC *sec;

View File

@ -139,3 +139,16 @@ void *talloc_zero(TALLOC_CTX *t, size_t size)
return p; return p;
} }
/* memdup with a talloc. */
void *talloc_memdup(TALLOC_CTX *t, void *p, size_t size)
{
void *newp = talloc(t,size);
if (!newp)
return 0;
memcpy(newp, p, size);
return newp;
}

View File

@ -305,7 +305,7 @@ BOOL se_access_check(SEC_DESC *sd, struct current_user *user,
the parent container. This child object can either be a container or the parent container. This child object can either be a container or
non-container object. */ non-container object. */
SEC_DESC_BUF *se_create_child_secdesc(SEC_DESC *parent_ctr, SEC_DESC_BUF *se_create_child_secdesc(TALLOC_CTX *ctx, SEC_DESC *parent_ctr,
BOOL child_container) BOOL child_container)
{ {
SEC_DESC_BUF *sdb; SEC_DESC_BUF *sdb;
@ -321,7 +321,7 @@ SEC_DESC_BUF *se_create_child_secdesc(SEC_DESC *parent_ctr,
acl = parent_ctr->dacl; acl = parent_ctr->dacl;
if (!(new_ace_list = malloc(sizeof(SEC_ACE) * acl->num_aces))) if (!(new_ace_list = talloc(ctx, sizeof(SEC_ACE) * acl->num_aces)))
return NULL; return NULL;
for (i = 0; acl && i < acl->num_aces; i++) { for (i = 0; acl && i < acl->num_aces; i++) {
@ -398,24 +398,19 @@ SEC_DESC_BUF *se_create_child_secdesc(SEC_DESC *parent_ctr,
/* Create child security descriptor to return */ /* Create child security descriptor to return */
new_dacl = make_sec_acl(ACL_REVISION, new_ace_list_ndx, new_ace_list); new_dacl = make_sec_acl(ctx, ACL_REVISION, new_ace_list_ndx, new_ace_list);
safe_free(new_ace_list);
/* Use the existing user and group sids. I don't think this is /* Use the existing user and group sids. I don't think this is
correct. Perhaps the user and group should be passed in as correct. Perhaps the user and group should be passed in as
parameters by the caller? */ parameters by the caller? */
sd = make_sec_desc(SEC_DESC_REVISION, sd = make_sec_desc(ctx, SEC_DESC_REVISION,
parent_ctr->owner_sid, parent_ctr->owner_sid,
parent_ctr->grp_sid, parent_ctr->grp_sid,
parent_ctr->sacl, parent_ctr->sacl,
new_dacl, &size); new_dacl, &size);
free_sec_acl(&new_dacl); sdb = make_sec_desc_buf(ctx, size, sd);
sdb = make_sec_desc_buf(size, sd);
free_sec_desc(&sd);
return sdb; return sdb;
} }

View File

@ -2022,7 +2022,6 @@ static void free_nt_printer_info_level_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr)
DEBUG(106,("free_nt_printer_info_level_2: deleting info\n")); DEBUG(106,("free_nt_printer_info_level_2: deleting info\n"));
free_nt_devicemode(&info->devmode); free_nt_devicemode(&info->devmode);
free_sec_desc_buf(&info->secdesc_buf);
for(param_ptr = info->specific; param_ptr; ) { for(param_ptr = info->specific; param_ptr; ) {
NT_PRINTER_PARAM *tofree = param_ptr; NT_PRINTER_PARAM *tofree = param_ptr;
@ -2192,7 +2191,10 @@ static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin
goto fail; goto fail;
#endif #endif
if (!nt_printing_getsec(sharename, &info.secdesc_buf)) /* This will get the current RPC talloc context, but we should be
passing this as a parameter... fixme... JRA ! */
if (!nt_printing_getsec(get_talloc_ctx(), sharename, &info.secdesc_buf))
goto fail; goto fail;
*info_ptr = (NT_PRINTER_INFO_LEVEL_2 *)memdup(&info, sizeof(info)); *info_ptr = (NT_PRINTER_INFO_LEVEL_2 *)memdup(&info, sizeof(info));
@ -2207,8 +2209,6 @@ static uint32 get_a_printer_2_default(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstrin
if (info.devmode) if (info.devmode)
free_nt_devicemode(&info.devmode); free_nt_devicemode(&info.devmode);
if (info.secdesc_buf)
free_sec_desc_buf(&info.secdesc_buf);
return 2; return 2;
} }
@ -2270,7 +2270,10 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen
len += unpack_devicemode(&info.devmode,dbuf.dptr+len, dbuf.dsize-len); len += unpack_devicemode(&info.devmode,dbuf.dptr+len, dbuf.dsize-len);
len += unpack_specifics(&info.specific,dbuf.dptr+len, dbuf.dsize-len); len += unpack_specifics(&info.specific,dbuf.dptr+len, dbuf.dsize-len);
nt_printing_getsec(sharename, &info.secdesc_buf); /* This will get the current RPC talloc context, but we should be
passing this as a parameter... fixme... JRA ! */
nt_printing_getsec(get_talloc_ctx(), sharename, &info.secdesc_buf);
safe_free(dbuf.dptr); safe_free(dbuf.dptr);
*info_ptr=memdup(&info, sizeof(info)); *info_ptr=memdup(&info, sizeof(info));
@ -2651,7 +2654,7 @@ BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
/* right now that's enough ! */ /* right now that's enough ! */
NT_PRINTER_PARAM *param; NT_PRINTER_PARAM *param;
DEBUG(105, ("get_specific_param\n")); DEBUG(10, ("get_specific_param\n"));
param=printer.info_2->specific; param=printer.info_2->specific;
@ -2668,9 +2671,9 @@ BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
param=param->next; param=param->next;
} }
DEBUG(106, ("found one param\n"));
if (param != NULL) if (param != NULL)
{ {
DEBUGADD(10, ("get_specific_param: found one param\n"));
/* exited because it exist */ /* exited because it exist */
*type=param->type; *type=param->type;
@ -2680,10 +2683,10 @@ BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
memcpy(*data, param->data, param->data_len); memcpy(*data, param->data, param->data_len);
*len=param->data_len; *len=param->data_len;
DEBUG(106, ("exit of get_specific_param:true\n")); DEBUGADD(10, ("get_specific_param: exit true\n"));
return (True); return (True);
} }
DEBUG(106, ("exit of get_specific_param:false\n")); DEBUGADD(10, ("get_specific_param: exit false\n"));
return (False); return (False);
} }
@ -2715,7 +2718,7 @@ uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr)
SEC_DESC *psd = NULL; SEC_DESC *psd = NULL;
size_t size; size_t size;
nt_printing_getsec(printername, &old_secdesc_ctr); nt_printing_getsec(mem_ctx, printername, &old_secdesc_ctr);
/* Pick out correct owner and group sids */ /* Pick out correct owner and group sids */
@ -2737,18 +2740,13 @@ uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr)
/* Make a deep copy of the security descriptor */ /* Make a deep copy of the security descriptor */
psd = make_sec_desc(secdesc_ctr->sec->revision, psd = make_sec_desc(mem_ctx, secdesc_ctr->sec->revision,
owner_sid, group_sid, owner_sid, group_sid,
sacl, sacl,
dacl, dacl,
&size); &size);
new_secdesc_ctr = make_sec_desc_buf(size, psd); new_secdesc_ctr = make_sec_desc_buf(mem_ctx, size, psd);
/* Free up memory */
free_sec_desc(&psd);
free_sec_desc_buf(&old_secdesc_ctr);
} }
if (!new_secdesc_ctr) { if (!new_secdesc_ctr) {
@ -2778,11 +2776,6 @@ uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr)
/* Free mallocated memory */ /* Free mallocated memory */
out: out:
free_sec_desc_buf(&old_secdesc_ctr);
if (new_secdesc_ctr != secdesc_ctr) {
free_sec_desc_buf(&new_secdesc_ctr);
}
prs_mem_free(&ps); prs_mem_free(&ps);
if (mem_ctx) if (mem_ctx)
@ -2794,7 +2787,7 @@ uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr)
Construct a default security descriptor buffer for a printer. Construct a default security descriptor buffer for a printer.
****************************************************************************/ ****************************************************************************/
static SEC_DESC_BUF *construct_default_printer_sdb(void) static SEC_DESC_BUF *construct_default_printer_sdb(TALLOC_CTX *ctx)
{ {
SEC_ACE ace[3]; SEC_ACE ace[3];
SEC_ACCESS sa; SEC_ACCESS sa;
@ -2844,13 +2837,10 @@ static SEC_DESC_BUF *construct_default_printer_sdb(void)
descriptors. NT4 complains about the property being edited by a descriptors. NT4 complains about the property being edited by a
NT5 machine. */ NT5 machine. */
#define NT4_ACL_REVISION 0x2 if ((psa = make_sec_acl(ctx, NT4_ACL_REVISION, 3, ace)) != NULL) {
psd = make_sec_desc(ctx, SEC_DESC_REVISION,
if ((psa = make_sec_acl(NT4_ACL_REVISION, 3, ace)) != NULL) {
psd = make_sec_desc(SEC_DESC_REVISION,
&owner_sid, NULL, &owner_sid, NULL,
NULL, psa, &sd_size); NULL, psa, &sd_size);
free_sec_acl(&psa);
} }
if (!psd) { if (!psd) {
@ -2858,12 +2848,11 @@ static SEC_DESC_BUF *construct_default_printer_sdb(void)
return NULL; return NULL;
} }
sdb = make_sec_desc_buf(sd_size, psd); sdb = make_sec_desc_buf(ctx, sd_size, psd);
DEBUG(4,("construct_default_printer_sdb: size = %u.\n", DEBUG(4,("construct_default_printer_sdb: size = %u.\n",
(unsigned int)sd_size)); (unsigned int)sd_size));
free_sec_desc(&psd);
return sdb; return sdb;
} }
@ -2871,17 +2860,12 @@ static SEC_DESC_BUF *construct_default_printer_sdb(void)
Get a security desc for a printer. Get a security desc for a printer.
****************************************************************************/ ****************************************************************************/
BOOL nt_printing_getsec(char *printername, SEC_DESC_BUF **secdesc_ctr) BOOL nt_printing_getsec(TALLOC_CTX *ctx, char *printername, SEC_DESC_BUF **secdesc_ctr)
{ {
prs_struct ps; prs_struct ps;
TALLOC_CTX *mem_ctx = NULL;
fstring key; fstring key;
char *temp; char *temp;
mem_ctx = talloc_init();
if (mem_ctx == NULL)
return False;
if ((temp = strchr(printername + 2, '\\'))) { if ((temp = strchr(printername + 2, '\\'))) {
printername = temp + 1; printername = temp + 1;
} }
@ -2890,17 +2874,15 @@ BOOL nt_printing_getsec(char *printername, SEC_DESC_BUF **secdesc_ctr)
slprintf(key, sizeof(key), "SECDESC/%s", printername); slprintf(key, sizeof(key), "SECDESC/%s", printername);
if (tdb_prs_fetch(tdb, key, &ps, mem_ctx)!=0 || if (tdb_prs_fetch(tdb, key, &ps, ctx)!=0 ||
!sec_io_desc_buf("nt_printing_getsec", secdesc_ctr, &ps, 1)) { !sec_io_desc_buf("nt_printing_getsec", secdesc_ctr, &ps, 1)) {
DEBUG(4,("using default secdesc for %s\n", printername)); DEBUG(4,("using default secdesc for %s\n", printername));
if (!(*secdesc_ctr = construct_default_printer_sdb())) { if (!(*secdesc_ctr = construct_default_printer_sdb(ctx))) {
talloc_destroy(mem_ctx);
return False; return False;
} }
talloc_destroy(mem_ctx);
return True; return True;
} }
@ -2924,20 +2906,17 @@ BOOL nt_printing_getsec(char *printername, SEC_DESC_BUF **secdesc_ctr)
sid_append_rid(&owner_sid, DOMAIN_USER_RID_ADMIN); sid_append_rid(&owner_sid, DOMAIN_USER_RID_ADMIN);
psd = make_sec_desc((*secdesc_ctr)->sec->revision, psd = make_sec_desc(ctx, (*secdesc_ctr)->sec->revision,
&owner_sid, &owner_sid,
(*secdesc_ctr)->sec->grp_sid, (*secdesc_ctr)->sec->grp_sid,
(*secdesc_ctr)->sec->sacl, (*secdesc_ctr)->sec->sacl,
(*secdesc_ctr)->sec->dacl, (*secdesc_ctr)->sec->dacl,
&size); &size);
new_secdesc_ctr = make_sec_desc_buf(size, psd); new_secdesc_ctr = make_sec_desc_buf(ctx, size, psd);
free_sec_desc(&psd);
/* Swap with other one */ /* Swap with other one */
free_sec_desc_buf(secdesc_ctr);
*secdesc_ctr = new_secdesc_ctr; *secdesc_ctr = new_secdesc_ctr;
/* Set it */ /* Set it */
@ -2965,7 +2944,6 @@ BOOL nt_printing_getsec(char *printername, SEC_DESC_BUF **secdesc_ctr)
} }
prs_mem_free(&ps); prs_mem_free(&ps);
talloc_destroy(mem_ctx);
return True; return True;
} }
@ -3043,6 +3021,7 @@ BOOL print_access_check(struct current_user *user, int snum, int access_type)
uint32 access_granted, status; uint32 access_granted, status;
BOOL result; BOOL result;
char *pname; char *pname;
TALLOC_CTX *mem_ctx = NULL;
extern struct current_user current_user; extern struct current_user current_user;
/* If user is NULL then use the current_user structure */ /* If user is NULL then use the current_user structure */
@ -3067,7 +3046,12 @@ BOOL print_access_check(struct current_user *user, int snum, int access_type)
/* Get printer security descriptor */ /* Get printer security descriptor */
nt_printing_getsec(pname, &secdesc); if(!(mem_ctx = talloc_init())) {
errno = ENOMEM;
return False;
}
nt_printing_getsec(mem_ctx, pname, &secdesc);
if (access_type == JOB_ACCESS_ADMINISTER) { if (access_type == JOB_ACCESS_ADMINISTER) {
SEC_DESC_BUF *parent_secdesc = secdesc; SEC_DESC_BUF *parent_secdesc = secdesc;
@ -3076,9 +3060,7 @@ BOOL print_access_check(struct current_user *user, int snum, int access_type)
against. This is because print jobs are child objects against. This is because print jobs are child objects
objects of a printer. */ objects of a printer. */
secdesc = se_create_child_secdesc(parent_secdesc->sec, False); secdesc = se_create_child_secdesc(mem_ctx, parent_secdesc->sec, False);
free_sec_desc_buf(&parent_secdesc);
/* Now this is the bit that really confuses me. The access /* Now this is the bit that really confuses me. The access
type needs to be changed from JOB_ACCESS_ADMINISTER to type needs to be changed from JOB_ACCESS_ADMINISTER to
@ -3097,11 +3079,9 @@ BOOL print_access_check(struct current_user *user, int snum, int access_type)
&access_granted, &status); &access_granted, &status);
DEBUG(4, ("access check was %s\n", result ? "SUCCESS" : "FAILURE")); DEBUG(4, ("access check was %s\n", result ? "SUCCESS" : "FAILURE"));
talloc_destroy(mem_ctx);
/* Free mallocated memory */
free_sec_desc_buf(&secdesc);
if (!result) if (!result)
errno = EACCES; errno = EACCES;
@ -3215,5 +3195,4 @@ uint32 printer_write_default_dev(int snum, const PRINTER_DEFAULT *printer_defaul
free_a_printer(&printer, 2); free_a_printer(&printer, 2);
return result; return result;
} }
#undef OLD_NTDOMAIN #undef OLD_NTDOMAIN

View File

@ -708,19 +708,17 @@ BOOL do_reg_create_key(struct cli_state *cli, POLICY_HND *hnd,
DEBUG(4,("REG Create Key: %s %s 0x%08x\n", key_name, key_class, DEBUG(4,("REG Create Key: %s %s 0x%08x\n", key_name, key_class,
sam_access != NULL ? sam_access->mask : 0)); sam_access != NULL ? sam_access->mask : 0));
if((sec = make_sec_desc( 1, NULL, NULL, NULL, NULL, &sec_len)) == NULL) { if((sec = make_sec_desc( cli->mem_ctx, 1, NULL, NULL, NULL, NULL, &sec_len)) == NULL) {
DEBUG(0,("make_sec_desc : malloc fail.\n")); DEBUG(0,("make_sec_desc : malloc fail.\n"));
return False; return False;
} }
DEBUG(10,("make_sec_desc: len = %d\n", (int)sec_len)); DEBUG(10,("make_sec_desc: len = %d\n", (int)sec_len));
if((sec_buf = make_sec_desc_buf( (int)sec_len, sec)) == NULL) { if((sec_buf = make_sec_desc_buf( cli->mem_ctx, (int)sec_len, sec)) == NULL) {
DEBUG(0,("make_sec_desc : malloc fail (1)\n")); DEBUG(0,("make_sec_desc : malloc fail (1)\n"));
free_sec_desc(&sec);
return False; return False;
} }
free_sec_desc(&sec);
prs_init(&buf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL); prs_init(&buf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL); prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
@ -729,7 +727,6 @@ BOOL do_reg_create_key(struct cli_state *cli, POLICY_HND *hnd,
/* turn parameters into data stream */ /* turn parameters into data stream */
if(!reg_io_q_create_key("", &q_o, &buf, 0)) { if(!reg_io_q_create_key("", &q_o, &buf, 0)) {
free_sec_desc_buf(&sec_buf);
prs_mem_free(&buf); prs_mem_free(&buf);
prs_mem_free(&rbuf); prs_mem_free(&rbuf);
return False; return False;
@ -737,13 +734,11 @@ BOOL do_reg_create_key(struct cli_state *cli, POLICY_HND *hnd,
/* send the data on \PIPE\ */ /* send the data on \PIPE\ */
if (rpc_api_pipe_req(cli, REG_CREATE_KEY, &buf, &rbuf)) { if (rpc_api_pipe_req(cli, REG_CREATE_KEY, &buf, &rbuf)) {
free_sec_desc_buf(&sec_buf);
prs_mem_free(&buf); prs_mem_free(&buf);
prs_mem_free(&rbuf); prs_mem_free(&rbuf);
return False; return False;
} }
free_sec_desc_buf(&sec_buf);
prs_mem_free(&buf); prs_mem_free(&buf);
ZERO_STRUCT(r_o); ZERO_STRUCT(r_o);

View File

@ -584,7 +584,6 @@ BOOL spoolss_addprinterex(POLICY_HND *hnd, const char* srv_name, PRINTER_INFO_2
prs_mem_free(&rbuf); prs_mem_free(&rbuf);
prs_mem_free(&buf ); prs_mem_free(&buf );
free_spoolss_q_addprinterex(&q_o);
if (mem_ctx) if (mem_ctx)
talloc_destroy(mem_ctx); talloc_destroy(mem_ctx);
@ -813,7 +812,6 @@ uint32 spoolss_addprinterdriver(const char *srv_name, uint32 level, PRINTER_DRIV
prs_mem_free(&rbuf); prs_mem_free(&rbuf);
prs_mem_free(&buf ); prs_mem_free(&buf );
free_spool_driver_info_3(q_o.info.info_3);
if (mem_ctx) if (mem_ctx)
talloc_destroy(mem_ctx); talloc_destroy(mem_ctx);

View File

@ -123,22 +123,19 @@ BOOL sec_io_ace(char *desc, SEC_ACE *psa, prs_struct *ps, int depth)
Create a SEC_ACL structure. Create a SEC_ACL structure.
********************************************************************/ ********************************************************************/
SEC_ACL *make_sec_acl(uint16 revision, int num_aces, SEC_ACE *ace_list) SEC_ACL *make_sec_acl(TALLOC_CTX *ctx, uint16 revision, int num_aces, SEC_ACE *ace_list)
{ {
SEC_ACL *dst; SEC_ACL *dst;
int i; int i;
if((dst = (SEC_ACL *)malloc(sizeof(SEC_ACL))) == NULL) if((dst = (SEC_ACL *)talloc_zero(ctx,sizeof(SEC_ACL))) == NULL)
return NULL; return NULL;
ZERO_STRUCTP(dst);
dst->revision = revision; dst->revision = revision;
dst->num_aces = num_aces; dst->num_aces = num_aces;
dst->size = 8; dst->size = 8;
if((dst->ace = (SEC_ACE *)malloc( sizeof(SEC_ACE) * num_aces )) == NULL) { if((dst->ace = (SEC_ACE *)talloc(ctx, sizeof(SEC_ACE) * num_aces )) == NULL) {
free_sec_acl(&dst);
return NULL; return NULL;
} }
@ -154,31 +151,12 @@ SEC_ACL *make_sec_acl(uint16 revision, int num_aces, SEC_ACE *ace_list)
Duplicate a SEC_ACL structure. Duplicate a SEC_ACL structure.
********************************************************************/ ********************************************************************/
SEC_ACL *dup_sec_acl( SEC_ACL *src) SEC_ACL *dup_sec_acl(TALLOC_CTX *ctx, SEC_ACL *src)
{ {
if(src == NULL) if(src == NULL)
return NULL; return NULL;
return make_sec_acl( src->revision, src->num_aces, src->ace); return make_sec_acl(ctx, src->revision, src->num_aces, src->ace);
}
/*******************************************************************
Delete a SEC_ACL structure.
********************************************************************/
void free_sec_acl(SEC_ACL **ppsa)
{
SEC_ACL *psa;
if(ppsa == NULL || *ppsa == NULL)
return;
psa = *ppsa;
if (psa->ace != NULL)
free(psa->ace);
free(psa);
*ppsa = NULL;
} }
/******************************************************************* /*******************************************************************
@ -204,7 +182,7 @@ BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth)
/* /*
* This is a read and we must allocate the stuct to read into. * This is a read and we must allocate the stuct to read into.
*/ */
if((psa = (SEC_ACL *)malloc(sizeof(SEC_ACL))) == NULL) if((psa = (SEC_ACL *)prs_alloc_mem(ps, sizeof(SEC_ACL))) == NULL)
return False; return False;
*ppsa = psa; *ppsa = psa;
} }
@ -228,7 +206,7 @@ BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth)
if (UNMARSHALLING(ps) && psa->num_aces != 0) { if (UNMARSHALLING(ps) && psa->num_aces != 0) {
/* reading */ /* reading */
if((psa->ace = malloc(sizeof(psa->ace[0]) * psa->num_aces)) == NULL) if((psa->ace = (SEC_ACE *)prs_alloc_mem(ps,sizeof(psa->ace[0]) * psa->num_aces)) == NULL)
return False; return False;
} }
@ -423,7 +401,7 @@ BOOL sec_desc_equal(SEC_DESC *s1, SEC_DESC *s2)
security descriptor new_sec. security descriptor new_sec.
********************************************************************/ ********************************************************************/
SEC_DESC_BUF *sec_desc_merge(SEC_DESC_BUF *new_sdb, SEC_DESC_BUF *old_sdb) SEC_DESC_BUF *sec_desc_merge(TALLOC_CTX *ctx, SEC_DESC_BUF *new_sdb, SEC_DESC_BUF *old_sdb)
{ {
DOM_SID *owner_sid, *group_sid; DOM_SID *owner_sid, *group_sid;
SEC_DESC_BUF *return_sdb; SEC_DESC_BUF *return_sdb;
@ -460,21 +438,37 @@ SEC_DESC_BUF *sec_desc_merge(SEC_DESC_BUF *new_sdb, SEC_DESC_BUF *old_sdb)
/* Create new security descriptor from bits */ /* Create new security descriptor from bits */
psd = make_sec_desc(new_sdb->sec->revision, psd = make_sec_desc(ctx, new_sdb->sec->revision,
owner_sid, group_sid, sacl, dacl, &secdesc_size); owner_sid, group_sid, sacl, dacl, &secdesc_size);
return_sdb = make_sec_desc_buf(secdesc_size, psd); return_sdb = make_sec_desc_buf(ctx, secdesc_size, psd);
free_sec_desc(&psd);
return(return_sdb); return(return_sdb);
} }
/*******************************************************************
Tallocs a duplicate SID.
********************************************************************/
static DOM_SID *sid_dup_talloc(TALLOC_CTX *ctx, DOM_SID *src)
{
DOM_SID *dst;
if(!src)
return NULL;
if((dst = talloc_zero(ctx, sizeof(DOM_SID))) != NULL) {
sid_copy( dst, src);
}
return dst;
}
/******************************************************************* /*******************************************************************
Creates a SEC_DESC structure Creates a SEC_DESC structure
********************************************************************/ ********************************************************************/
SEC_DESC *make_sec_desc(uint16 revision, SEC_DESC *make_sec_desc(TALLOC_CTX *ctx, uint16 revision,
DOM_SID *owner_sid, DOM_SID *grp_sid, DOM_SID *owner_sid, DOM_SID *grp_sid,
SEC_ACL *sacl, SEC_ACL *dacl, size_t *sd_size) SEC_ACL *sacl, SEC_ACL *dacl, size_t *sd_size)
{ {
@ -483,11 +477,9 @@ SEC_DESC *make_sec_desc(uint16 revision,
*sd_size = 0; *sd_size = 0;
if(( dst = (SEC_DESC *)malloc(sizeof(SEC_DESC))) == NULL) if(( dst = (SEC_DESC *)talloc_zero(ctx, sizeof(SEC_DESC))) == NULL)
return NULL; return NULL;
ZERO_STRUCTP(dst);
dst->revision = revision; dst->revision = revision;
dst->type = SEC_DESC_SELF_RELATIVE; dst->type = SEC_DESC_SELF_RELATIVE;
@ -499,16 +491,16 @@ SEC_DESC *make_sec_desc(uint16 revision,
dst->off_sacl = 0; dst->off_sacl = 0;
dst->off_dacl = 0; dst->off_dacl = 0;
if(owner_sid && ((dst->owner_sid = sid_dup(owner_sid)) == NULL)) if(owner_sid && ((dst->owner_sid = sid_dup_talloc(ctx,owner_sid)) == NULL))
goto error_exit; goto error_exit;
if(grp_sid && ((dst->grp_sid = sid_dup(grp_sid)) == NULL)) if(grp_sid && ((dst->grp_sid = sid_dup_talloc(ctx,grp_sid)) == NULL))
goto error_exit; goto error_exit;
if(sacl && ((dst->sacl = dup_sec_acl(sacl)) == NULL)) if(sacl && ((dst->sacl = dup_sec_acl(ctx, sacl)) == NULL))
goto error_exit; goto error_exit;
if(dacl && ((dst->dacl = dup_sec_acl(dacl)) == NULL)) if(dacl && ((dst->dacl = dup_sec_acl(ctx, dacl)) == NULL))
goto error_exit; goto error_exit;
offset = 0; offset = 0;
@ -559,7 +551,6 @@ SEC_DESC *make_sec_desc(uint16 revision,
error_exit: error_exit:
*sd_size = 0; *sd_size = 0;
free_sec_desc(&dst);
return NULL; return NULL;
} }
@ -567,47 +558,26 @@ error_exit:
Duplicate a SEC_DESC structure. Duplicate a SEC_DESC structure.
********************************************************************/ ********************************************************************/
SEC_DESC *dup_sec_desc( SEC_DESC *src) SEC_DESC *dup_sec_desc( TALLOC_CTX *ctx, SEC_DESC *src)
{ {
size_t dummy; size_t dummy;
if(src == NULL) if(src == NULL)
return NULL; return NULL;
return make_sec_desc( src->revision, return make_sec_desc( ctx, src->revision,
src->owner_sid, src->grp_sid, src->sacl, src->owner_sid, src->grp_sid, src->sacl,
src->dacl, &dummy); src->dacl, &dummy);
} }
/*******************************************************************
Deletes a SEC_DESC structure
********************************************************************/
void free_sec_desc(SEC_DESC **ppsd)
{
SEC_DESC *psd;
if(ppsd == NULL || *ppsd == NULL)
return;
psd = *ppsd;
free_sec_acl(&psd->dacl);
free_sec_acl(&psd->sacl);
free(psd->owner_sid);
free(psd->grp_sid);
free(psd);
*ppsd = NULL;
}
/******************************************************************* /*******************************************************************
Creates a SEC_DESC structure with typical defaults. Creates a SEC_DESC structure with typical defaults.
********************************************************************/ ********************************************************************/
SEC_DESC *make_standard_sec_desc(DOM_SID *owner_sid, DOM_SID *grp_sid, SEC_DESC *make_standard_sec_desc(TALLOC_CTX *ctx, DOM_SID *owner_sid, DOM_SID *grp_sid,
SEC_ACL *dacl, size_t *sd_size) SEC_ACL *dacl, size_t *sd_size)
{ {
return make_sec_desc(SEC_DESC_REVISION, return make_sec_desc(ctx, SEC_DESC_REVISION,
owner_sid, grp_sid, NULL, dacl, sd_size); owner_sid, grp_sid, NULL, dacl, sd_size);
} }
@ -629,7 +599,7 @@ BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth)
if (psd == NULL) { if (psd == NULL) {
if(UNMARSHALLING(ps)) { if(UNMARSHALLING(ps)) {
if((psd = (SEC_DESC *)malloc(sizeof(SEC_DESC))) == NULL) if((psd = (SEC_DESC *)prs_alloc_mem(ps,sizeof(SEC_DESC))) == NULL)
return False; return False;
*ppsd = psd; *ppsd = psd;
} else { } else {
@ -673,7 +643,7 @@ BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth)
if(!prs_set_offset(ps, old_offset + psd->off_owner_sid)) if(!prs_set_offset(ps, old_offset + psd->off_owner_sid))
return False; return False;
/* reading */ /* reading */
if((psd->owner_sid = malloc(sizeof(*psd->owner_sid))) == NULL) if((psd->owner_sid = (DOM_SID *)prs_alloc_mem(ps,sizeof(*psd->owner_sid))) == NULL)
return False; return False;
} }
@ -691,7 +661,7 @@ BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth)
/* reading */ /* reading */
if(!prs_set_offset(ps, old_offset + psd->off_grp_sid)) if(!prs_set_offset(ps, old_offset + psd->off_grp_sid))
return False; return False;
if((psd->grp_sid = malloc(sizeof(*psd->grp_sid))) == NULL) if((psd->grp_sid = (DOM_SID *)prs_alloc_mem(ps,sizeof(*psd->grp_sid))) == NULL)
return False; return False;
} }
@ -734,24 +704,23 @@ BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth)
Creates a SEC_DESC_BUF structure. Creates a SEC_DESC_BUF structure.
********************************************************************/ ********************************************************************/
SEC_DESC_BUF *make_sec_desc_buf(size_t len, SEC_DESC *sec_desc) SEC_DESC_BUF *make_sec_desc_buf(TALLOC_CTX *ctx, size_t len, SEC_DESC *sec_desc)
{ {
SEC_DESC_BUF *dst; SEC_DESC_BUF *dst;
if((dst = (SEC_DESC_BUF *)malloc(sizeof(SEC_DESC_BUF))) == NULL) if((dst = (SEC_DESC_BUF *)talloc_zero(ctx, sizeof(SEC_DESC_BUF))) == NULL)
return NULL; return NULL;
ZERO_STRUCTP(dst);
/* max buffer size (allocated size) */ /* max buffer size (allocated size) */
dst->max_len = (uint32)len; dst->max_len = (uint32)len;
dst->len = (uint32)len; dst->len = (uint32)len;
if(sec_desc && ((dst->sec = dup_sec_desc(sec_desc)) == NULL)) { if(sec_desc && ((dst->sec = dup_sec_desc(ctx, sec_desc)) == NULL)) {
free_sec_desc_buf(&dst);
return NULL; return NULL;
} }
dst->ptr = 0x1;
return dst; return dst;
} }
@ -759,32 +728,14 @@ SEC_DESC_BUF *make_sec_desc_buf(size_t len, SEC_DESC *sec_desc)
Duplicates a SEC_DESC_BUF structure. Duplicates a SEC_DESC_BUF structure.
********************************************************************/ ********************************************************************/
SEC_DESC_BUF *dup_sec_desc_buf(SEC_DESC_BUF *src) SEC_DESC_BUF *dup_sec_desc_buf(TALLOC_CTX *ctx, SEC_DESC_BUF *src)
{ {
if(src == NULL) if(src == NULL)
return NULL; return NULL;
return make_sec_desc_buf( src->len, src->sec); return make_sec_desc_buf( ctx, src->len, src->sec);
} }
/*******************************************************************
Deletes a SEC_DESC_BUF structure.
********************************************************************/
void free_sec_desc_buf(SEC_DESC_BUF **ppsdb)
{
SEC_DESC_BUF *psdb;
if(ppsdb == NULL || *ppsdb == NULL)
return;
psdb = *ppsdb;
free_sec_desc(&psdb->sec);
free(psdb);
*ppsdb = NULL;
}
/******************************************************************* /*******************************************************************
Reads or writes a SEC_DESC_BUF structure. Reads or writes a SEC_DESC_BUF structure.
********************************************************************/ ********************************************************************/
@ -803,7 +754,7 @@ BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth
psdb = *ppsdb; psdb = *ppsdb;
if (UNMARSHALLING(ps) && psdb == NULL) { if (UNMARSHALLING(ps) && psdb == NULL) {
if((psdb = (SEC_DESC_BUF *)malloc(sizeof(SEC_DESC_BUF))) == NULL) if((psdb = (SEC_DESC_BUF *)prs_alloc_mem(ps,sizeof(SEC_DESC_BUF))) == NULL)
return False; return False;
*ppsdb = psdb; *ppsdb = psdb;
} }
@ -817,7 +768,7 @@ BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth
if(!prs_uint32_pre("max_len", ps, depth, &psdb->max_len, &off_max_len)) if(!prs_uint32_pre("max_len", ps, depth, &psdb->max_len, &off_max_len))
return False; return False;
if(!prs_uint32 ("undoc ", ps, depth, &psdb->undoc)) if(!prs_uint32 ("ptr ", ps, depth, &psdb->ptr))
return False; return False;
if(!prs_uint32_pre("len ", ps, depth, &psdb->len, &off_len)) if(!prs_uint32_pre("len ", ps, depth, &psdb->len, &off_len))

File diff suppressed because it is too large Load Diff

View File

@ -53,9 +53,6 @@ static BOOL api_spoolss_open_printer_ex(pipes_struct *p)
q_u.user_switch, q_u.user_ctr, q_u.user_switch, q_u.user_ctr,
&r_u.handle); &r_u.handle);
/* we _really_ need to switch to talloc() */
free_spoolss_q_open_printer_ex(&q_u);
if (!spoolss_io_r_open_printer_ex("",&r_u,rdata,0)){ if (!spoolss_io_r_open_printer_ex("",&r_u,rdata,0)){
DEBUG(0,("spoolss_io_r_open_printer_ex: unable to marshall SPOOL_R_OPEN_PRINTER_EX.\n")); DEBUG(0,("spoolss_io_r_open_printer_ex: unable to marshall SPOOL_R_OPEN_PRINTER_EX.\n"));
return False; return False;
@ -85,7 +82,7 @@ static BOOL api_spoolss_getprinterdata(pipes_struct *p)
return False; return False;
} }
r_u.status = _spoolss_getprinterdata( &q_u.handle, &q_u.valuename, r_u.status = _spoolss_getprinterdata( p, &q_u.handle, &q_u.valuename,
q_u.size, &r_u.type, &r_u.size, q_u.size, &r_u.type, &r_u.size,
&r_u.data, &r_u.needed); &r_u.data, &r_u.needed);
@ -94,8 +91,6 @@ static BOOL api_spoolss_getprinterdata(pipes_struct *p)
return False; return False;
} }
safe_free(r_u.data);
return True; return True;
} }
@ -277,9 +272,7 @@ static BOOL api_spoolss_rfnpcnex(pipes_struct *p)
} }
r_u.status = _spoolss_rfnpcnex(&q_u.handle, q_u.change, r_u.status = _spoolss_rfnpcnex(&q_u.handle, q_u.change,
q_u.option, data->mem_ctx, &r_u.info); q_u.option, p->mem_ctx, &r_u.info);
safe_free(q_u.option);
/* we always have a NOTIFY_INFO struct */ /* we always have a NOTIFY_INFO struct */
r_u.info_ptr=0x1; r_u.info_ptr=0x1;
@ -289,8 +282,6 @@ static BOOL api_spoolss_rfnpcnex(pipes_struct *p)
return False; return False;
} }
safe_free(r_u.info.data);
return True; return True;
} }
@ -310,9 +301,6 @@ static BOOL api_spoolss_enumprinters(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if (!spoolss_io_q_enumprinters("", &q_u, data, 0)) { if (!spoolss_io_q_enumprinters("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_enumprinters: unable to unmarshall SPOOL_Q_ENUMPRINTERS.\n")); DEBUG(0,("spoolss_io_q_enumprinters: unable to unmarshall SPOOL_Q_ENUMPRINTERS.\n"));
return False; return False;
@ -327,12 +315,9 @@ static BOOL api_spoolss_enumprinters(pipes_struct *p)
if (!new_spoolss_io_r_enumprinters("", &r_u, rdata, 0)) { if (!new_spoolss_io_r_enumprinters("", &r_u, rdata, 0)) {
DEBUG(0,("new_spoolss_io_r_enumprinters: unable to marshall SPOOL_R_ENUMPRINTERS.\n")); DEBUG(0,("new_spoolss_io_r_enumprinters: unable to marshall SPOOL_R_ENUMPRINTERS.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -351,9 +336,6 @@ static BOOL api_spoolss_getprinter(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if(!spoolss_io_q_getprinter("", &q_u, data, 0)) { if(!spoolss_io_q_getprinter("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_getprinter: unable to unmarshall SPOOL_Q_GETPRINTER.\n")); DEBUG(0,("spoolss_io_q_getprinter: unable to unmarshall SPOOL_Q_GETPRINTER.\n"));
return False; return False;
@ -368,11 +350,9 @@ static BOOL api_spoolss_getprinter(pipes_struct *p)
if(!spoolss_io_r_getprinter("",&r_u,rdata,0)) { if(!spoolss_io_r_getprinter("",&r_u,rdata,0)) {
DEBUG(0,("spoolss_io_r_getprinter: unable to marshall SPOOL_R_GETPRINTER.\n")); DEBUG(0,("spoolss_io_r_getprinter: unable to marshall SPOOL_R_GETPRINTER.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -392,9 +372,6 @@ static BOOL api_spoolss_getprinterdriver2(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if(!spoolss_io_q_getprinterdriver2("", &q_u, data, 0)) { if(!spoolss_io_q_getprinterdriver2("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_getprinterdriver2: unable to unmarshall SPOOL_Q_GETPRINTERDRIVER2.\n")); DEBUG(0,("spoolss_io_q_getprinterdriver2: unable to unmarshall SPOOL_Q_GETPRINTERDRIVER2.\n"));
return False; return False;
@ -410,11 +387,9 @@ static BOOL api_spoolss_getprinterdriver2(pipes_struct *p)
if(!spoolss_io_r_getprinterdriver2("",&r_u,rdata,0)) { if(!spoolss_io_r_getprinterdriver2("",&r_u,rdata,0)) {
DEBUG(0,("spoolss_io_r_getprinterdriver2: unable to marshall SPOOL_R_GETPRINTERDRIVER2.\n")); DEBUG(0,("spoolss_io_r_getprinterdriver2: unable to marshall SPOOL_R_GETPRINTERDRIVER2.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -560,7 +535,6 @@ static BOOL api_spoolss_writeprinter(pipes_struct *p)
q_u.buffer, q_u.buffer,
&q_u.buffer_size2); &q_u.buffer_size2);
r_u.buffer_written = q_u.buffer_size2; r_u.buffer_written = q_u.buffer_size2;
safe_free(q_u.buffer);
if(!spoolss_io_r_writeprinter("",&r_u,rdata,0)) { if(!spoolss_io_r_writeprinter("",&r_u,rdata,0)) {
DEBUG(0,("spoolss_io_r_writeprinter: unable to marshall SPOOL_R_WRITEPRINTER.\n")); DEBUG(0,("spoolss_io_r_writeprinter: unable to marshall SPOOL_R_WRITEPRINTER.\n"));
@ -594,13 +568,9 @@ static BOOL api_spoolss_setprinter(pipes_struct *p)
if(!spoolss_io_r_setprinter("",&r_u,rdata,0)) { if(!spoolss_io_r_setprinter("",&r_u,rdata,0)) {
DEBUG(0,("spoolss_io_r_setprinter: unable to marshall SPOOL_R_SETPRINTER.\n")); DEBUG(0,("spoolss_io_r_setprinter: unable to marshall SPOOL_R_SETPRINTER.\n"));
free_spoolss_q_setprinter(&q_u);
return False; return False;
} }
/* Free anything allocated in the unparse. */
free_spoolss_q_setprinter(&q_u);
return True; return True;
} }
@ -644,9 +614,6 @@ static BOOL api_spoolss_addjob(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if(!spoolss_io_q_addjob("", &q_u, data, 0)) { if(!spoolss_io_q_addjob("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_addjob: unable to unmarshall SPOOL_Q_ADDJOB.\n")); DEBUG(0,("spoolss_io_q_addjob: unable to unmarshall SPOOL_Q_ADDJOB.\n"));
return False; return False;
@ -660,12 +627,9 @@ static BOOL api_spoolss_addjob(pipes_struct *p)
if(!spoolss_io_r_addjob("",&r_u,rdata,0)) { if(!spoolss_io_r_addjob("",&r_u,rdata,0)) {
DEBUG(0,("spoolss_io_r_addjob: unable to marshall SPOOL_R_ADDJOB.\n")); DEBUG(0,("spoolss_io_r_addjob: unable to marshall SPOOL_R_ADDJOB.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -682,9 +646,6 @@ static BOOL api_spoolss_enumjobs(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if (!spoolss_io_q_enumjobs("", &q_u, data, 0)) { if (!spoolss_io_q_enumjobs("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_enumjobs: unable to unmarshall SPOOL_Q_ENUMJOBS.\n")); DEBUG(0,("spoolss_io_q_enumjobs: unable to unmarshall SPOOL_Q_ENUMJOBS.\n"));
return False; return False;
@ -699,12 +660,9 @@ static BOOL api_spoolss_enumjobs(pipes_struct *p)
if (!spoolss_io_r_enumjobs("",&r_u,rdata,0)) { if (!spoolss_io_r_enumjobs("",&r_u,rdata,0)) {
DEBUG(0,("spoolss_io_r_enumjobs: unable to marshall SPOOL_R_ENUMJOBS.\n")); DEBUG(0,("spoolss_io_r_enumjobs: unable to marshall SPOOL_R_ENUMJOBS.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -777,9 +735,6 @@ static BOOL api_spoolss_enumprinterdrivers(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if (!spoolss_io_q_enumprinterdrivers("", &q_u, data, 0)) { if (!spoolss_io_q_enumprinterdrivers("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_enumprinterdrivers: unable to unmarshall SPOOL_Q_ENUMPRINTERDRIVERS.\n")); DEBUG(0,("spoolss_io_q_enumprinterdrivers: unable to unmarshall SPOOL_Q_ENUMPRINTERDRIVERS.\n"));
return False; return False;
@ -794,12 +749,9 @@ static BOOL api_spoolss_enumprinterdrivers(pipes_struct *p)
if (!new_spoolss_io_r_enumprinterdrivers("",&r_u,rdata,0)) { if (!new_spoolss_io_r_enumprinterdrivers("",&r_u,rdata,0)) {
DEBUG(0,("new_spoolss_io_r_enumprinterdrivers: unable to marshall SPOOL_R_ENUMPRINTERDRIVERS.\n")); DEBUG(0,("new_spoolss_io_r_enumprinterdrivers: unable to marshall SPOOL_R_ENUMPRINTERDRIVERS.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -816,9 +768,6 @@ static BOOL api_spoolss_getform(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if (!spoolss_io_q_getform("", &q_u, data, 0)) { if (!spoolss_io_q_getform("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_getform: unable to unmarshall SPOOL_Q_GETFORM.\n")); DEBUG(0,("spoolss_io_q_getform: unable to unmarshall SPOOL_Q_GETFORM.\n"));
return False; return False;
@ -832,12 +781,9 @@ static BOOL api_spoolss_getform(pipes_struct *p)
if (!new_spoolss_io_r_getform("",&r_u,rdata,0)) { if (!new_spoolss_io_r_getform("",&r_u,rdata,0)) {
DEBUG(0,("new_spoolss_io_r_getform: unable to marshall SPOOL_R_GETFORM.\n")); DEBUG(0,("new_spoolss_io_r_getform: unable to marshall SPOOL_R_GETFORM.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -853,9 +799,6 @@ static BOOL api_spoolss_enumforms(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if (!spoolss_io_q_enumforms("", &q_u, data, 0)) { if (!spoolss_io_q_enumforms("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_enumforms: unable to unmarshall SPOOL_Q_ENUMFORMS.\n")); DEBUG(0,("spoolss_io_q_enumforms: unable to unmarshall SPOOL_Q_ENUMFORMS.\n"));
return False; return False;
@ -870,12 +813,9 @@ static BOOL api_spoolss_enumforms(pipes_struct *p)
if (!new_spoolss_io_r_enumforms("",&r_u,rdata,0)) { if (!new_spoolss_io_r_enumforms("",&r_u,rdata,0)) {
DEBUG(0,("new_spoolss_io_r_enumforms: unable to marshall SPOOL_R_ENUMFORMS.\n")); DEBUG(0,("new_spoolss_io_r_enumforms: unable to marshall SPOOL_R_ENUMFORMS.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -892,9 +832,6 @@ static BOOL api_spoolss_enumports(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if(!spoolss_io_q_enumports("", &q_u, data, 0)) { if(!spoolss_io_q_enumports("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_enumports: unable to unmarshall SPOOL_Q_ENUMPORTS.\n")); DEBUG(0,("spoolss_io_q_enumports: unable to unmarshall SPOOL_Q_ENUMPORTS.\n"));
return False; return False;
@ -909,12 +846,9 @@ static BOOL api_spoolss_enumports(pipes_struct *p)
if (!new_spoolss_io_r_enumports("",&r_u,rdata,0)) { if (!new_spoolss_io_r_enumports("",&r_u,rdata,0)) {
DEBUG(0,("new_spoolss_io_r_enumports: unable to marshall SPOOL_R_ENUMPORTS.\n")); DEBUG(0,("new_spoolss_io_r_enumports: unable to marshall SPOOL_R_ENUMPORTS.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -947,17 +881,6 @@ static BOOL api_spoolss_addprinterex(pipes_struct *p)
return False; 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; return True;
} }
@ -975,7 +898,6 @@ static BOOL api_spoolss_addprinterdriver(pipes_struct *p)
if(!spoolss_io_q_addprinterdriver("", &q_u, data, 0)) { if(!spoolss_io_q_addprinterdriver("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_addprinterdriver: unable to unmarshall SPOOL_Q_ADDPRINTERDRIVER.\n")); DEBUG(0,("spoolss_io_q_addprinterdriver: unable to unmarshall SPOOL_Q_ADDPRINTERDRIVER.\n"));
free_spoolss_q_addprinterdriver(&q_u);
return False; return False;
} }
@ -983,12 +905,9 @@ static BOOL api_spoolss_addprinterdriver(pipes_struct *p)
if(!spoolss_io_r_addprinterdriver("", &r_u, rdata, 0)) { if(!spoolss_io_r_addprinterdriver("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_addprinterdriver: unable to marshall SPOOL_R_ADDPRINTERDRIVER.\n")); DEBUG(0,("spoolss_io_r_addprinterdriver: unable to marshall SPOOL_R_ADDPRINTERDRIVER.\n"));
free_spoolss_q_addprinterdriver(&q_u);
return False; return False;
} }
free_spoolss_q_addprinterdriver(&q_u);
return True; return True;
} }
@ -1004,9 +923,6 @@ static BOOL api_spoolss_getprinterdriverdirectory(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if(!spoolss_io_q_getprinterdriverdir("", &q_u, data, 0)) { if(!spoolss_io_q_getprinterdriverdir("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_getprinterdriverdir: unable to unmarshall SPOOL_Q_GETPRINTERDRIVERDIR.\n")); DEBUG(0,("spoolss_io_q_getprinterdriverdir: unable to unmarshall SPOOL_Q_GETPRINTERDRIVERDIR.\n"));
return False; return False;
@ -1021,12 +937,9 @@ static BOOL api_spoolss_getprinterdriverdirectory(pipes_struct *p)
if(!spoolss_io_r_getprinterdriverdir("", &r_u, rdata, 0)) { if(!spoolss_io_r_getprinterdriverdir("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_getprinterdriverdir: unable to marshall SPOOL_R_GETPRINTERDRIVERDIR.\n")); DEBUG(0,("spoolss_io_r_getprinterdriverdir: unable to marshall SPOOL_R_GETPRINTERDRIVERDIR.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -1047,21 +960,16 @@ static BOOL api_spoolss_enumprinterdata(pipes_struct *p)
return False; return False;
} }
r_u.status = _spoolss_enumprinterdata(&q_u.handle, q_u.index, q_u.valuesize, q_u.datasize, r_u.status = _spoolss_enumprinterdata(p, &q_u.handle, q_u.index, q_u.valuesize, q_u.datasize,
&r_u.valuesize, &r_u.value, &r_u.realvaluesize, &r_u.valuesize, &r_u.value, &r_u.realvaluesize,
&r_u.type, &r_u.type,
&r_u.datasize, &r_u.data, &r_u.realdatasize); &r_u.datasize, &r_u.data, &r_u.realdatasize);
if(!spoolss_io_r_enumprinterdata("", &r_u, rdata, 0)) { if(!spoolss_io_r_enumprinterdata("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_enumprinterdata: unable to marshall SPOOL_R_ENUMPRINTERDATA.\n")); DEBUG(0,("spoolss_io_r_enumprinterdata: unable to marshall SPOOL_R_ENUMPRINTERDATA.\n"));
safe_free(r_u.value);
safe_free(r_u.data);
return False; return False;
} }
safe_free(r_u.value);
safe_free(r_u.data);
return True; return True;
} }
@ -1086,8 +994,6 @@ static BOOL api_spoolss_setprinterdata(pipes_struct *p)
&q_u.value, q_u.type, q_u.max_len, &q_u.value, q_u.type, q_u.max_len,
q_u.data, q_u.real_len, q_u.numeric_data); q_u.data, q_u.real_len, q_u.numeric_data);
free_spoolss_q_setprinterdata(&q_u);
if(!spoolss_io_r_setprinterdata("", &r_u, rdata, 0)) { if(!spoolss_io_r_setprinterdata("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_setprinterdata: unable to marshall SPOOL_R_SETPRINTERDATA.\n")); DEBUG(0,("spoolss_io_r_setprinterdata: unable to marshall SPOOL_R_SETPRINTERDATA.\n"));
return False; return False;
@ -1189,9 +1095,6 @@ static BOOL api_spoolss_enumprintprocessors(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if(!spoolss_io_q_enumprintprocessors("", &q_u, data, 0)) { if(!spoolss_io_q_enumprintprocessors("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_enumprintprocessors: unable to unmarshall SPOOL_Q_ENUMPRINTPROCESSORS.\n")); DEBUG(0,("spoolss_io_q_enumprintprocessors: unable to unmarshall SPOOL_Q_ENUMPRINTPROCESSORS.\n"));
return False; return False;
@ -1206,12 +1109,9 @@ static BOOL api_spoolss_enumprintprocessors(pipes_struct *p)
if(!spoolss_io_r_enumprintprocessors("", &r_u, rdata, 0)) { if(!spoolss_io_r_enumprintprocessors("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_enumprintprocessors: unable to marshall SPOOL_R_ENUMPRINTPROCESSORS.\n")); DEBUG(0,("spoolss_io_r_enumprintprocessors: unable to marshall SPOOL_R_ENUMPRINTPROCESSORS.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -1227,9 +1127,6 @@ static BOOL api_spoolss_enumprintprocdatatypes(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if(!spoolss_io_q_enumprintprocdatatypes("", &q_u, data, 0)) { if(!spoolss_io_q_enumprintprocdatatypes("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_enumprintprocdatatypes: unable to unmarshall SPOOL_Q_ENUMPRINTPROCDATATYPES.\n")); DEBUG(0,("spoolss_io_q_enumprintprocdatatypes: unable to unmarshall SPOOL_Q_ENUMPRINTPROCDATATYPES.\n"));
return False; return False;
@ -1244,12 +1141,9 @@ static BOOL api_spoolss_enumprintprocdatatypes(pipes_struct *p)
if(!spoolss_io_r_enumprintprocdatatypes("", &r_u, rdata, 0)) { if(!spoolss_io_r_enumprintprocdatatypes("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_enumprintprocdatatypes: unable to marshall SPOOL_R_ENUMPRINTPROCDATATYPES.\n")); DEBUG(0,("spoolss_io_r_enumprintprocdatatypes: unable to marshall SPOOL_R_ENUMPRINTPROCDATATYPES.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -1265,9 +1159,6 @@ static BOOL api_spoolss_enumprintmonitors(pipes_struct *p)
ZERO_STRUCT(q_u); ZERO_STRUCT(q_u);
ZERO_STRUCT(r_u); ZERO_STRUCT(r_u);
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if (!spoolss_io_q_enumprintmonitors("", &q_u, data, 0)) { if (!spoolss_io_q_enumprintmonitors("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_enumprintmonitors: unable to unmarshall SPOOL_Q_ENUMPRINTMONITORS.\n")); DEBUG(0,("spoolss_io_q_enumprintmonitors: unable to unmarshall SPOOL_Q_ENUMPRINTMONITORS.\n"));
return False; return False;
@ -1282,12 +1173,9 @@ static BOOL api_spoolss_enumprintmonitors(pipes_struct *p)
if (!spoolss_io_r_enumprintmonitors("", &r_u, rdata, 0)) { if (!spoolss_io_r_enumprintmonitors("", &r_u, rdata, 0)) {
DEBUG(0,("spoolss_io_r_enumprintmonitors: unable to marshall SPOOL_R_ENUMPRINTMONITORS.\n")); DEBUG(0,("spoolss_io_r_enumprintmonitors: unable to marshall SPOOL_R_ENUMPRINTMONITORS.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }
@ -1300,9 +1188,6 @@ static BOOL api_spoolss_getjob(pipes_struct *p)
prs_struct *data = &p->in_data.data; prs_struct *data = &p->in_data.data;
prs_struct *rdata = &p->out_data.rdata; prs_struct *rdata = &p->out_data.rdata;
if(!new_spoolss_allocate_buffer(&q_u.buffer))
return False;
if(!spoolss_io_q_getjob("", &q_u, data, 0)) { if(!spoolss_io_q_getjob("", &q_u, data, 0)) {
DEBUG(0,("spoolss_io_q_getjob: unable to unmarshall SPOOL_Q_GETJOB.\n")); DEBUG(0,("spoolss_io_q_getjob: unable to unmarshall SPOOL_Q_GETJOB.\n"));
return False; return False;
@ -1317,11 +1202,9 @@ static BOOL api_spoolss_getjob(pipes_struct *p)
if(!spoolss_io_r_getjob("",&r_u,rdata,0)) { if(!spoolss_io_r_getjob("",&r_u,rdata,0)) {
DEBUG(0,("spoolss_io_r_getjob: unable to marshall SPOOL_R_GETJOB.\n")); DEBUG(0,("spoolss_io_r_getjob: unable to marshall SPOOL_R_GETJOB.\n"));
new_spoolss_free_buffer(q_u.buffer);
return False; return False;
} }
new_spoolss_free_buffer(q_u.buffer);
return True; return True;
} }

View File

@ -1155,7 +1155,7 @@ static BOOL getprinterdata_printer(POLICY_HND *handle,
/******************************************************************** /********************************************************************
* spoolss_getprinterdata * spoolss_getprinterdata
********************************************************************/ ********************************************************************/
uint32 _spoolss_getprinterdata(POLICY_HND *handle, UNISTR2 *valuename, uint32 _spoolss_getprinterdata(pipes_struct *p, POLICY_HND *handle, UNISTR2 *valuename,
uint32 in_size, uint32 in_size,
uint32 *type, uint32 *type,
uint32 *out_size, uint32 *out_size,
@ -1199,9 +1199,8 @@ uint32 _spoolss_getprinterdata(POLICY_HND *handle, UNISTR2 *valuename,
DEBUG(5, ("value not found, allocating %d\n", *out_size)); DEBUG(5, ("value not found, allocating %d\n", *out_size));
/* reply this param doesn't exist */ /* reply this param doesn't exist */
if (*out_size) { if (*out_size) {
if((*data=(uint8 *)malloc(*out_size*sizeof(uint8))) == NULL) if((*data=(uint8 *)talloc_zero(p->mem_ctx, *out_size*sizeof(uint8))) == NULL)
return ERROR_NOT_ENOUGH_MEMORY; return ERROR_NOT_ENOUGH_MEMORY;
memset(*data, '\0', *out_size*sizeof(uint8));
} else { } else {
*data = NULL; *data = NULL;
} }
@ -2070,7 +2069,9 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int
SPOOL_NOTIFY_INFO_DATA *current_data; SPOOL_NOTIFY_INFO_DATA *current_data;
NT_PRINTER_INFO_LEVEL *printer = NULL; NT_PRINTER_INFO_LEVEL *printer = NULL;
print_queue_struct *queue=NULL; print_queue_struct *queue=NULL;
size_t realloc_size = 0;
SPOOL_NOTIFY_INFO_DATA *info_data_ptr = NULL;
type=option_type->type; type=option_type->type;
DEBUG(4,("construct_notify_printer_info: Notify type: [%s], number of notify info: [%d] on printer: [%s]\n", DEBUG(4,("construct_notify_printer_info: Notify type: [%s], number of notify info: [%d] on printer: [%s]\n",
@ -2087,10 +2088,11 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int
if (!search_notify(type, field, &j) ) if (!search_notify(type, field, &j) )
continue; continue;
if((info->data=Realloc(info->data, (info->count+1)*sizeof(SPOOL_NOTIFY_INFO_DATA))) == NULL) { realloc_size = (info->count+1)*sizeof(SPOOL_NOTIFY_INFO_DATA);
if((info_data_ptr=(SPOOL_NOTIFY_INFO_DATA *)Realloc(info_data_ptr, realloc_size)) == NULL) {
return False; return False;
} }
current_data=&info->data[info->count]; current_data=&info_data_ptr[info->count];
construct_info_data(current_data, type, field, id); construct_info_data(current_data, type, field, id);
@ -2103,6 +2105,12 @@ static BOOL construct_notify_printer_info(SPOOL_NOTIFY_INFO *info, int
info->count++; info->count++;
} }
if (realloc_size)
info->data = talloc_memdup(mem_ctx, info_data_ptr, realloc_size);
else
info->data = NULL;
safe_free(info_data_ptr);
free_a_printer(&printer, 2); free_a_printer(&printer, 2);
return True; return True;
} }
@ -2322,9 +2330,8 @@ static uint32 printer_notify_info(POLICY_HND *hnd, SPOOL_NOTIFY_INFO *info,
/******************************************************************** /********************************************************************
* spoolss_rfnpcnex * spoolss_rfnpcnex
********************************************************************/ ********************************************************************/
uint32 _spoolss_rfnpcnex( POLICY_HND *handle, uint32 change, uint32 _spoolss_rfnpcnex( pipes_struct *p, POLICY_HND *handle, uint32 change,
SPOOL_NOTIFY_OPTION *option, TALLOC_CTX *mem_ctx, SPOOL_NOTIFY_OPTION *option, SPOOL_NOTIFY_INFO *info)
SPOOL_NOTIFY_INFO *info)
{ {
Printer_entry *Printer=find_printer_index_by_hnd(handle); Printer_entry *Printer=find_printer_index_by_hnd(handle);
uint32 result = ERROR_INVALID_HANDLE; uint32 result = ERROR_INVALID_HANDLE;
@ -2348,18 +2355,16 @@ uint32 _spoolss_rfnpcnex( POLICY_HND *handle, uint32 change,
* informations even when _NOTHING_ has changed. * informations even when _NOTHING_ has changed.
*/ */
/* just discard the SPOOL_NOTIFY_OPTION */ /* just ignore the SPOOL_NOTIFY_OPTION */
if (option!=NULL)
safe_free(option->ctr.type);
switch (Printer->printer_type) { switch (Printer->printer_type) {
case PRINTER_HANDLE_IS_PRINTSERVER: case PRINTER_HANDLE_IS_PRINTSERVER:
result = printserver_notify_info(handle, info, result = printserver_notify_info(handle, info,
mem_ctx); p->mem_ctx);
break; break;
case PRINTER_HANDLE_IS_PRINTER: case PRINTER_HANDLE_IS_PRINTER:
result = printer_notify_info(handle, info, mem_ctx); result = printer_notify_info(handle, info, p->mem_ctx);
break; break;
} }
@ -2910,7 +2915,6 @@ static BOOL enum_all_printers_info_2(NEW_BUFFER *buffer, uint32 offered, uint32
if (!alloc_buffer_size(buffer, *needed)) { if (!alloc_buffer_size(buffer, *needed)) {
for (i=0; i<*returned; i++) { for (i=0; i<*returned; i++) {
free_devmode(printers[i].devmode); free_devmode(printers[i].devmode);
free_sec_desc(&printers[i].secdesc);
} }
safe_free(printers); safe_free(printers);
return ERROR_INSUFFICIENT_BUFFER; return ERROR_INSUFFICIENT_BUFFER;
@ -2923,7 +2927,6 @@ static BOOL enum_all_printers_info_2(NEW_BUFFER *buffer, uint32 offered, uint32
/* clear memory */ /* clear memory */
for (i=0; i<*returned; i++) { for (i=0; i<*returned; i++) {
free_devmode(printers[i].devmode); free_devmode(printers[i].devmode);
free_sec_desc(&printers[i].secdesc);
} }
safe_free(printers); safe_free(printers);
@ -3930,7 +3933,7 @@ static uint32 update_printer_sec(POLICY_HND *handle, uint32 level,
dialog boxes when the user doesn't have permission to change dialog boxes when the user doesn't have permission to change
the security descriptor. */ the security descriptor. */
nt_printing_getsec(Printer->dev.handlename, &old_secdesc_ctr); nt_printing_getsec(p->mem_ctx, Printer->dev.handlename, &old_secdesc_ctr);
if (DEBUGLEVEL >= 10) { if (DEBUGLEVEL >= 10) {
SEC_ACL *acl; SEC_ACL *acl;
@ -3968,7 +3971,7 @@ static uint32 update_printer_sec(POLICY_HND *handle, uint32 level,
} }
} }
new_secdesc_ctr = sec_desc_merge(secdesc_ctr, old_secdesc_ctr); new_secdesc_ctr = sec_desc_merge(p->mem_ctx, secdesc_ctr, old_secdesc_ctr);
if (sec_desc_equal(new_secdesc_ctr->sec, old_secdesc_ctr->sec)) { if (sec_desc_equal(new_secdesc_ctr->sec, old_secdesc_ctr->sec)) {
result = NT_STATUS_NO_PROBLEMO; result = NT_STATUS_NO_PROBLEMO;
@ -3992,8 +3995,6 @@ static uint32 update_printer_sec(POLICY_HND *handle, uint32 level,
result = nt_printing_setsec(Printer->dev.handlename, new_secdesc_ctr); result = nt_printing_setsec(Printer->dev.handlename, new_secdesc_ctr);
done: done:
free_sec_desc_buf(&new_secdesc_ctr);
free_sec_desc_buf(&old_secdesc_ctr);
return result; return result;
} }
@ -5626,7 +5627,7 @@ uint32 _spoolss_getprinterdriverdirectory(UNISTR2 *name, UNISTR2 *uni_environmen
/**************************************************************************** /****************************************************************************
****************************************************************************/ ****************************************************************************/
uint32 _spoolss_enumprinterdata(POLICY_HND *handle, uint32 idx, uint32 _spoolss_enumprinterdata(pipes_struct *p, POLICY_HND *handle, uint32 idx,
uint32 in_value_len, uint32 in_data_len, uint32 in_value_len, uint32 in_data_len,
uint32 *out_max_value_len, uint16 **out_value, uint32 *out_value_len, uint32 *out_max_value_len, uint16 **out_value, uint32 *out_value_len,
uint32 *out_type, uint32 *out_type,
@ -5758,24 +5759,22 @@ uint32 _spoolss_enumprinterdata(POLICY_HND *handle, uint32 idx,
*/ */
*out_max_value_len=(in_value_len/sizeof(uint16)); *out_max_value_len=(in_value_len/sizeof(uint16));
if((*out_value=(uint16 *)malloc(in_value_len*sizeof(uint8))) == NULL) { if((*out_value=(uint16 *)talloc_zero(p->mem_ctx,in_value_len*sizeof(uint8))) == NULL) {
safe_free(data); safe_free(data);
return ERROR_NOT_ENOUGH_MEMORY; return ERROR_NOT_ENOUGH_MEMORY;
} }
ZERO_STRUCTP(*out_value);
*out_value_len = (uint32)dos_PutUniCode((char *)*out_value, value, in_value_len, True); *out_value_len = (uint32)dos_PutUniCode((char *)*out_value, value, in_value_len, True);
*out_type=type; *out_type=type;
/* the data is counted in bytes */ /* the data is counted in bytes */
*out_max_data_len=in_data_len; *out_max_data_len=in_data_len;
if((*data_out=(uint8 *)malloc(in_data_len*sizeof(uint8))) == NULL) { if((*data_out=(uint8 *)talloc_zero(p->mem_ctx, in_data_len*sizeof(uint8))) == NULL) {
safe_free(data); safe_free(data);
return ERROR_NOT_ENOUGH_MEMORY; return ERROR_NOT_ENOUGH_MEMORY;
} }
memset(*data_out,'\0',in_data_len);
memcpy(*data_out, data, (size_t)data_len); memcpy(*data_out, data, (size_t)data_len);
*out_data_len=data_len; *out_data_len=data_len;

View File

@ -1099,7 +1099,6 @@ static BOOL set_sd(files_struct *fsp, char *data, uint32 sd_len, uint security_i
*/ */
if(!sec_io_desc( "sd data", &psd, &pd, 1)) { if(!sec_io_desc( "sd data", &psd, &pd, 1)) {
free_sec_desc(&psd);
DEBUG(0,("set_sd: Error in unmarshalling security descriptor.\n")); DEBUG(0,("set_sd: Error in unmarshalling security descriptor.\n"));
/* /*
* Return access denied for want of a better error message.. * Return access denied for want of a better error message..
@ -1122,14 +1121,12 @@ static BOOL set_sd(files_struct *fsp, char *data, uint32 sd_len, uint security_i
ret = set_nt_acl( fsp, security_info_sent, psd); ret = set_nt_acl( fsp, security_info_sent, psd);
if (!ret) { if (!ret) {
free_sec_desc(&psd);
talloc_destroy(mem_ctx); talloc_destroy(mem_ctx);
*pdef_class = ERRDOS; *pdef_class = ERRDOS;
*pdef_code = ERRnoaccess; *pdef_code = ERRnoaccess;
return False; return False;
} }
free_sec_desc(&psd);
talloc_destroy(mem_ctx); talloc_destroy(mem_ctx);
*pdef_class = 0; *pdef_class = 0;
@ -1638,8 +1635,6 @@ static int call_nt_transact_query_security_desc(connection_struct *conn,
if(max_data_count < sd_size) { if(max_data_count < sd_size) {
free_sec_desc(&psd);
send_nt_replies(inbuf, outbuf, bufsize, NT_STATUS_BUFFER_TOO_SMALL, send_nt_replies(inbuf, outbuf, bufsize, NT_STATUS_BUFFER_TOO_SMALL,
params, 4, *ppdata, 0); params, 4, *ppdata, 0);
return -1; return -1;
@ -1651,7 +1646,6 @@ static int call_nt_transact_query_security_desc(connection_struct *conn,
data = Realloc(*ppdata, sd_size); data = Realloc(*ppdata, sd_size);
if(data == NULL) { if(data == NULL) {
free_sec_desc(&psd);
return(ERROR(ERRDOS,ERRnomem)); return(ERROR(ERRDOS,ERRnomem));
} }
@ -1665,7 +1659,6 @@ static int call_nt_transact_query_security_desc(connection_struct *conn,
if ((mem_ctx = talloc_init()) == NULL) { if ((mem_ctx = talloc_init()) == NULL) {
DEBUG(0,("call_nt_transact_query_security_desc: talloc_init failed.\n")); DEBUG(0,("call_nt_transact_query_security_desc: talloc_init failed.\n"));
free_sec_desc(&psd);
return(ERROR(ERRDOS,ERRnomem)); return(ERROR(ERRDOS,ERRnomem));
} }
@ -1683,7 +1676,6 @@ static int call_nt_transact_query_security_desc(connection_struct *conn,
*/ */
if(!sec_io_desc( "sd data", &psd, &pd, 1)) { if(!sec_io_desc( "sd data", &psd, &pd, 1)) {
free_sec_desc(&psd);
DEBUG(0,("call_nt_transact_query_security_desc: Error in marshalling \ DEBUG(0,("call_nt_transact_query_security_desc: Error in marshalling \
security descriptor.\n")); security descriptor.\n"));
/* /*
@ -1697,7 +1689,6 @@ security descriptor.\n"));
* Now we can delete the security descriptor. * Now we can delete the security descriptor.
*/ */
free_sec_desc(&psd);
talloc_destroy(mem_ctx); talloc_destroy(mem_ctx);
send_nt_replies(inbuf, outbuf, bufsize, 0, params, 4, data, (int)sd_size); send_nt_replies(inbuf, outbuf, bufsize, 0, params, 4, data, (int)sd_size);

View File

@ -41,6 +41,7 @@ typedef struct canon_ace {
static void free_canon_ace_list( canon_ace *list_head ); static void free_canon_ace_list( canon_ace *list_head );
#if !defined(HAVE_NO_ACLS)
/**************************************************************************** /****************************************************************************
Function to duplicate a canon_ace entry. Function to duplicate a canon_ace entry.
****************************************************************************/ ****************************************************************************/
@ -56,6 +57,7 @@ static canon_ace *dup_canon_ace( canon_ace *src_ace)
dst_ace->prev = dst_ace->next = NULL; dst_ace->prev = dst_ace->next = NULL;
return dst_ace; return dst_ace;
} }
#endif /* HAVE_NO_ACLS */
/**************************************************************************** /****************************************************************************
Function to create owner and group SIDs from a SMB_STRUCT_STAT. Function to create owner and group SIDs from a SMB_STRUCT_STAT.
@ -243,6 +245,7 @@ static BOOL unpack_nt_owners(SMB_STRUCT_STAT *psbuf, uid_t *puser, gid_t *pgrp,
return True; return True;
} }
#if !defined(HAVE_NO_ACLS)
/**************************************************************************** /****************************************************************************
Merge aces with a common user. Merge aces with a common user.
****************************************************************************/ ****************************************************************************/
@ -378,6 +381,7 @@ static BOOL ensure_canon_entry_valid(canon_ace **pp_ace,
return True; return True;
} }
#endif /* HAVE_NO_ACLS */
/**************************************************************************** /****************************************************************************
Unpack a SEC_DESC into two canonical ace lists. We don't depend on this Unpack a SEC_DESC into two canonical ace lists. We don't depend on this
@ -577,7 +581,6 @@ static BOOL unpack_canon_ace(files_struct *fsp,
*/ */
DEBUG(10,("unpack_canon_ace: Win2k inherit acl traverse. Ignoring DACL.\n")); DEBUG(10,("unpack_canon_ace: Win2k inherit acl traverse. Ignoring DACL.\n"));
free_sec_acl(&psd->dacl);
} }
/* /*
@ -788,7 +791,6 @@ static BOOL unpack_posix_permissions(files_struct *fsp, SMB_STRUCT_STAT *psbuf,
*/ */
DEBUG(10,("unpack_posix_permissions: Win2k inherit acl traverse. Ignoring DACL.\n")); DEBUG(10,("unpack_posix_permissions: Win2k inherit acl traverse. Ignoring DACL.\n"));
free_sec_acl(&psd->dacl);
} }
/* /*
@ -1403,13 +1405,13 @@ size_t get_nt_acl(files_struct *fsp, SEC_DESC **ppdesc)
} }
if (num_acls) { if (num_acls) {
if((psa = make_sec_acl( ACL_REVISION, num_aces, nt_ace_list)) == NULL) { if((psa = make_sec_acl( main_loop_talloc_get(), ACL_REVISION, num_aces, nt_ace_list)) == NULL) {
DEBUG(0,("get_nt_acl: Unable to malloc space for acl.\n")); DEBUG(0,("get_nt_acl: Unable to malloc space for acl.\n"));
goto done; goto done;
} }
} }
*ppdesc = make_standard_sec_desc( &owner_sid, &group_sid, psa, &sd_size); *ppdesc = make_standard_sec_desc( main_loop_talloc_get(), &owner_sid, &group_sid, psa, &sd_size);
if(!*ppdesc) { if(!*ppdesc) {
DEBUG(0,("get_nt_acl: Unable to malloc space for security descriptor.\n")); DEBUG(0,("get_nt_acl: Unable to malloc space for security descriptor.\n"));
@ -1426,8 +1428,6 @@ size_t get_nt_acl(files_struct *fsp, SEC_DESC **ppdesc)
free_canon_ace_list(dir_ace); free_canon_ace_list(dir_ace);
if (nt_ace_list) if (nt_ace_list)
free(nt_ace_list); free(nt_ace_list);
if (psa)
free_sec_acl(&psa);
return sd_size; return sd_size;
} }
@ -1700,5 +1700,4 @@ int fchmod_acl(int fd, mode_t mode)
sys_acl_free_acl(posix_acl); sys_acl_free_acl(posix_acl);
return ret; return ret;
} }
#undef OLD_NTDOMAIN #undef OLD_NTDOMAIN