r9290: Some error path cleanups found by Coverity. Whitespace reformatting.
[kai/samba.git] / source / smbd / lanman.c
index 7d5e0f5ad2a76771d1c90c4b27068b6652f705eb..0666fe8913e8929fcb9dee0a0243ccef497328cd 100644 (file)
 
 #include "includes.h"
 
+extern struct current_user current_user;
+extern userdom_struct current_user_info;
+
 #ifdef CHECK_TYPES
 #undef CHECK_TYPES
 #endif
 #define CHECK_TYPES 0
 
-extern fstring local_machine;
-
 #define NERR_Success 0
 #define NERR_badpass 86
 #define NERR_notsupported 50
@@ -331,12 +332,12 @@ static int package(struct pack_desc* p, ...)
 
 static void PACKI(struct pack_desc* desc, const char *t,int v)
 {
-  PACK(desc,t,v);
+       PACK(desc,t,v);
 }
 
 static void PACKS(struct pack_desc* desc,const char *t,const char *v)
 {
-  PACK(desc,t,v);
+       PACK(desc,t,v);
 }
 
 
@@ -345,51 +346,56 @@ static void PACKS(struct pack_desc* desc,const char *t,const char *v)
   ****************************************************************************/
 static void PackDriverData(struct pack_desc* desc)
 {
-  char drivdata[4+4+32];
-  SIVAL(drivdata,0,sizeof drivdata); /* cb */
-  SIVAL(drivdata,4,1000);      /* lVersion */
-  memset(drivdata+8,0,32);     /* szDeviceName */
-  push_ascii(drivdata+8,"NULL",-1, STR_TERMINATE);
-  PACKl(desc,"l",drivdata,sizeof drivdata); /* pDriverData */
+       char drivdata[4+4+32];
+       SIVAL(drivdata,0,sizeof drivdata); /* cb */
+       SIVAL(drivdata,4,1000); /* lVersion */
+       memset(drivdata+8,0,32);        /* szDeviceName */
+       push_ascii(drivdata+8,"NULL",-1, STR_TERMINATE);
+       PACKl(desc,"l",drivdata,sizeof drivdata); /* pDriverData */
 }
 
 static int check_printq_info(struct pack_desc* desc,
-                            int uLevel, char *id1, char *id2)
+                               unsigned int uLevel, char *id1, char *id2)
 {
-  desc->subformat = NULL;
-  switch( uLevel ) {
-  case 0:
-    desc->format = "B13";
-    break;
-  case 1:
-    desc->format = "B13BWWWzzzzzWW";
-    break;
-  case 2:
-    desc->format = "B13BWWWzzzzzWN";
-    desc->subformat = "WB21BB16B10zWWzDDz";
-    break;
-  case 3:
-    desc->format = "zWWWWzzzzWWzzl";
-    break;
-  case 4:
-    desc->format = "zWWWWzzzzWNzzl";
-    desc->subformat = "WWzWWDDzz";
-    break;
-  case 5:
-    desc->format = "z";
-    break;
-  case 51:
-    desc->format = "K";
-    break;
-  case 52:
-    desc->format = "WzzzzzzzzN";
-    desc->subformat = "z";
-    break;
-  default: return False;
-  }
-  if (strcmp(desc->format,id1) != 0) return False;
-  if (desc->subformat && strcmp(desc->subformat,id2) != 0) return False;
-  return True;
+       desc->subformat = NULL;
+       switch( uLevel ) {
+               case 0:
+                       desc->format = "B13";
+                       break;
+               case 1:
+                       desc->format = "B13BWWWzzzzzWW";
+                       break;
+               case 2:
+                       desc->format = "B13BWWWzzzzzWN";
+                       desc->subformat = "WB21BB16B10zWWzDDz";
+                       break;
+               case 3:
+                       desc->format = "zWWWWzzzzWWzzl";
+                       break;
+               case 4:
+                       desc->format = "zWWWWzzzzWNzzl";
+                       desc->subformat = "WWzWWDDzz";
+                       break;
+               case 5:
+                       desc->format = "z";
+                       break;
+               case 51:
+                       desc->format = "K";
+                       break;
+               case 52:
+                       desc->format = "WzzzzzzzzN";
+                       desc->subformat = "z";
+                       break;
+               default:
+                       return False;
+       }
+       if (strcmp(desc->format,id1) != 0) {
+               return False;
+       }
+       if (desc->subformat && strcmp(desc->subformat,id2) != 0) {
+               return False;
+       }
+       return True;
 }
 
 
@@ -720,7 +726,7 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn,
        char *str2 = skip_string(str1,1);
        char *p = skip_string(str2,1);
        char *QueueName = p;
-       int uLevel;
+       unsigned int uLevel;
        int count=0;
        int snum;
        char* str3;
@@ -753,7 +759,7 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn,
                 */
                *rdata_len = 0;
                *rparam_len = 6;
-               *rparam = REALLOC(*rparam,*rparam_len);
+               *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
                SSVALS(*rparam,0,ERRunknownlevel);
                SSVAL(*rparam,2,0);
                SSVAL(*rparam,4,0);
@@ -772,7 +778,7 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn,
        }
 
        if (mdrcnt > 0) {
-               *rdata = REALLOC(*rdata,mdrcnt);
+               *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
                desc.base = *rdata;
                desc.buflen = mdrcnt;
        } else {
@@ -781,7 +787,7 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn,
                 * init_package will return wrong size if buflen=0
                 */
                desc.buflen = getlen(desc.format);
-               desc.base = tmpdata = (char *) malloc (desc.buflen);
+               desc.base = tmpdata = (char *) SMB_MALLOC (desc.buflen);
        }
 
        if (init_package(&desc,1,count)) {
@@ -801,7 +807,7 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn,
  
        *rdata_len = desc.usedlen;
        *rparam_len = 6;
-       *rparam = REALLOC(*rparam,*rparam_len);
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,desc.neededlen);
@@ -823,134 +829,169 @@ static BOOL api_DosPrintQEnum(connection_struct *conn, uint16 vuid, char* param,
                              char **rdata, char** rparam,
                              int *rdata_len, int *rparam_len)
 {
-  char *param_format = param+2;
-  char *output_format1 = skip_string(param_format,1);
-  char *p = skip_string(output_format1,1);
-  int uLevel = SVAL(p,0);
-  char *output_format2 = p + 4;
-  int services = lp_numservices();
-  int i, n;
-  struct pack_desc desc;
-  print_queue_struct **queue = NULL;
-  print_status_struct *status = NULL;
-  int* subcntarr = NULL;
-  int queuecnt, subcnt=0, succnt=0;
+       char *param_format = param+2;
+       char *output_format1 = skip_string(param_format,1);
+       char *p = skip_string(output_format1,1);
+       unsigned int uLevel = SVAL(p,0);
+       char *output_format2 = p + 4;
+       int services = lp_numservices();
+       int i, n;
+       struct pack_desc desc;
+       print_queue_struct **queue = NULL;
+       print_status_struct *status = NULL;
+       int *subcntarr = NULL;
+       int queuecnt = 0, subcnt = 0, succnt = 0;
  
-  memset((char *)&desc,'\0',sizeof(desc));
+       memset((char *)&desc,'\0',sizeof(desc));
 
-  DEBUG(3,("DosPrintQEnum uLevel=%d\n",uLevel));
+       DEBUG(3,("DosPrintQEnum uLevel=%d\n",uLevel));
  
-  if (!prefix_ok(param_format,"WrLeh")) return False;
-  if (!check_printq_info(&desc,uLevel,output_format1,output_format2)) {
-    /*
-     * Patch from Scott Moomaw <scott@bridgewater.edu>
-     * to return the 'invalid info level' error if an
-     * unknown level was requested.
-     */
-    *rdata_len = 0;
-    *rparam_len = 6;
-    *rparam = REALLOC(*rparam,*rparam_len);
-    SSVALS(*rparam,0,ERRunknownlevel);
-    SSVAL(*rparam,2,0);
-    SSVAL(*rparam,4,0);
-    return(True);
-  }
+       if (!prefix_ok(param_format,"WrLeh")) {
+               return False;
+       }
+       if (!check_printq_info(&desc,uLevel,output_format1,output_format2)) {
+               /*
+                * Patch from Scott Moomaw <scott@bridgewater.edu>
+                * to return the 'invalid info level' error if an
+                * unknown level was requested.
+                */
+               *rdata_len = 0;
+               *rparam_len = 6;
+               *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+               SSVALS(*rparam,0,ERRunknownlevel);
+               SSVAL(*rparam,2,0);
+               SSVAL(*rparam,4,0);
+               return(True);
+       }
 
-  queuecnt = 0;
-  for (i = 0; i < services; i++)
-    if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i))
-      queuecnt++;
-  if (uLevel > 0) {
-    if((queue = (print_queue_struct**)malloc(queuecnt*sizeof(print_queue_struct*))) == NULL) {
-      DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
-      return False;
-    }
-    memset(queue,0,queuecnt*sizeof(print_queue_struct*));
-    if((status = (print_status_struct*)malloc(queuecnt*sizeof(print_status_struct))) == NULL) {
-      DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
-      return False;
-    }
-    memset(status,0,queuecnt*sizeof(print_status_struct));
-    if((subcntarr = (int*)malloc(queuecnt*sizeof(int))) == NULL) {
-      DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
-      return False;
-    }
-    subcnt = 0;
-    n = 0;
-    for (i = 0; i < services; i++)
-      if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
-       subcntarr[n] = print_queue_status(i, &queue[n],&status[n]);
-       subcnt += subcntarr[n];
-       n++;
-      }
-  }
-  if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
-  desc.base = *rdata;
-  desc.buflen = mdrcnt;
+       for (i = 0; i < services; i++) {
+               if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
+                       queuecnt++;
+               }
+       }
 
-  if (init_package(&desc,queuecnt,subcnt)) {
-    n = 0;
-    succnt = 0;
-    for (i = 0; i < services; i++)
-      if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
-       fill_printq_info(conn,i,uLevel,&desc,subcntarr[n],queue[n],&status[n]);
-       n++;
-       if (desc.errcode == NERR_Success) succnt = n;
-      }
-  }
+       if((queue = SMB_MALLOC_ARRAY(print_queue_struct*, queuecnt)) == NULL) {
+               DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
+               goto err;
+       }
+       memset(queue,0,queuecnt*sizeof(print_queue_struct*));
+       if((status = SMB_MALLOC_ARRAY(print_status_struct,queuecnt)) == NULL) {
+               DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
+               goto err;
+       }
+       memset(status,0,queuecnt*sizeof(print_status_struct));
+       if((subcntarr = SMB_MALLOC_ARRAY(int,queuecnt)) == NULL) {
+               DEBUG(0,("api_DosPrintQEnum: malloc fail !\n"));
+               goto err;
+       }
+
+       subcnt = 0;
+       n = 0;
+       for (i = 0; i < services; i++) {
+               if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
+                       subcntarr[n] = print_queue_status(i, &queue[n],&status[n]);
+                       subcnt += subcntarr[n];
+                       n++;
+               }
+       }
+
+       if (mdrcnt > 0) {
+               *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       goto err;
+               }
+       }
+       desc.base = *rdata;
+       desc.buflen = mdrcnt;
+
+       if (init_package(&desc,queuecnt,subcnt)) {
+               n = 0;
+               succnt = 0;
+               for (i = 0; i < services; i++) {
+                       if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i)) {
+                               fill_printq_info(conn,i,uLevel,&desc,subcntarr[n],queue[n],&status[n]);
+                               n++;
+                               if (desc.errcode == NERR_Success) {
+                                       succnt = n;
+                               }
+                       }
+               }
+       }
 
-  SAFE_FREE(subcntarr);
+       SAFE_FREE(subcntarr);
  
-  *rdata_len = desc.usedlen;
-  *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
-  SSVALS(*rparam,0,desc.errcode);
-  SSVAL(*rparam,2,0);
-  SSVAL(*rparam,4,succnt);
-  SSVAL(*rparam,6,queuecnt);
+       *rdata_len = desc.usedlen;
+       *rparam_len = 8;
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               goto err;
+       }
+       SSVALS(*rparam,0,desc.errcode);
+       SSVAL(*rparam,2,0);
+       SSVAL(*rparam,4,succnt);
+       SSVAL(*rparam,6,queuecnt);
   
-  for (i = 0; i < queuecnt; i++) {
-    if (queue) SAFE_FREE(queue[i]);
-  }
+       for (i = 0; i < queuecnt; i++) {
+               if (queue) {
+                       SAFE_FREE(queue[i]);
+               }
+       }
 
-  SAFE_FREE(queue);
-  SAFE_FREE(status);
+       SAFE_FREE(queue);
+       SAFE_FREE(status);
   
-  return True;
+       return True;
+
+  err:
+
+       SAFE_FREE(subcntarr);
+       for (i = 0; i < queuecnt; i++) {
+               if (queue) {
+                       SAFE_FREE(queue[i]);
+               }
+       }
+       SAFE_FREE(queue);
+       SAFE_FREE(status);
+
+       return False;
 }
 
 /****************************************************************************
-  get info level for a server list query
-  ****************************************************************************/
+ Get info level for a server list query.
+****************************************************************************/
+
 static BOOL check_server_info(int uLevel, char* id)
 {
-  switch( uLevel ) {
-  case 0:
-    if (strcmp(id,"B16") != 0) return False;
-    break;
-  case 1:
-    if (strcmp(id,"B16BBDz") != 0) return False;
-    break;
-  default: 
-    return False;
-  }
-  return True;
+       switch( uLevel ) {
+               case 0:
+                       if (strcmp(id,"B16") != 0) {
+                               return False;
+                       }
+                       break;
+               case 1:
+                       if (strcmp(id,"B16BBDz") != 0) {
+                               return False;
+                       }
+                       break;
+               default: 
+                       return False;
+       }
+       return True;
 }
 
-struct srv_info_struct
-{
-  fstring name;
-  uint32 type;
-  fstring comment;
-  fstring domain;
-  BOOL server_added;
+struct srv_info_struct {
+       fstring name;
+       uint32 type;
+       fstring comment;
+       fstring domain;
+       BOOL server_added;
 };
 
-
 /*******************************************************************
-  get server info lists from the files saved by nmbd. Return the
-  number of entries
-  ******************************************************************/
+ Get server info lists from the files saved by nmbd. Return the
+ number of entries.
+******************************************************************/
+
 static int get_server_info(uint32 servertype, 
                           struct srv_info_struct **servers,
                           const char *domain)
@@ -987,8 +1028,7 @@ static int get_server_info(uint32 servertype,
       struct srv_info_struct *ts;
       
       alloced += 10;
-      ts = (struct srv_info_struct *)
-       Realloc(*servers,sizeof(**servers)*alloced);
+      ts = SMB_REALLOC_ARRAY(*servers,struct srv_info_struct, alloced);
       if (!ts) {
        DEBUG(0,("get_server_info: failed to enlarge servers info struct!\n"));
        return(0);
@@ -1059,10 +1099,10 @@ static int get_server_info(uint32 servertype,
   return(count);
 }
 
-
 /*******************************************************************
-  fill in a server info structure
-  ******************************************************************/
+ Fill in a server info structure.
+******************************************************************/
+
 static int fill_srv_info(struct srv_info_struct *service, 
                         int uLevel, char **buf, int *buflen, 
                         char **stringbuf, int *stringspace, char *baseaddr)
@@ -1141,13 +1181,14 @@ static int fill_srv_info(struct srv_info_struct *service,
 
 static BOOL srv_comp(struct srv_info_struct *s1,struct srv_info_struct *s2)
 {
-  return(strcmp(s1->name,s2->name));
+       return(strcmp(s1->name,s2->name));
 }
 
 /****************************************************************************
-  view list of servers available (or possibly domains). The info is
-  extracted from lists saved by nmbd on the local host
-  ****************************************************************************/
+ View list of servers available (or possibly domains). The info is
+ extracted from lists saved by nmbd on the local host.
+****************************************************************************/
+
 static BOOL api_RNetServerEnum(connection_struct *conn, uint16 vuid, char *param, char *data,
                               int mdrcnt, int mprcnt, char **rdata, 
                               char **rparam, int *rdata_len, int *rparam_len)
@@ -1234,7 +1275,7 @@ static BOOL api_RNetServerEnum(connection_struct *conn, uint16 vuid, char *param
   }
 
   *rdata_len = fixed_len + string_len;
-  *rdata = REALLOC(*rdata,*rdata_len);
+  *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
   memset(*rdata,'\0',*rdata_len);
   
   p2 = (*rdata) + fixed_len;   /* auxilliary data (strings) will go here */
@@ -1258,7 +1299,7 @@ static BOOL api_RNetServerEnum(connection_struct *conn, uint16 vuid, char *param
   }
   
   *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVAL(*rparam,0,(missed == 0 ? NERR_Success : ERRmoredata));
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,counted);
@@ -1275,6 +1316,7 @@ static BOOL api_RNetServerEnum(connection_struct *conn, uint16 vuid, char *param
 /****************************************************************************
   command 0x34 - suspected of being a "Lookup Names" stub api
   ****************************************************************************/
+
 static BOOL api_RNetGroupGetUsers(connection_struct *conn, uint16 vuid, char *param, char *data,
                               int mdrcnt, int mprcnt, char **rdata, 
                               char **rparam, int *rdata_len, int *rparam_len)
@@ -1295,7 +1337,7 @@ static BOOL api_RNetGroupGetUsers(connection_struct *conn, uint16 vuid, char *pa
   *rdata_len = 0;
   
   *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
   SSVAL(*rparam,0,0x08AC); /* informational warning message */
   SSVAL(*rparam,2,0);
@@ -1308,6 +1350,7 @@ static BOOL api_RNetGroupGetUsers(connection_struct *conn, uint16 vuid, char *pa
 /****************************************************************************
   get info about a share
   ****************************************************************************/
+
 static BOOL check_share_info(int uLevel, char* id)
 {
   switch( uLevel ) {
@@ -1441,13 +1484,13 @@ static BOOL api_RNetShareGetInfo(connection_struct *conn,uint16 vuid, char *para
   if (!prefix_ok(str1,"zWrLh")) return False;
   if (!check_share_info(uLevel,str2)) return False;
  
-  *rdata = REALLOC(*rdata,mdrcnt);
+  *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
   p = *rdata;
   *rdata_len = fill_share_info(conn,snum,uLevel,&p,&mdrcnt,0,0,0);
   if (*rdata_len < 0) return False;
  
   *rparam_len = 6;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVAL(*rparam,0,NERR_Success);
   SSVAL(*rparam,2,0);          /* converter word */
   SSVAL(*rparam,4,*rdata_len);
@@ -1464,6 +1507,7 @@ static BOOL api_RNetShareGetInfo(connection_struct *conn,uint16 vuid, char *para
   twelve byte strings for share names (plus one for a nul terminator).
   Share names longer than 12 bytes must be skipped.
  ****************************************************************************/
+
 static BOOL api_RNetShareEnum( connection_struct *conn,
                                uint16             vuid,
                                char              *param,
@@ -1514,7 +1558,7 @@ static BOOL api_RNetShareEnum( connection_struct *conn,
     }
   }
   *rdata_len = fixed_len + string_len;
-  *rdata = REALLOC(*rdata,*rdata_len);
+  *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
   memset(*rdata,0,*rdata_len);
   
   p2 = (*rdata) + fixed_len;   /* auxiliary data (strings) will go here */
@@ -1537,7 +1581,7 @@ static BOOL api_RNetShareEnum( connection_struct *conn,
     }
   
   *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVAL(*rparam,0,missed ? ERRmoredata : NERR_Success);
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,counted);
@@ -1547,11 +1591,12 @@ static BOOL api_RNetShareEnum( connection_struct *conn,
           counted,total,uLevel,
           buf_len,*rdata_len,mdrcnt));
   return(True);
-} /* api_RNetShareEnum */
+}
 
 /****************************************************************************
   Add a share
   ****************************************************************************/
+
 static BOOL api_RNetShareAdd(connection_struct *conn,uint16 vuid, char *param,char *data,
                                 int mdrcnt,int mprcnt,
                                 char **rdata,char **rparam,
@@ -1623,7 +1668,7 @@ static BOOL api_RNetShareAdd(connection_struct *conn,uint16 vuid, char *param,ch
   } else return False;
 
   *rparam_len = 6;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVAL(*rparam,0,NERR_Success);
   SSVAL(*rparam,2,0);          /* converter word */
   SSVAL(*rparam,4,*rdata_len);
@@ -1633,17 +1678,17 @@ static BOOL api_RNetShareAdd(connection_struct *conn,uint16 vuid, char *param,ch
 
  error_exit:
   *rparam_len = 4;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   *rdata_len = 0;
   SSVAL(*rparam,0,res);
   SSVAL(*rparam,2,0);
   return True;
-
 }
 
 /****************************************************************************
   view list of groups available
   ****************************************************************************/
+
 static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,char *data,
                              int mdrcnt,int mprcnt,
                              char **rdata,char **rparam,
@@ -1655,9 +1700,10 @@ static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,c
        char *str1 = param+2;
        char *str2 = skip_string(str1,1);
        char *p = skip_string(str2,1);
-       BOOL ret;
 
-       GROUP_MAP *group_list;
+       struct pdb_search *search;
+       struct samr_displayentry *entries;
+
        int num_entries;
  
        if (strcmp(str1,"WrLeh") != 0)
@@ -1675,30 +1721,39 @@ static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,c
 
        /* get list of domain groups SID_DOMAIN_GRP=2 */
        become_root();
-       ret = pdb_enum_group_mapping(SID_NAME_DOM_GRP , &group_list, &num_entries, False);
+       search = pdb_search_groups();
        unbecome_root();
-       
-       if( !ret ) {
-               DEBUG(3,("api_RNetGroupEnum:failed to get group list"));        
+
+       if (search == NULL) {
+               DEBUG(3,("api_RNetGroupEnum:failed to get group list"));
                return False;
        }
 
        resume_context = SVAL(p,0); 
        cli_buf_size=SVAL(p+2,0);
-       DEBUG(10,("api_RNetGroupEnum:resume context: %d, client buffer size: %d\n", resume_context, cli_buf_size));
+       DEBUG(10,("api_RNetGroupEnum:resume context: %d, client buffer size: "
+                 "%d\n", resume_context, cli_buf_size));
+
+       become_root();
+       num_entries = pdb_search_entries(search, resume_context, 0xffffffff,
+                                        &entries);
+       unbecome_root();
 
        *rdata_len = cli_buf_size;
-       *rdata = REALLOC(*rdata,*rdata_len);
+       *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
 
        p = *rdata;
 
-       for(i=resume_context; i<num_entries; i++) {     
-               char* name=group_list[i].nt_name;
+       for(i=0; i<num_entries; i++) {
+               fstring name;
+               fstrcpy(name, entries[i].account_name);
                if( ((PTR_DIFF(p,*rdata)+21) <= *rdata_len) ) {
                        /* truncate the name at 21 chars. */
                        memcpy(p, name, 21); 
                        DEBUG(10,("adding entry %d group %s\n", i, p));
-                       p += 21; 
+                       p += 21;
+                       p += 5; /* Both NT4 and W2k3SP1 do padding here.
+                                  No idea why... */
                } else {
                        /* set overflow error */
                        DEBUG(3,("overflow on entry %d group %s\n", i, name));
@@ -1707,22 +1762,25 @@ static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,c
                }
        }
 
+       pdb_search_destroy(search);
+
        *rdata_len = PTR_DIFF(p,*rdata);
 
        *rparam_len = 8;
-       *rparam = REALLOC(*rparam,*rparam_len);
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
        SSVAL(*rparam, 0, errflags);
        SSVAL(*rparam, 2, 0);           /* converter word */
-       SSVAL(*rparam, 4, i-resume_context);    /* is this right?? */
-       SSVAL(*rparam, 6, num_entries); /* is this right?? */
+       SSVAL(*rparam, 4, i);   /* is this right?? */
+       SSVAL(*rparam, 6, resume_context+num_entries);  /* is this right?? */
 
        return(True);
 }
 
 /*******************************************************************
-  get groups that a user is a member of
-  ******************************************************************/
+ Get groups that a user is a member of.
+******************************************************************/
+
 static BOOL api_NetUserGetGroups(connection_struct *conn,uint16 vuid, char *param,char *data,
                              int mdrcnt,int mprcnt,
                              char **rdata,char **rparam,
@@ -1748,7 +1806,7 @@ static BOOL api_NetUserGetGroups(connection_struct *conn,uint16 vuid, char *para
        NTSTATUS result;
 
        *rparam_len = 8;
-       *rparam = REALLOC(*rparam,*rparam_len);
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   
        /* check it's a supported varient */
        
@@ -1767,7 +1825,7 @@ static BOOL api_NetUserGetGroups(connection_struct *conn,uint16 vuid, char *para
                return False;
 
        *rdata_len = mdrcnt + 1024;
-       *rdata = REALLOC(*rdata,*rdata_len);
+       *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
 
        SSVAL(*rparam,0,NERR_Success);
        SSVAL(*rparam,2,0);             /* converter word */
@@ -1827,18 +1885,20 @@ out:
 }
 
 /*******************************************************************
-  get all users 
-  ******************************************************************/
+ Get all users.
+******************************************************************/
+
 static BOOL api_RNetUserEnum(connection_struct *conn,uint16 vuid, char *param,char *data,
                                 int mdrcnt,int mprcnt,
                                 char **rdata,char **rparam,
                                 int *rdata_len,int *rparam_len)
 {
-       SAM_ACCOUNT  *pwd=NULL;
        int count_sent=0;
-       int count_total=0;
+       int num_users=0;
        int errflags=0;
-       int resume_context, cli_buf_size;
+       int i, resume_context, cli_buf_size;
+       struct pdb_search *search;
+       struct samr_displayentry *users;
 
        char *str1 = param+2;
        char *str2 = skip_string(str1,1);
@@ -1856,72 +1916,70 @@ static BOOL api_RNetUserEnum(connection_struct *conn,uint16 vuid, char *param,ch
   
        resume_context = SVAL(p,0);
        cli_buf_size=SVAL(p+2,0);
-       DEBUG(10,("api_RNetUserEnum:resume context: %d, client buffer size: %d\n", resume_context, cli_buf_size));
+       DEBUG(10,("api_RNetUserEnum:resume context: %d, client buffer size: %d\n",
+                       resume_context, cli_buf_size));
 
        *rparam_len = 8;
-       *rparam = REALLOC(*rparam,*rparam_len);
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
        /* check it's a supported varient */
        if (strcmp("B21",str2) != 0)
                return False;
 
        *rdata_len = cli_buf_size;
-       *rdata = REALLOC(*rdata,*rdata_len);
+       *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
 
        p = *rdata;
 
-       /* to get user list enumerations for NetUserEnum in B21 format */
-       pdb_init_sam(&pwd);
-       
-       /* Open the passgrp file - not for update. */
        become_root();
-       if(!pdb_setsampwent(False)) {
+       search = pdb_search_users(ACB_NORMAL);
+       unbecome_root();
+       if (search == NULL) {
                DEBUG(0, ("api_RNetUserEnum:unable to open sam database.\n"));
-               unbecome_root();
                return False;
        }
-       errflags=NERR_Success;
 
-       while ( pdb_getsampwent(pwd) ) {
-               const char *name=pdb_get_username(pwd); 
-               if ((name) && (*(name+strlen(name)-1)!='$')) { 
-                       count_total++;
-                       if(count_total>=resume_context) {
-                               if( ((PTR_DIFF(p,*rdata)+21)<=*rdata_len)&&(strlen(name)<=21)  ) {
-                                       pstrcpy(p,name); 
-                                       DEBUG(10,("api_RNetUserEnum:adding entry %d username %s\n",count_sent,p));
-                                       p += 21; 
-                                       count_sent++; 
-                               } else {
-                                       /* set overflow error */
-                                       DEBUG(10,("api_RNetUserEnum:overflow on entry %d username %s\n",count_sent,name));
-                                       errflags=234;
-                                       break;
-                               }
-                       }
-               }       
-       } ;
-
-       pdb_endsampwent();
+       become_root();
+       num_users = pdb_search_entries(search, resume_context, 0xffffffff,
+                                      &users);
        unbecome_root();
 
-       pdb_free_sam(&pwd);
+       errflags=NERR_Success;
+
+       for (i=0; i<num_users; i++) {
+               const char *name = users[i].account_name;
+               
+               if(((PTR_DIFF(p,*rdata)+21)<=*rdata_len)&&(strlen(name)<=21)) {
+                       pstrcpy(p,name); 
+                       DEBUG(10,("api_RNetUserEnum:adding entry %d username "
+                                 "%s\n",count_sent,p));
+                       p += 21; 
+                       count_sent++; 
+               } else {
+                       /* set overflow error */
+                       DEBUG(10,("api_RNetUserEnum:overflow on entry %d "
+                                 "username %s\n",count_sent,name));
+                       errflags=234;
+                       break;
+               }
+       }
+
+       pdb_search_destroy(search);
 
        *rdata_len = PTR_DIFF(p,*rdata);
 
        SSVAL(*rparam,0,errflags);
        SSVAL(*rparam,2,0);           /* converter word */
        SSVAL(*rparam,4,count_sent);  /* is this right?? */
-       SSVAL(*rparam,6,count_total); /* is this right?? */
+       SSVAL(*rparam,6,num_users); /* is this right?? */
 
        return True;
 }
 
-
-
 /****************************************************************************
-  get the time of day info
-  ****************************************************************************/
+ Get the time of day info.
+****************************************************************************/
+
 static BOOL api_NetRemoteTOD(connection_struct *conn,uint16 vuid, char *param,char *data,
                             int mdrcnt,int mprcnt,
                             char **rdata,char **rparam,
@@ -1929,10 +1987,10 @@ static BOOL api_NetRemoteTOD(connection_struct *conn,uint16 vuid, char *param,ch
 {
   char *p;
   *rparam_len = 4;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
   *rdata_len = 21;
-  *rdata = REALLOC(*rdata,*rdata_len);
+  *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
 
   SSVAL(*rparam,0,NERR_Success);
   SSVAL(*rparam,2,0);          /* converter word */
@@ -1963,8 +2021,6 @@ static BOOL api_NetRemoteTOD(connection_struct *conn,uint16 vuid, char *param,ch
     SSVAL(p,18,1900+t->tm_year);
     SCVAL(p,20,t->tm_wday);
   }
-
-
   return(True);
 }
 
@@ -1991,7 +2047,7 @@ static BOOL api_SetUserPassword(connection_struct *conn,uint16 vuid, char *param
        memcpy(pass2,p+16,16);
 
        *rparam_len = 4;
-       *rparam = REALLOC(*rparam,*rparam_len);
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
        *rdata_len = 0;
 
@@ -2063,7 +2119,7 @@ static BOOL api_SamOEMChangePassword(connection_struct *conn,uint16 vuid, char *
        fstring user;
        char *p = param + 2;
        *rparam_len = 2;
-       *rparam = REALLOC(*rparam,*rparam_len);
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
        *rdata_len = 0;
 
@@ -2106,6 +2162,7 @@ static BOOL api_SamOEMChangePassword(connection_struct *conn,uint16 vuid, char *
   delete a print job
   Form: <W> <> 
   ****************************************************************************/
+
 static BOOL api_RDosPrintJobDel(connection_struct *conn,uint16 vuid, char *param,char *data,
                                int mdrcnt,int mprcnt,
                                char **rdata,char **rparam,
@@ -2119,7 +2176,6 @@ static BOOL api_RDosPrintJobDel(connection_struct *conn,uint16 vuid, char *param
        int snum;
        fstring sharename;
        int errcode;
-       extern struct current_user current_user;
        WERROR werr = WERR_OK;
 
        if(!rap_to_pjobid(SVAL(p,0), sharename, &jobid))
@@ -2130,7 +2186,7 @@ static BOOL api_RDosPrintJobDel(connection_struct *conn,uint16 vuid, char *param
                return(False);
 
        *rparam_len = 4;
-       *rparam = REALLOC(*rparam,*rparam_len); 
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);       
        *rdata_len = 0;
 
        if (!print_job_exists(sharename, jobid)) {
@@ -2174,6 +2230,7 @@ static BOOL api_RDosPrintJobDel(connection_struct *conn,uint16 vuid, char *param
 /****************************************************************************
   Purge a print queue - or pause or resume it.
   ****************************************************************************/
+
 static BOOL api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid, char *param,char *data,
                                 int mdrcnt,int mprcnt,
                                 char **rdata,char **rparam,
@@ -2186,14 +2243,13 @@ static BOOL api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid, char *param
        int errcode = NERR_notsupported;
        int snum;
        WERROR werr = WERR_OK;
-       extern struct current_user current_user;
 
        /* check it's a supported varient */
        if (!(strcsequal(str1,"z") && strcsequal(str2,"")))
                return(False);
 
        *rparam_len = 4;
-       *rparam = REALLOC(*rparam,*rparam_len);
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
        *rdata_len = 0;
 
        snum = print_queue_snum(QueueName);
@@ -2224,7 +2280,6 @@ static BOOL api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid, char *param
        return(True);
 }
 
-
 /****************************************************************************
   set the property of a print job (undocumented?)
   ? function = 0xb -> set name of print job
@@ -2232,6 +2287,7 @@ static BOOL api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid, char *param
   Form: <WWsTP> <WWzWWDDzzzzzzzzzzlz> 
   or   <WWsTP> <WB21BB16B10zWWzDDz> 
 ****************************************************************************/
+
 static int check_printjob_info(struct pack_desc* desc,
                               int uLevel, char* id)
 {
@@ -2267,7 +2323,7 @@ static BOOL api_PrintJobInfo(connection_struct *conn,uint16 vuid,char *param,cha
        if(!rap_to_pjobid(SVAL(p,0), sharename, &jobid))
                return False;
        *rparam_len = 4;
-       *rparam = REALLOC(*rparam,*rparam_len);
+       *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
        if ( (snum = lp_servicenumber(sharename)) == -1 ) {
                DEBUG(0,("api_PrintJobInfo: unable to get service number from sharename [%s]\n",
@@ -2319,8 +2375,9 @@ static BOOL api_PrintJobInfo(connection_struct *conn,uint16 vuid,char *param,cha
 
 
 /****************************************************************************
-  get info about the server
-  ****************************************************************************/
+ Get info about the server.
+****************************************************************************/
+
 static BOOL api_RNetServerGetInfo(connection_struct *conn,uint16 vuid, char *param,char *data,
                                  int mdrcnt,int mprcnt,
                                  char **rdata,char **rparam,
@@ -2368,12 +2425,12 @@ static BOOL api_RNetServerGetInfo(connection_struct *conn,uint16 vuid, char *par
   }
 
   *rdata_len = mdrcnt;
-  *rdata = REALLOC(*rdata,*rdata_len);
+  *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
 
   p = *rdata;
   p2 = p + struct_len;
   if (uLevel != 20) {
-    srvstr_push(NULL, p,local_machine,16, 
+    srvstr_push(NULL, p,get_local_machine_name(),16, 
                STR_ASCII|STR_UPPER|STR_TERMINATE);
   }
   p += 16;
@@ -2388,7 +2445,7 @@ static BOOL api_RNetServerGetInfo(connection_struct *conn,uint16 vuid, char *par
 
       if ((count=get_server_info(SV_TYPE_ALL,&servers,lp_workgroup()))>0) {
        for (i=0;i<count;i++) {
-         if (strequal(servers[i].name,local_machine)) {
+         if (strequal(servers[i].name,get_local_machine_name())) {
            servertype = servers[i].type;
            push_ascii(comment,servers[i].comment,sizeof(pstring),STR_TERMINATE);           
          }
@@ -2417,7 +2474,7 @@ static BOOL api_RNetServerGetInfo(connection_struct *conn,uint16 vuid, char *par
   *rdata_len = PTR_DIFF(p2,*rdata);
 
   *rparam_len = 6;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVAL(*rparam,0,NERR_Success);
   SSVAL(*rparam,2,0);          /* converter word */
   SSVAL(*rparam,4,*rdata_len);
@@ -2425,10 +2482,10 @@ static BOOL api_RNetServerGetInfo(connection_struct *conn,uint16 vuid, char *par
   return(True);
 }
 
-
 /****************************************************************************
-  get info about the server
-  ****************************************************************************/
+ Get info about the server.
+****************************************************************************/
+
 static BOOL api_NetWkstaGetInfo(connection_struct *conn,uint16 vuid, char *param,char *data,
                                int mdrcnt,int mprcnt,
                                char **rdata,char **rparam,
@@ -2438,20 +2495,19 @@ static BOOL api_NetWkstaGetInfo(connection_struct *conn,uint16 vuid, char *param
   char *str2 = skip_string(str1,1);
   char *p = skip_string(str2,1);
   char *p2;
-  extern userdom_struct current_user_info;
   int level = SVAL(p,0);
 
   DEBUG(4,("NetWkstaGetInfo level %d\n",level));
 
   *rparam_len = 6;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
   /* check it's a supported varient */
   if (!(level==10 && strcsequal(str1,"WrLh") && strcsequal(str2,"zzzBBzz")))
     return(False);
 
   *rdata_len = mdrcnt + 1024;
-  *rdata = REALLOC(*rdata,*rdata_len);
+  *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
 
   SSVAL(*rparam,0,NERR_Success);
   SSVAL(*rparam,2,0);          /* converter word */
@@ -2461,7 +2517,7 @@ static BOOL api_NetWkstaGetInfo(connection_struct *conn,uint16 vuid, char *param
 
 
   SIVAL(p,0,PTR_DIFF(p2,*rdata)); /* host name */
-  pstrcpy(p2,local_machine);
+  pstrcpy(p2,get_local_machine_name());
   strupper_m(p2);
   p2 = skip_string(p2,1);
   p += 4;
@@ -2690,7 +2746,7 @@ static BOOL api_RNetUserGetInfo(connection_struct *conn,uint16 vuid, char *param
               vuser->user.unix_name));
 
     *rparam_len = 6;
-    *rparam = REALLOC(*rparam,*rparam_len);
+    *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
     DEBUG(4,("RNetUserGetInfo level=%d\n", uLevel));
   
@@ -2709,7 +2765,7 @@ static BOOL api_RNetUserGetInfo(connection_struct *conn,uint16 vuid, char *param
        if (strcmp(level_string,str2) != 0) return False;
 
        *rdata_len = mdrcnt + 1024;
-       *rdata = REALLOC(*rdata,*rdata_len);
+       *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
 
        SSVAL(*rparam,0,NERR_Success);
        SSVAL(*rparam,2,0);             /* converter word */
@@ -2856,7 +2912,7 @@ static BOOL api_WWkstaUserLogon(connection_struct *conn,uint16 vuid, char *param
   /* check it's a supported varient */
   if (strcmp(str1,"OOWb54WrLh") != 0) return False;
   if (uLevel != 1 || strcmp(str2,"WB21BWDWWDDDDDDDzzzD") != 0) return False;
-  if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
+  if (mdrcnt > 0) *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
   desc.base = *rdata;
   desc.buflen = mdrcnt;
   desc.subformat = NULL;
@@ -2882,7 +2938,7 @@ static BOOL api_WWkstaUserLogon(connection_struct *conn,uint16 vuid, char *param
     {
       fstring mypath;
       fstrcpy(mypath,"\\\\");
-      fstrcat(mypath,local_machine);
+      fstrcat(mypath,get_local_machine_name());
       strupper_m(mypath);
       PACKS(&desc,"z",mypath); /* computer */
     }
@@ -2895,7 +2951,7 @@ static BOOL api_WWkstaUserLogon(connection_struct *conn,uint16 vuid, char *param
 
   *rdata_len = desc.usedlen;
   *rparam_len = 6;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,desc.neededlen);
@@ -2904,10 +2960,10 @@ static BOOL api_WWkstaUserLogon(connection_struct *conn,uint16 vuid, char *param
   return(True);
 }
 
-
 /****************************************************************************
-  api_WAccessGetUserPerms
-  ****************************************************************************/
+ api_WAccessGetUserPerms
+****************************************************************************/
+
 static BOOL api_WAccessGetUserPerms(connection_struct *conn,uint16 vuid, char *param,char *data,
                                    int mdrcnt,int mprcnt,
                                    char **rdata,char **rparam,
@@ -2925,7 +2981,7 @@ static BOOL api_WAccessGetUserPerms(connection_struct *conn,uint16 vuid, char *p
   if (strcmp(str2,"") != 0) return False;
 
   *rparam_len = 6;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,0);         /* errorcode */
   SSVAL(*rparam,2,0);          /* converter word */
   SSVAL(*rparam,4,0x7f);       /* permission flags */
@@ -2936,6 +2992,7 @@ static BOOL api_WAccessGetUserPerms(connection_struct *conn,uint16 vuid, char *p
 /****************************************************************************
   api_WPrintJobEnumerate
   ****************************************************************************/
+
 static BOOL api_WPrintJobGetInfo(connection_struct *conn,uint16 vuid, char *param,char *data,
                                 int mdrcnt,int mprcnt,
                                 char **rdata,char **rparam,
@@ -2978,7 +3035,7 @@ static BOOL api_WPrintJobGetInfo(connection_struct *conn,uint16 vuid, char *para
   }
 
   if (mdrcnt > 0) {
-    *rdata = REALLOC(*rdata,mdrcnt);
+    *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
     desc.base = *rdata;
     desc.buflen = mdrcnt;
   } else {
@@ -2987,7 +3044,7 @@ static BOOL api_WPrintJobGetInfo(connection_struct *conn,uint16 vuid, char *para
      *  init_package will return wrong size if buflen=0
      */
     desc.buflen = getlen(desc.format);
-    desc.base = tmpdata = (char *)malloc ( desc.buflen );
+    desc.base = tmpdata = (char *)SMB_MALLOC( desc.buflen );
   }
 
   if (init_package(&desc,1,0)) {
@@ -3002,7 +3059,7 @@ static BOOL api_WPrintJobGetInfo(connection_struct *conn,uint16 vuid, char *para
   }
 
   *rparam_len = 6;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,desc.neededlen);
@@ -3054,7 +3111,7 @@ static BOOL api_WPrintJobEnumerate(connection_struct *conn,uint16 vuid, char *pa
     return False;
 
   count = print_queue_status(snum,&queue,&status);
-  if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
+  if (mdrcnt > 0) *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
   desc.base = *rdata;
   desc.buflen = mdrcnt;
 
@@ -3069,7 +3126,7 @@ static BOOL api_WPrintJobEnumerate(connection_struct *conn,uint16 vuid, char *pa
   *rdata_len = desc.usedlen;
 
   *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,succnt);
@@ -3162,7 +3219,7 @@ static BOOL api_WPrintDestGetInfo(connection_struct *conn,uint16 vuid, char *par
   }
   else {
     if (mdrcnt > 0) {
-      *rdata = REALLOC(*rdata,mdrcnt);
+      *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
       desc.base = *rdata;
       desc.buflen = mdrcnt;
     } else {
@@ -3171,7 +3228,7 @@ static BOOL api_WPrintDestGetInfo(connection_struct *conn,uint16 vuid, char *par
        *  init_package will return wrong size if buflen=0
        */
       desc.buflen = getlen(desc.format);
-      desc.base = tmpdata = (char *)malloc ( desc.buflen );
+      desc.base = tmpdata = (char *)SMB_MALLOC( desc.buflen );
     }
     if (init_package(&desc,1,0)) {
       fill_printdest_info(conn,snum,uLevel,&desc);
@@ -3180,7 +3237,7 @@ static BOOL api_WPrintDestGetInfo(connection_struct *conn,uint16 vuid, char *par
   }
 
   *rparam_len = 6;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,desc.neededlen);
@@ -3219,7 +3276,7 @@ static BOOL api_WPrintDestEnum(connection_struct *conn,uint16 vuid, char *param,
     if (lp_snum_ok(i) && lp_print_ok(i) && lp_browseable(i))
       queuecnt++;
 
-  if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
+  if (mdrcnt > 0) *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
   desc.base = *rdata;
   desc.buflen = mdrcnt;
   if (init_package(&desc,queuecnt,0)) {    
@@ -3237,7 +3294,7 @@ static BOOL api_WPrintDestEnum(connection_struct *conn,uint16 vuid, char *param,
   *rdata_len = desc.usedlen;
 
   *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,succnt);
@@ -3269,7 +3326,7 @@ static BOOL api_WPrintDriverEnum(connection_struct *conn,uint16 vuid, char *para
   if (strcmp(str1,"WrLeh") != 0) return False;
   if (uLevel != 0 || strcmp(str2,"B41") != 0) return False;
 
-  if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
+  if (mdrcnt > 0) *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
   desc.base = *rdata;
   desc.buflen = mdrcnt;
   if (init_package(&desc,1,0)) {
@@ -3281,7 +3338,7 @@ static BOOL api_WPrintDriverEnum(connection_struct *conn,uint16 vuid, char *para
   *rdata_len = desc.usedlen;
 
   *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,succnt);
@@ -3313,7 +3370,7 @@ static BOOL api_WPrintQProcEnum(connection_struct *conn,uint16 vuid, char *param
   if (strcmp(str1,"WrLeh") != 0) return False;
   if (uLevel != 0 || strcmp(str2,"B13") != 0) return False;
 
-  if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
+  if (mdrcnt > 0) *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
   desc.base = *rdata;
   desc.buflen = mdrcnt;
   desc.format = str2;
@@ -3326,7 +3383,7 @@ static BOOL api_WPrintQProcEnum(connection_struct *conn,uint16 vuid, char *param
   *rdata_len = desc.usedlen;
 
   *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,succnt);
@@ -3358,7 +3415,7 @@ static BOOL api_WPrintPortEnum(connection_struct *conn,uint16 vuid, char *param,
   if (strcmp(str1,"WrLeh") != 0) return False;
   if (uLevel != 0 || strcmp(str2,"B9") != 0) return False;
 
-  if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
+  if (mdrcnt > 0) *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
   memset((char *)&desc,'\0',sizeof(desc));
   desc.base = *rdata;
   desc.buflen = mdrcnt;
@@ -3372,7 +3429,7 @@ static BOOL api_WPrintPortEnum(connection_struct *conn,uint16 vuid, char *param,
   *rdata_len = desc.usedlen;
 
   *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0);
   SSVAL(*rparam,4,succnt);
@@ -3414,7 +3471,7 @@ static BOOL api_RNetSessionEnum(connection_struct *conn,uint16 vuid, char *param
 
   num_sessions = list_sessions(&session_list);
 
-  if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
+  if (mdrcnt > 0) *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
   memset((char *)&desc,'\0',sizeof(desc));
   desc.base = *rdata;
   desc.buflen = mdrcnt;
@@ -3438,7 +3495,7 @@ static BOOL api_RNetSessionEnum(connection_struct *conn,uint16 vuid, char *param
   *rdata_len = desc.usedlen;
 
   *rparam_len = 8;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0); /* converter */
   SSVAL(*rparam,4,num_sessions); /* count */
@@ -3458,7 +3515,7 @@ static BOOL api_TooSmall(connection_struct *conn,uint16 vuid, char *param,char *
                         int *rdata_len,int *rparam_len)
 {
   *rparam_len = MIN(*rparam_len,mprcnt);
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
   *rdata_len = 0;
 
@@ -3480,7 +3537,7 @@ static BOOL api_Unsupported(connection_struct *conn,uint16 vuid, char *param,cha
                            int *rdata_len,int *rparam_len)
 {
   *rparam_len = 4;
-  *rparam = REALLOC(*rparam,*rparam_len);
+  *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
 
   *rdata_len = 0;
 
@@ -3492,56 +3549,53 @@ static BOOL api_Unsupported(connection_struct *conn,uint16 vuid, char *param,cha
   return(True);
 }
 
-
-
-
-static const struct
-{
-  const char *name;
-  int id;
-  BOOL (*fn)(connection_struct *,uint16,char *,char *,
-            int,int,char **,char **,int *,int *);
-  BOOL auth_user;              /* Deny anonymous access? */
+static const struct {
+       const char *name;
+       int id;
+       BOOL (*fn)(connection_struct *,uint16,char *,char *,
+                       int,int,char **,char **,int *,int *);
+       BOOL auth_user;         /* Deny anonymous access? */
 } api_commands[] = {
-  {"RNetShareEnum",    RAP_WshareEnum,         api_RNetShareEnum, True},
-  {"RNetShareGetInfo", RAP_WshareGetInfo,      api_RNetShareGetInfo},
-  {"RNetShareAdd",     RAP_WshareAdd,          api_RNetShareAdd},
-  {"RNetSessionEnum",  RAP_WsessionEnum,       api_RNetSessionEnum, True},
-  {"RNetServerGetInfo",        RAP_WserverGetInfo,     api_RNetServerGetInfo},
-  {"RNetGroupEnum",    RAP_WGroupEnum,         api_RNetGroupEnum, True},
-  {"RNetGroupGetUsers", RAP_WGroupGetUsers,    api_RNetGroupGetUsers, True},
-  {"RNetUserEnum",     RAP_WUserEnum,          api_RNetUserEnum, True},
-  {"RNetUserGetInfo",  RAP_WUserGetInfo,       api_RNetUserGetInfo},
-  {"NetUserGetGroups", RAP_WUserGetGroups,     api_NetUserGetGroups},
-  {"NetWkstaGetInfo",  RAP_WWkstaGetInfo,      api_NetWkstaGetInfo},
-  {"DosPrintQEnum",    RAP_WPrintQEnum,        api_DosPrintQEnum, True},
-  {"DosPrintQGetInfo", RAP_WPrintQGetInfo,     api_DosPrintQGetInfo},
-  {"WPrintQueuePause",  RAP_WPrintQPause,      api_WPrintQueueCtrl},
-  {"WPrintQueueResume", RAP_WPrintQContinue,   api_WPrintQueueCtrl},
-  {"WPrintJobEnumerate",RAP_WPrintJobEnum,     api_WPrintJobEnumerate},
-  {"WPrintJobGetInfo", RAP_WPrintJobGetInfo,   api_WPrintJobGetInfo},
-  {"RDosPrintJobDel",  RAP_WPrintJobDel,       api_RDosPrintJobDel},
-  {"RDosPrintJobPause",        RAP_WPrintJobPause,     api_RDosPrintJobDel},
-  {"RDosPrintJobResume",RAP_WPrintJobContinue, api_RDosPrintJobDel},
-  {"WPrintDestEnum",   RAP_WPrintDestEnum,     api_WPrintDestEnum},
-  {"WPrintDestGetInfo",        RAP_WPrintDestGetInfo,  api_WPrintDestGetInfo},
-  {"NetRemoteTOD",     RAP_NetRemoteTOD,       api_NetRemoteTOD},
-  {"WPrintQueuePurge", RAP_WPrintQPurge,       api_WPrintQueueCtrl},
-  {"NetServerEnum",    RAP_NetServerEnum2,     api_RNetServerEnum}, /* anon OK */
-  {"WAccessGetUserPerms",RAP_WAccessGetUserPerms,api_WAccessGetUserPerms},
-  {"SetUserPassword",  RAP_WUserPasswordSet2,  api_SetUserPassword},
-  {"WWkstaUserLogon",  RAP_WWkstaUserLogon,    api_WWkstaUserLogon},
-  {"PrintJobInfo",     RAP_WPrintJobSetInfo,   api_PrintJobInfo},
-  {"WPrintDriverEnum", RAP_WPrintDriverEnum,   api_WPrintDriverEnum},
-  {"WPrintQProcEnum",  RAP_WPrintQProcessorEnum,api_WPrintQProcEnum},
-  {"WPrintPortEnum",   RAP_WPrintPortEnum,     api_WPrintPortEnum},
-  {"SamOEMChangePassword",RAP_SamOEMChgPasswordUser2_P,api_SamOEMChangePassword}, /* anon OK */
-  {NULL,               -1,     api_Unsupported}};
-
-/*  The following RAP calls are not implemented by Samba:
-
-        RAP_WFileEnum2 - anon not OK 
-*/
+       {"RNetShareEnum",       RAP_WshareEnum,         api_RNetShareEnum, True},
+       {"RNetShareGetInfo",    RAP_WshareGetInfo,      api_RNetShareGetInfo},
+       {"RNetShareAdd",        RAP_WshareAdd,          api_RNetShareAdd},
+       {"RNetSessionEnum",     RAP_WsessionEnum,       api_RNetSessionEnum, True},
+       {"RNetServerGetInfo",   RAP_WserverGetInfo,     api_RNetServerGetInfo},
+       {"RNetGroupEnum",       RAP_WGroupEnum,         api_RNetGroupEnum, True},
+       {"RNetGroupGetUsers", RAP_WGroupGetUsers,       api_RNetGroupGetUsers, True},
+       {"RNetUserEnum",        RAP_WUserEnum,          api_RNetUserEnum, True},
+       {"RNetUserGetInfo",     RAP_WUserGetInfo,       api_RNetUserGetInfo},
+       {"NetUserGetGroups",    RAP_WUserGetGroups,     api_NetUserGetGroups},
+       {"NetWkstaGetInfo",     RAP_WWkstaGetInfo,      api_NetWkstaGetInfo},
+       {"DosPrintQEnum",       RAP_WPrintQEnum,        api_DosPrintQEnum, True},
+       {"DosPrintQGetInfo",    RAP_WPrintQGetInfo,     api_DosPrintQGetInfo},
+       {"WPrintQueuePause",  RAP_WPrintQPause, api_WPrintQueueCtrl},
+       {"WPrintQueueResume", RAP_WPrintQContinue,      api_WPrintQueueCtrl},
+       {"WPrintJobEnumerate",RAP_WPrintJobEnum,        api_WPrintJobEnumerate},
+       {"WPrintJobGetInfo",    RAP_WPrintJobGetInfo,   api_WPrintJobGetInfo},
+       {"RDosPrintJobDel",     RAP_WPrintJobDel,       api_RDosPrintJobDel},
+       {"RDosPrintJobPause",   RAP_WPrintJobPause,     api_RDosPrintJobDel},
+       {"RDosPrintJobResume",RAP_WPrintJobContinue,    api_RDosPrintJobDel},
+       {"WPrintDestEnum",      RAP_WPrintDestEnum,     api_WPrintDestEnum},
+       {"WPrintDestGetInfo",   RAP_WPrintDestGetInfo,  api_WPrintDestGetInfo},
+       {"NetRemoteTOD",        RAP_NetRemoteTOD,       api_NetRemoteTOD},
+       {"WPrintQueuePurge",    RAP_WPrintQPurge,       api_WPrintQueueCtrl},
+       {"NetServerEnum",       RAP_NetServerEnum2,     api_RNetServerEnum}, /* anon OK */
+       {"WAccessGetUserPerms",RAP_WAccessGetUserPerms,api_WAccessGetUserPerms},
+       {"SetUserPassword",     RAP_WUserPasswordSet2,  api_SetUserPassword},
+       {"WWkstaUserLogon",     RAP_WWkstaUserLogon,    api_WWkstaUserLogon},
+       {"PrintJobInfo",        RAP_WPrintJobSetInfo,   api_PrintJobInfo},
+       {"WPrintDriverEnum",    RAP_WPrintDriverEnum,   api_WPrintDriverEnum},
+       {"WPrintQProcEnum",     RAP_WPrintQProcessorEnum,api_WPrintQProcEnum},
+       {"WPrintPortEnum",      RAP_WPrintPortEnum,     api_WPrintPortEnum},
+       {"SamOEMChangePassword",RAP_SamOEMChgPasswordUser2_P,api_SamOEMChangePassword}, /* anon OK */
+       {NULL,          -1,     api_Unsupported}
+       /*  The following RAP calls are not implemented by Samba:
+
+       RAP_WFileEnum2 - anon not OK 
+       */
+};
+
 
 /****************************************************************************
  Handle remote api calls
@@ -3550,75 +3604,79 @@ static const struct
 int api_reply(connection_struct *conn,uint16 vuid,char *outbuf,char *data,char *params,
                     int tdscnt,int tpscnt,int mdrcnt,int mprcnt)
 {
-  int api_command;
-  char *rdata = NULL;
-  char *rparam = NULL;
-  int rdata_len = 0;
-  int rparam_len = 0;
-  BOOL reply=False;
-  int i;
+       int api_command;
+       char *rdata = NULL;
+       char *rparam = NULL;
+       int rdata_len = 0;
+       int rparam_len = 0;
+       BOOL reply=False;
+       int i;
 
-  if (!params) {
-         DEBUG(0,("ERROR: NULL params in api_reply()\n"));
-         return 0;
-  }
+       if (!params) {
+               DEBUG(0,("ERROR: NULL params in api_reply()\n"));
+               return 0;
+       }
 
-  api_command = SVAL(params,0);
+       api_command = SVAL(params,0);
 
-  DEBUG(3,("Got API command %d of form <%s> <%s> (tdscnt=%d,tpscnt=%d,mdrcnt=%d,mprcnt=%d)\n",
-          api_command,
-          params+2,
-          skip_string(params+2,1),
-          tdscnt,tpscnt,mdrcnt,mprcnt));
+       DEBUG(3,("Got API command %d of form <%s> <%s> (tdscnt=%d,tpscnt=%d,mdrcnt=%d,mprcnt=%d)\n",
+               api_command,
+               params+2,
+               skip_string(params+2,1),
+               tdscnt,tpscnt,mdrcnt,mprcnt));
 
-  for (i=0;api_commands[i].name;i++) {
-    if (api_commands[i].id == api_command && api_commands[i].fn) {
-        DEBUG(3,("Doing %s\n",api_commands[i].name));
-        break;
-    }
-  }
+       for (i=0;api_commands[i].name;i++) {
+               if (api_commands[i].id == api_command && api_commands[i].fn) {
+                       DEBUG(3,("Doing %s\n",api_commands[i].name));
+                       break;
+               }
+       }
 
-  /* Check whether this api call can be done anonymously */
+       /* Check whether this api call can be done anonymously */
 
-  if (api_commands[i].auth_user && lp_restrict_anonymous()) {
-         user_struct *user = get_valid_user_struct(vuid);
+       if (api_commands[i].auth_user && lp_restrict_anonymous()) {
+               user_struct *user = get_valid_user_struct(vuid);
 
-         if (!user || user->guest)
-                 return ERROR_NT(NT_STATUS_ACCESS_DENIED);
-  }
+               if (!user || user->guest) {
+                       return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+               }
+       }
 
-  rdata = (char *)malloc(1024);
-  if (rdata)
-    memset(rdata,'\0',1024);
+       rdata = (char *)SMB_MALLOC(1024);
+       if (rdata) {
+               memset(rdata,'\0',1024);
+       }
 
-  rparam = (char *)malloc(1024);
-  if (rparam)
-    memset(rparam,'\0',1024);
+       rparam = (char *)SMB_MALLOC(1024);
+       if (rparam) {
+               memset(rparam,'\0',1024);
+       }
 
-  if(!rdata || !rparam) {
-    DEBUG(0,("api_reply: malloc fail !\n"));
-    return -1;
-  }
+       if(!rdata || !rparam) {
+               DEBUG(0,("api_reply: malloc fail !\n"));
+               SAFE_FREE(rdata);
+               SAFE_FREE(rparam);
+               return -1;
+       }
 
-  reply = api_commands[i].fn(conn,vuid,params,data,mdrcnt,mprcnt,
-                            &rdata,&rparam,&rdata_len,&rparam_len);
+       reply = api_commands[i].fn(conn,vuid,params,data,mdrcnt,mprcnt,
+                               &rdata,&rparam,&rdata_len,&rparam_len);
 
 
-  if (rdata_len > mdrcnt ||
-      rparam_len > mprcnt) {
-      reply = api_TooSmall(conn,vuid,params,data,mdrcnt,mprcnt,
-                          &rdata,&rparam,&rdata_len,&rparam_len);
-  }
+       if (rdata_len > mdrcnt || rparam_len > mprcnt) {
+               reply = api_TooSmall(conn,vuid,params,data,mdrcnt,mprcnt,
+                                       &rdata,&rparam,&rdata_len,&rparam_len);
+       }
 
-  /* if we get False back then it's actually unsupported */
-  if (!reply)
-    api_Unsupported(conn,vuid,params,data,mdrcnt,mprcnt,
-                   &rdata,&rparam,&rdata_len,&rparam_len);
+       /* if we get False back then it's actually unsupported */
+       if (!reply) {
+               api_Unsupported(conn,vuid,params,data,mdrcnt,mprcnt,
+                       &rdata,&rparam,&rdata_len,&rparam_len);
+       }
 
-  send_trans_reply(outbuf, rparam, rparam_len, rdata, rdata_len, False);
+       send_trans_reply(outbuf, rparam, rparam_len, rdata, rdata_len, False);
 
-  SAFE_FREE(rdata);
-  SAFE_FREE(rparam);
-  
-  return -1;
+       SAFE_FREE(rdata);
+       SAFE_FREE(rparam);
+       return -1;
 }