summaryrefslogtreecommitdiff
path: root/source3/rpc_parse
diff options
context:
space:
mode:
Diffstat (limited to 'source3/rpc_parse')
-rw-r--r--source3/rpc_parse/parse_samr.c77
1 files changed, 76 insertions, 1 deletions
diff --git a/source3/rpc_parse/parse_samr.c b/source3/rpc_parse/parse_samr.c
index 9b5ed1d294..69c7599a98 100644
--- a/source3/rpc_parse/parse_samr.c
+++ b/source3/rpc_parse/parse_samr.c
@@ -2576,6 +2576,17 @@ BOOL samr_io_r_query_groupmem(char *desc, SAMR_R_QUERY_GROUPMEM *r_u, prs_struc
if (r_u->ptr_rids != 0)
{
prs_uint32("num_rids", ps, depth, &(r_u->num_rids));
+ if (r_u->num_rids != 0)
+ {
+ r_u->rid = Realloc(r_u->rid,
+ sizeof(r_u->rid[0]) *
+ r_u->num_rids);
+ if (r_u->rid == NULL)
+ {
+ samr_free_r_query_groupmem(r_u);
+ return False;
+ }
+ }
for (i = 0; i < r_u->num_rids; i++)
{
prs_grow(ps);
@@ -2586,6 +2597,18 @@ BOOL samr_io_r_query_groupmem(char *desc, SAMR_R_QUERY_GROUPMEM *r_u, prs_struc
if (r_u->ptr_attrs != 0)
{
prs_uint32("num_attrs", ps, depth, &(r_u->num_attrs));
+
+ if (r_u->num_attrs != 0)
+ {
+ r_u->attr = Realloc(r_u->attr,
+ sizeof(r_u->attr[0]) *
+ r_u->num_attrs);
+ if (r_u->attr == NULL)
+ {
+ samr_free_r_query_groupmem(r_u);
+ return False;
+ }
+ }
for (i = 0; i < r_u->num_attrs; i++)
{
prs_grow(ps);
@@ -2596,11 +2619,34 @@ BOOL samr_io_r_query_groupmem(char *desc, SAMR_R_QUERY_GROUPMEM *r_u, prs_struc
prs_uint32("status", ps, depth, &(r_u->status));
+ if (!ps->io)
+ {
+ /* storing. memory no longer needed */
+ samr_free_r_query_groupmem(r_u);
+ }
+
return True;
}
/*******************************************************************
+frees a structure.
+********************************************************************/
+void samr_free_r_query_groupmem(SAMR_R_QUERY_GROUPMEM *r_u)
+{
+ if (r_u->rid != NULL)
+ {
+ free(r_u->rid);
+ r_u->rid = NULL;
+ }
+ if (r_u->attr != NULL)
+ {
+ free(r_u->attr);
+ r_u->attr = NULL;
+ }
+}
+
+/*******************************************************************
makes a SAMR_Q_QUERY_USERGROUPS structure.
********************************************************************/
BOOL make_samr_q_query_usergroups(SAMR_Q_QUERY_USERGROUPS *q_u,
@@ -3494,6 +3540,17 @@ BOOL samr_io_q_lookup_rids(char *desc, SAMR_Q_LOOKUP_RIDS *q_u, prs_struct *ps,
prs_uint32("ptr ", ps, depth, &(q_u->ptr ));
prs_uint32("num_rids2", ps, depth, &(q_u->num_rids2));
+ if (q_u->num_rids2 != 0)
+ {
+ q_u->rid = Realloc(q_u->rid, sizeof(q_u->rid[0]) *
+ q_u->num_rids2);
+ if (q_u->rid == NULL)
+ {
+ samr_free_q_lookup_rids(q_u);
+ return False;
+ }
+ }
+
for (i = 0; i < q_u->num_rids2; i++)
{
prs_grow(ps);
@@ -3503,9 +3560,27 @@ BOOL samr_io_q_lookup_rids(char *desc, SAMR_Q_LOOKUP_RIDS *q_u, prs_struct *ps,
prs_align(ps);
+ if (!ps->io)
+ {
+ /* storing. don't need memory any more */
+ samr_free_q_lookup_rids(q_u);
+ }
+
return True;
}
+/*******************************************************************
+frees a structure.
+********************************************************************/
+void samr_free_q_lookup_rids(SAMR_Q_LOOKUP_RIDS *q_u)
+{
+ if (q_u->rid != NULL)
+ {
+ free(q_u->rid);
+ q_u->rid = NULL;
+ }
+}
+
/*******************************************************************
makes a SAMR_R_LOOKUP_RIDS structure.
@@ -3666,7 +3741,7 @@ BOOL samr_io_r_lookup_rids(char *desc, SAMR_R_LOOKUP_RIDS *r_u, prs_struct *ps,
}
/*******************************************************************
-reads or writes a structure.
+frees a structure.
********************************************************************/
void samr_free_r_lookup_rids(SAMR_R_LOOKUP_RIDS *r_u)
{