r16945: Sync trunk -> 3.0 for 3.0.24 code. Still need
[samba.git] / source3 / smbd / lanman.c
index 03f7f8e5c8687bc34b4f85651a03302413426a93..2d6db8f2a30a508b21138719d6e7d32330c3c18e 100644 (file)
@@ -72,7 +72,11 @@ static int CopyExpanded(connection_struct *conn,
 
        StrnCpy(buf,src,sizeof(buf)/2);
        pstring_sub(buf,"%S",lp_servicename(snum));
-       standard_sub_conn(conn,buf,sizeof(buf));
+       standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user,
+                             conn->connectpath, conn->gid,
+                             get_current_username(),
+                             current_user_info.domain,
+                             buf, sizeof(buf));
        l = push_ascii(*dst,buf,*n, STR_TERMINATE);
        (*dst) += l;
        (*n) -= l;
@@ -99,7 +103,11 @@ static int StrlenExpanded(connection_struct *conn, int snum, char *s)
        }
        StrnCpy(buf,s,sizeof(buf)/2);
        pstring_sub(buf,"%S",lp_servicename(snum));
-       standard_sub_conn(conn,buf,sizeof(buf));
+       standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user,
+                             conn->connectpath, conn->gid,
+                             get_current_username(),
+                             current_user_info.domain,
+                             buf, sizeof(buf));
        return strlen(buf) + 1;
 }
 
@@ -111,7 +119,11 @@ static char *Expand(connection_struct *conn, int snum, char *s)
        }
        StrnCpy(buf,s,sizeof(buf)/2);
        pstring_sub(buf,"%S",lp_servicename(snum));
-       standard_sub_conn(conn,buf,sizeof(buf));
+       standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user,
+                             conn->connectpath, conn->gid,
+                             get_current_username(),
+                             current_user_info.domain,
+                             buf, sizeof(buf));
        return &buf[0];
 }
 
@@ -593,7 +605,7 @@ static void fill_printq_info_52(connection_struct *conn, int snum,
        PACKS(desc, "z", driver.info_3->monitorname); /* language monitor */
        
        fstrcpy(location, "\\\\%L\\print$\\WIN40\\0");
-       standard_sub_basic( "", location, sizeof(location)-1 );
+       standard_sub_basic( "", "", location, sizeof(location)-1 );
        PACKS(desc,"z", location);                          /* share to retrieve files */
        
        PACKS(desc,"z", driver.info_3->defaultdatatype);    /* default data type */
@@ -798,6 +810,9 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn,
                *rdata_len = 0;
                *rparam_len = 6;
                *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+               if (!*rparam) {
+                       return False;
+               }
                SSVALS(*rparam,0,ERRunknownlevel);
                SSVAL(*rparam,2,0);
                SSVAL(*rparam,4,0);
@@ -817,6 +832,9 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn,
 
        if (mdrcnt > 0) {
                *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       return False;
+               }
                desc.base = *rdata;
                desc.buflen = mdrcnt;
        } else {
@@ -846,6 +864,9 @@ static BOOL api_DosPrintQGetInfo(connection_struct *conn,
        *rdata_len = desc.usedlen;
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,desc.neededlen);
@@ -896,6 +917,9 @@ static BOOL api_DosPrintQEnum(connection_struct *conn, uint16 vuid, char* param,
                *rdata_len = 0;
                *rparam_len = 6;
                *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+               if (!*rparam) {
+                       return False;
+               }
                SSVALS(*rparam,0,ERRunknownlevel);
                SSVAL(*rparam,2,0);
                SSVAL(*rparam,4,0);
@@ -1066,15 +1090,12 @@ static int get_server_info(uint32 servertype,
                }
     
                if (count == alloced) {
-                       struct srv_info_struct *ts;
-      
                        alloced += 10;
-                       ts = SMB_REALLOC_ARRAY(*servers,struct srv_info_struct, alloced);
-                       if (!ts) {
+                       *servers = SMB_REALLOC_ARRAY(*servers,struct srv_info_struct, alloced);
+                       if (!*servers) {
                                DEBUG(0,("get_server_info: failed to enlarge servers info struct!\n"));
+                               file_lines_free(lines);
                                return 0;
-                       } else {
-                               *servers = ts;
                        }
                        memset((char *)((*servers)+count),'\0',sizeof(**servers)*(alloced-count));
                }
@@ -1332,6 +1353,9 @@ static BOOL api_RNetServerEnum(connection_struct *conn, uint16 vuid, char *param
 
        *rdata_len = fixed_len + string_len;
        *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
+       if (!*rdata) {
+               return False;
+       }
        memset(*rdata,'\0',*rdata_len);
   
        p2 = (*rdata) + fixed_len;      /* auxilliary data (strings) will go here */
@@ -1359,6 +1383,9 @@ static BOOL api_RNetServerEnum(connection_struct *conn, uint16 vuid, char *param
   
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVAL(*rparam,0,(missed == 0 ? NERR_Success : ERRmoredata));
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,counted);
@@ -1399,6 +1426,9 @@ static BOOL api_RNetGroupGetUsers(connection_struct *conn, uint16 vuid, char *pa
   
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
        SSVAL(*rparam,0,0x08AC); /* informational warning message */
        SSVAL(*rparam,2,0);
@@ -1581,6 +1611,9 @@ static BOOL api_RNetShareGetInfo(connection_struct *conn,uint16 vuid, char *para
        }
  
        *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+       if (!*rdata) {
+               return False;
+       }
        p = *rdata;
        *rdata_len = fill_share_info(conn,snum,uLevel,&p,&mdrcnt,0,0,0);
        if (*rdata_len < 0) {
@@ -1589,6 +1622,9 @@ static BOOL api_RNetShareGetInfo(connection_struct *conn,uint16 vuid, char *para
  
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVAL(*rparam,0,NERR_Success);
        SSVAL(*rparam,2,0);             /* converter word */
        SSVAL(*rparam,4,*rdata_len);
@@ -1665,6 +1701,9 @@ static BOOL api_RNetShareEnum( connection_struct *conn,
 
        *rdata_len = fixed_len + string_len;
        *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
+       if (!*rdata) {
+               return False;
+       }
        memset(*rdata,0,*rdata_len);
   
        p2 = (*rdata) + fixed_len;      /* auxiliary data (strings) will go here */
@@ -1688,6 +1727,9 @@ static BOOL api_RNetShareEnum( connection_struct *conn,
   
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVAL(*rparam,0,missed ? ERRmoredata : NERR_Success);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,counted);
@@ -1792,6 +1834,9 @@ static BOOL api_RNetShareAdd(connection_struct *conn,uint16 vuid, char *param,ch
 
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVAL(*rparam,0,NERR_Success);
        SSVAL(*rparam,2,0);             /* converter word */
        SSVAL(*rparam,4,*rdata_len);
@@ -1803,6 +1848,9 @@ static BOOL api_RNetShareAdd(connection_struct *conn,uint16 vuid, char *param,ch
 
        *rparam_len = 4;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        *rdata_len = 0;
        SSVAL(*rparam,0,res);
        SSVAL(*rparam,2,0);
@@ -1868,6 +1916,9 @@ static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,c
 
        *rdata_len = cli_buf_size;
        *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
+       if (!*rdata) {
+               return False;
+       }
 
        p = *rdata;
 
@@ -1895,7 +1946,9 @@ static BOOL api_RNetGroupEnum(connection_struct *conn,uint16 vuid, char *param,c
 
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
-
+       if (!*rparam) {
+               return False;
+       }
        SSVAL(*rparam, 0, errflags);
        SSVAL(*rparam, 2, 0);           /* converter word */
        SSVAL(*rparam, 4, i);   /* is this right?? */
@@ -1933,6 +1986,9 @@ static BOOL api_NetUserGetGroups(connection_struct *conn,uint16 vuid, char *para
 
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
   
        /* check it's a supported varient */
        
@@ -1952,7 +2008,9 @@ static BOOL api_NetUserGetGroups(connection_struct *conn,uint16 vuid, char *para
 
        *rdata_len = mdrcnt + 1024;
        *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
-
+       if (!*rdata) {
+               return False;
+       }
        SSVAL(*rparam,0,NERR_Success);
        SSVAL(*rparam,2,0);             /* converter word */
 
@@ -1964,6 +2022,12 @@ static BOOL api_NetUserGetGroups(connection_struct *conn,uint16 vuid, char *para
                return False;
        }
 
+       if ( !(sampw = samu_new(mem_ctx)) ) {
+               DEBUG(0, ("samu_new() failed!\n"));
+               TALLOC_FREE(mem_ctx);
+               return False;
+       }
+
        /* Lookup the user information; This should only be one of 
           our accounts (not remote domains) */
 
@@ -1981,11 +2045,6 @@ static BOOL api_NetUserGetGroups(connection_struct *conn,uint16 vuid, char *para
                goto done;
        }
 
-       if (!NT_STATUS_IS_OK(pdb_init_sam_talloc(mem_ctx, &sampw))) {
-               DEBUG(10, ("pdb_init_sam_talloc failed\n"));
-               goto done;
-       }
-
        if ( !pdb_getsampwsid(sampw, &user_sid) ) {
                DEBUG(10, ("pdb_getsampwsid(%s) failed for user %s\n",
                           sid_string_static(&user_sid), UserName));
@@ -2068,6 +2127,9 @@ static BOOL api_RNetUserEnum(connection_struct *conn,uint16 vuid, char *param,ch
 
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
        /* check it's a supported varient */
        if (strcmp("B21",str2) != 0)
@@ -2075,6 +2137,9 @@ static BOOL api_RNetUserEnum(connection_struct *conn,uint16 vuid, char *param,ch
 
        *rdata_len = cli_buf_size;
        *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
+       if (!*rdata) {
+               return False;
+       }
 
        p = *rdata;
 
@@ -2138,9 +2203,15 @@ static BOOL api_NetRemoteTOD(connection_struct *conn,uint16 vuid, char *param,ch
 
        *rparam_len = 4;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
        *rdata_len = 21;
        *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
+       if (!*rdata) {
+               return False;
+       }
 
        SSVAL(*rparam,0,NERR_Success);
        SSVAL(*rparam,2,0);             /* converter word */
@@ -2154,6 +2225,9 @@ static BOOL api_NetRemoteTOD(connection_struct *conn,uint16 vuid, char *param,ch
        /* the client expects to get localtime, not GMT, in this bit 
                (I think, this needs testing) */
        t = localtime(&unixdate);
+       if (!t) {
+               return False;
+       }
 
        SIVAL(p,4,0);           /* msecs ? */
        SCVAL(p,8,t->tm_hour);
@@ -2194,6 +2268,9 @@ static BOOL api_SetUserPassword(connection_struct *conn,uint16 vuid, char *param
 
        *rparam_len = 4;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
        *rdata_len = 0;
 
@@ -2266,6 +2343,9 @@ static BOOL api_SamOEMChangePassword(connection_struct *conn,uint16 vuid, char *
        char *p = param + 2;
        *rparam_len = 2;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
        *rdata_len = 0;
 
@@ -2333,6 +2413,9 @@ static BOOL api_RDosPrintJobDel(connection_struct *conn,uint16 vuid, char *param
 
        *rparam_len = 4;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);       
+       if (!*rparam) {
+               return False;
+       }
        *rdata_len = 0;
 
        if (!print_job_exists(sharename, jobid)) {
@@ -2396,6 +2479,9 @@ static BOOL api_WPrintQueueCtrl(connection_struct *conn,uint16 vuid, char *param
 
        *rparam_len = 4;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        *rdata_len = 0;
 
        snum = print_queue_snum(QueueName);
@@ -2460,7 +2546,6 @@ static BOOL api_PrintJobInfo(connection_struct *conn,uint16 vuid,char *param,cha
        char *str2 = skip_string(str1,1);
        char *p = skip_string(str2,1);
        uint32 jobid;
-       int snum;
        fstring sharename;
        int uLevel = SVAL(p,2);
        int function = SVAL(p,4);
@@ -2470,10 +2555,13 @@ static BOOL api_PrintJobInfo(connection_struct *conn,uint16 vuid,char *param,cha
                return False;
        *rparam_len = 4;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
-       if ( (snum = lp_servicenumber(sharename)) == -1 ) {
-               DEBUG(0,("api_PrintJobInfo: unable to get service number from sharename [%s]\n",
-                       sharename));
+       if (!share_defined(sharename)) {
+               DEBUG(0,("api_PrintJobInfo: sharen [%s] not defined\n",
+                        sharename));
                return False;
        }
   
@@ -2496,14 +2584,14 @@ static BOOL api_PrintJobInfo(connection_struct *conn,uint16 vuid,char *param,cha
                /* change job place in the queue, 
                   data gives the new place */
                place = SVAL(data,0);
-               if (print_job_set_place(snum, jobid, place)) {
+               if (print_job_set_place(sharename, jobid, place)) {
                        errcode=NERR_Success;
                }
                break;
 
        case 0xb:   
                /* change print job name, data gives the name */
-               if (print_job_set_name(snum, jobid, data)) {
+               if (print_job_set_name(sharename, jobid, data)) {
                        errcode=NERR_Success;
                }
                break;
@@ -2586,6 +2674,9 @@ static BOOL api_RNetServerGetInfo(connection_struct *conn,uint16 vuid, char *par
 
        *rdata_len = mdrcnt;
        *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
+       if (!*rdata) {
+               return False;
+       }
 
        p = *rdata;
        p2 = p + struct_len;
@@ -2621,7 +2712,11 @@ static BOOL api_RNetServerGetInfo(connection_struct *conn,uint16 vuid, char *par
                        SIVAL(p,6,0);
                } else {
                        SIVAL(p,6,PTR_DIFF(p2,*rdata));
-                       standard_sub_conn(conn,comment,sizeof(comment));
+                       standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user,
+                                             conn->connectpath, conn->gid,
+                                             get_current_username(),
+                                             current_user_info.domain,
+                                             comment, sizeof(comment));
                        StrnCpy(p2,comment,MAX(mdrcnt - struct_len,0));
                        p2 = skip_string(p2,1);
                }
@@ -2635,6 +2730,9 @@ static BOOL api_RNetServerGetInfo(connection_struct *conn,uint16 vuid, char *par
 
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVAL(*rparam,0,NERR_Success);
        SSVAL(*rparam,2,0);             /* converter word */
        SSVAL(*rparam,4,*rdata_len);
@@ -2661,6 +2759,9 @@ static BOOL api_NetWkstaGetInfo(connection_struct *conn,uint16 vuid, char *param
 
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
        /* check it's a supported varient */
        if (!(level==10 && strcsequal(str1,"WrLh") && strcsequal(str2,"zzzBBzz"))) {
@@ -2669,6 +2770,9 @@ static BOOL api_NetWkstaGetInfo(connection_struct *conn,uint16 vuid, char *param
 
        *rdata_len = mdrcnt + 1024;
        *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
+       if (!*rdata) {
+               return False;
+       }
 
        SSVAL(*rparam,0,NERR_Success);
        SSVAL(*rparam,2,0);             /* converter word */
@@ -2908,6 +3012,9 @@ static BOOL api_RNetUserGetInfo(connection_struct *conn,uint16 vuid, char *param
 
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
        DEBUG(4,("RNetUserGetInfo level=%d\n", uLevel));
   
@@ -2930,6 +3037,9 @@ static BOOL api_RNetUserGetInfo(connection_struct *conn,uint16 vuid, char *param
 
        *rdata_len = mdrcnt + 1024;
        *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
+       if (!*rdata) {
+               return False;
+       }
 
        SSVAL(*rparam,0,NERR_Success);
        SSVAL(*rparam,2,0);             /* converter word */
@@ -3031,8 +3141,12 @@ static BOOL api_RNetUserGetInfo(connection_struct *conn,uint16 vuid, char *param
                        SSVALS(p,102,-1);       /* bad_pw_count */
                        SSVALS(p,104,-1);       /* num_logons */
                        SIVAL(p,106,PTR_DIFF(p2,*rdata)); /* logon_server */
-                       pstrcpy(p2,"\\\\%L");
-                       standard_sub_conn(conn, p2,0);
+                       {
+                               pstring tmp;
+                               pstrcpy(tmp, "\\\\%L");
+                               standard_sub_basic("", "", tmp, sizeof(tmp));
+                               pstrcpy(p2, tmp);
+                       }
                        p2 = skip_string(p2,1);
                        SSVAL(p,110,49);        /* country_code */
                        SSVAL(p,112,860);       /* code page */
@@ -3082,6 +3196,9 @@ static BOOL api_WWkstaUserLogon(connection_struct *conn,uint16 vuid, char *param
        }
        if (mdrcnt > 0) {
                *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       return False;
+               }
        }
 
        desc.base = *rdata;
@@ -3121,6 +3238,9 @@ static BOOL api_WWkstaUserLogon(connection_struct *conn,uint16 vuid, char *param
        *rdata_len = desc.usedlen;
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,desc.neededlen);
@@ -3156,6 +3276,9 @@ static BOOL api_WAccessGetUserPerms(connection_struct *conn,uint16 vuid, char *p
 
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,0);            /* errorcode */
        SSVAL(*rparam,2,0);             /* converter word */
        SSVAL(*rparam,4,0x7f);  /* permission flags */
@@ -3219,6 +3342,9 @@ static BOOL api_WPrintJobGetInfo(connection_struct *conn,uint16 vuid, char *para
 
        if (mdrcnt > 0) {
                *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       return False;
+               }
                desc.base = *rdata;
                desc.buflen = mdrcnt;
        } else {
@@ -3242,6 +3368,9 @@ static BOOL api_WPrintJobGetInfo(connection_struct *conn,uint16 vuid, char *para
 
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,desc.neededlen);
@@ -3300,6 +3429,9 @@ static BOOL api_WPrintJobEnumerate(connection_struct *conn,uint16 vuid, char *pa
        count = print_queue_status(snum,&queue,&status);
        if (mdrcnt > 0) {
                *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       return False;
+               }
        }
        desc.base = *rdata;
        desc.buflen = mdrcnt;
@@ -3318,6 +3450,9 @@ static BOOL api_WPrintJobEnumerate(connection_struct *conn,uint16 vuid, char *pa
 
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,succnt);
@@ -3429,6 +3564,9 @@ static BOOL api_WPrintDestGetInfo(connection_struct *conn,uint16 vuid, char *par
        } else {
                if (mdrcnt > 0) {
                        *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+                       if (!*rdata) {
+                               return False;
+                       }
                        desc.base = *rdata;
                        desc.buflen = mdrcnt;
                } else {
@@ -3447,6 +3585,9 @@ static BOOL api_WPrintDestGetInfo(connection_struct *conn,uint16 vuid, char *par
 
        *rparam_len = 6;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,desc.neededlen);
@@ -3494,6 +3635,9 @@ static BOOL api_WPrintDestEnum(connection_struct *conn,uint16 vuid, char *param,
 
        if (mdrcnt > 0) {
                *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       return False;
+               }
        }
 
        desc.base = *rdata;
@@ -3516,6 +3660,9 @@ static BOOL api_WPrintDestEnum(connection_struct *conn,uint16 vuid, char *param,
 
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,succnt);
@@ -3554,6 +3701,9 @@ static BOOL api_WPrintDriverEnum(connection_struct *conn,uint16 vuid, char *para
 
        if (mdrcnt > 0) {
                *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       return False;
+               }
        }
        desc.base = *rdata;
        desc.buflen = mdrcnt;
@@ -3567,6 +3717,9 @@ static BOOL api_WPrintDriverEnum(connection_struct *conn,uint16 vuid, char *para
 
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,succnt);
@@ -3605,6 +3758,9 @@ static BOOL api_WPrintQProcEnum(connection_struct *conn,uint16 vuid, char *param
 
        if (mdrcnt > 0) {
                *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       return False;
+               }
        }
        desc.base = *rdata;
        desc.buflen = mdrcnt;
@@ -3619,6 +3775,9 @@ static BOOL api_WPrintQProcEnum(connection_struct *conn,uint16 vuid, char *param
 
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,succnt);
@@ -3657,6 +3816,9 @@ static BOOL api_WPrintPortEnum(connection_struct *conn,uint16 vuid, char *param,
 
        if (mdrcnt > 0) {
                *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       return False;
+               }
        }
        memset((char *)&desc,'\0',sizeof(desc));
        desc.base = *rdata;
@@ -3672,6 +3834,9 @@ static BOOL api_WPrintPortEnum(connection_struct *conn,uint16 vuid, char *param,
 
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0);
        SSVAL(*rparam,4,succnt);
@@ -3720,6 +3885,9 @@ static BOOL api_RNetSessionEnum(connection_struct *conn,uint16 vuid, char *param
 
        if (mdrcnt > 0) {
                *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);
+               if (!*rdata) {
+                       return False;
+               }
        }
        memset((char *)&desc,'\0',sizeof(desc));
        desc.base = *rdata;
@@ -3745,6 +3913,9 @@ static BOOL api_RNetSessionEnum(connection_struct *conn,uint16 vuid, char *param
 
        *rparam_len = 8;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
        SSVALS(*rparam,0,desc.errcode);
        SSVAL(*rparam,2,0); /* converter */
        SSVAL(*rparam,4,num_sessions); /* count */
@@ -3766,6 +3937,9 @@ static BOOL api_TooSmall(connection_struct *conn,uint16 vuid, char *param, char
 {
        *rparam_len = MIN(*rparam_len,mprcnt);
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
        *rdata_len = 0;
 
@@ -3787,6 +3961,9 @@ static BOOL api_Unsupported(connection_struct *conn, uint16 vuid, char *param, c
 {
        *rparam_len = 4;
        *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);
+       if (!*rparam) {
+               return False;
+       }
 
        *rdata_len = 0;
 
@@ -3919,11 +4096,14 @@ int api_reply(connection_struct *conn,uint16 vuid,char *outbuf,char *data,char *
 
        /* if we get False back then it's actually unsupported */
        if (!reply) {
-               api_Unsupported(conn,vuid,params,data,mdrcnt,mprcnt,
+               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);
+       /* If api_Unsupported returns false we can't return anything. */
+       if (reply) {
+               send_trans_reply(outbuf, rparam, rparam_len, rdata, rdata_len, False);
+       }
 
        SAFE_FREE(rdata);
        SAFE_FREE(rparam);