Changeset 77 for trunk/samba/source/smbd/lanman.c
- Timestamp:
- Sep 30, 2007, 1:42:50 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/samba/source/smbd/lanman.c
r39 r77 10 10 This program is free software; you can redistribute it and/or modify 11 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 2of the License, or12 the Free Software Foundation; either version 3 of the License, or 13 13 (at your option) any later version. 14 14 … … 19 19 20 20 You should have received a copy of the GNU General Public License 21 along with this program; if not, write to the Free Software 22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 along with this program. If not, see <http://www.gnu.org/licenses/>. 23 22 */ 24 23 /* … … 51 50 52 51 #define SHPWLEN 8 /* share password length */ 52 53 /* Limit size of ipc replies */ 54 55 static char *smb_realloc_limit(void *ptr, size_t size) 56 { 57 char *val; 58 59 size = MAX((size),4*1024); 60 val = (char *)SMB_REALLOC(ptr,size); 61 if (val) { 62 memset(val,'\0',size); 63 } 64 return val; 65 } 53 66 54 67 static BOOL api_Unsupported(connection_struct *conn, uint16 vuid, … … 118 131 static char *Expand(connection_struct *conn, int snum, char *s) 119 132 { 120 staticpstring buf;133 pstring buf; 121 134 if (!s) { 122 135 return NULL; … … 124 137 StrnCpy(buf,s,sizeof(buf)/2); 125 138 pstring_sub(buf,"%S",lp_servicename(snum)); 126 standard_sub_advanced(lp_servicename(SNUM(conn)), conn->user, 127 conn->connectpath, conn->gid, 128 get_current_username(), 129 current_user_info.domain, 130 buf, sizeof(buf)); 131 return &buf[0]; 139 return talloc_sub_advanced(talloc_tos(), lp_servicename(SNUM(conn)), 140 conn->user, conn->connectpath, conn->gid, 141 get_current_username(), 142 current_user_info.domain, buf); 132 143 } 133 144 … … 405 416 SIVAL(drivdata,4,1000); /* lVersion */ 406 417 memset(drivdata+8,0,32); /* szDeviceName */ 407 push_ascii(drivdata+8,"NULL", -1, STR_TERMINATE);418 push_ascii(drivdata+8,"NULL",32, STR_TERMINATE); 408 419 PACKl(desc,"l",drivdata,sizeof drivdata); /* pDriverData */ 409 420 } … … 828 839 *rdata_len = 0; 829 840 *rparam_len = 6; 830 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);841 *rparam = smb_realloc_limit(*rparam,*rparam_len); 831 842 if (!*rparam) { 832 843 return False; … … 850 861 851 862 if (mdrcnt > 0) { 852 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);863 *rdata = smb_realloc_limit(*rdata,mdrcnt); 853 864 if (!*rdata) { 865 SAFE_FREE(queue); 854 866 return False; 855 867 } … … 882 894 *rdata_len = desc.usedlen; 883 895 *rparam_len = 6; 884 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);896 *rparam = smb_realloc_limit(*rparam,*rparam_len); 885 897 if (!*rparam) { 898 SAFE_FREE(queue); 899 SAFE_FREE(tmpdata); 886 900 return False; 887 901 } … … 941 955 *rdata_len = 0; 942 956 *rparam_len = 6; 943 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);957 *rparam = smb_realloc_limit(*rparam,*rparam_len); 944 958 if (!*rparam) { 945 959 return False; … … 983 997 984 998 if (mdrcnt > 0) { 985 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);999 *rdata = smb_realloc_limit(*rdata,mdrcnt); 986 1000 if (!*rdata) { 987 1001 goto err; … … 1009 1023 *rdata_len = desc.usedlen; 1010 1024 *rparam_len = 8; 1011 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);1025 *rparam = smb_realloc_limit(*rparam,*rparam_len); 1012 1026 if (!*rparam) { 1013 1027 goto err; … … 1382 1396 1383 1397 *rdata_len = fixed_len + string_len; 1384 *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);1398 *rdata = smb_realloc_limit(*rdata,*rdata_len); 1385 1399 if (!*rdata) { 1386 1400 return False; 1387 1401 } 1388 memset(*rdata,'\0',*rdata_len);1389 1402 1390 1403 p2 = (*rdata) + fixed_len; /* auxilliary data (strings) will go here */ … … 1412 1425 1413 1426 *rparam_len = 8; 1414 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);1427 *rparam = smb_realloc_limit(*rparam,*rparam_len); 1415 1428 if (!*rparam) { 1416 1429 return False; … … 1461 1474 1462 1475 *rparam_len = 8; 1463 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);1476 *rparam = smb_realloc_limit(*rparam,*rparam_len); 1464 1477 if (!*rparam) { 1465 1478 return False; … … 1653 1666 } 1654 1667 1655 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);1668 *rdata = smb_realloc_limit(*rdata,mdrcnt); 1656 1669 if (!*rdata) { 1657 1670 return False; … … 1664 1677 1665 1678 *rparam_len = 6; 1666 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);1679 *rparam = smb_realloc_limit(*rparam,*rparam_len); 1667 1680 if (!*rparam) { 1668 1681 return False; … … 1721 1734 /* Ensure all the usershares are loaded. */ 1722 1735 become_root(); 1736 load_registry_shares(); 1723 1737 count = load_usershare_shares(); 1724 1738 unbecome_root(); … … 1746 1760 1747 1761 *rdata_len = fixed_len + string_len; 1748 *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);1762 *rdata = smb_realloc_limit(*rdata,*rdata_len); 1749 1763 if (!*rdata) { 1750 1764 return False; 1751 1765 } 1752 memset(*rdata,0,*rdata_len); 1753 1766 1754 1767 p2 = (*rdata) + fixed_len; /* auxiliary data (strings) will go here */ 1755 1768 p = *rdata; … … 1772 1785 1773 1786 *rparam_len = 8; 1774 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);1787 *rparam = smb_realloc_limit(*rparam,*rparam_len); 1775 1788 if (!*rparam) { 1776 1789 return False; … … 1894 1907 } else { 1895 1908 SAFE_FREE(command); 1896 message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL); 1909 message_send_all(smbd_messaging_context(), 1910 MSG_SMB_CONF_UPDATED, NULL, 0, NULL); 1897 1911 } 1898 1912 } else { … … 1901 1915 1902 1916 *rparam_len = 6; 1903 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);1917 *rparam = smb_realloc_limit(*rparam,*rparam_len); 1904 1918 if (!*rparam) { 1905 1919 return False; … … 1915 1929 1916 1930 *rparam_len = 4; 1917 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);1931 *rparam = smb_realloc_limit(*rparam,*rparam_len); 1918 1932 if (!*rparam) { 1919 1933 return False; … … 1989 2003 1990 2004 *rdata_len = cli_buf_size; 1991 *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);2005 *rdata = smb_realloc_limit(*rdata,*rdata_len); 1992 2006 if (!*rdata) { 1993 2007 return False; … … 2019 2033 2020 2034 *rparam_len = 8; 2021 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2035 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2022 2036 if (!*rparam) { 2023 2037 return False; … … 2065 2079 2066 2080 *rparam_len = 8; 2067 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2081 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2068 2082 if (!*rparam) { 2069 2083 return False; 2070 2084 } 2071 2085 2072 2086 /* check it's a supported varient */ 2073 2087 2074 2088 if ( strcmp(str1,"zWrLeh") != 0 ) 2075 2089 return False; 2076 2090 2077 2091 switch( uLevel ) { 2078 2092 case 0: … … 2087 2101 2088 2102 *rdata_len = mdrcnt + 1024; 2089 *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);2103 *rdata = smb_realloc_limit(*rdata,*rdata_len); 2090 2104 if (!*rdata) { 2091 2105 return False; 2092 2106 } 2107 2093 2108 SSVAL(*rparam,0,NERR_Success); 2094 2109 SSVAL(*rparam,2,0); /* converter word */ … … 2212 2227 2213 2228 *rparam_len = 8; 2214 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2229 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2215 2230 if (!*rparam) { 2216 2231 return False; … … 2222 2237 2223 2238 *rdata_len = cli_buf_size; 2224 *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);2239 *rdata = smb_realloc_limit(*rdata,*rdata_len); 2225 2240 if (!*rdata) { 2226 2241 return False; … … 2290 2305 2291 2306 *rparam_len = 4; 2292 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2307 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2293 2308 if (!*rparam) { 2294 2309 return False; … … 2296 2311 2297 2312 *rdata_len = 21; 2298 *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);2313 *rdata = smb_realloc_limit(*rdata,*rdata_len); 2299 2314 if (!*rdata) { 2300 2315 return False; … … 2380 2395 2381 2396 *rparam_len = 4; 2382 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2397 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2383 2398 if (!*rparam) { 2384 2399 return False; … … 2457 2472 char *p = get_safe_str_ptr(param,tpscnt,param,2); 2458 2473 *rparam_len = 2; 2459 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2474 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2460 2475 if (!*rparam) { 2461 2476 return False; … … 2560 2575 2561 2576 *rparam_len = 4; 2562 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2577 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2563 2578 if (!*rparam) { 2564 2579 return False; … … 2632 2647 2633 2648 *rparam_len = 4; 2634 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2649 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2635 2650 if (!*rparam) { 2636 2651 return False; … … 2730 2745 return False; 2731 2746 *rparam_len = 4; 2732 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2747 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2733 2748 if (!*rparam) { 2734 2749 return False; … … 2855 2870 2856 2871 *rdata_len = mdrcnt; 2857 *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);2872 *rdata = smb_realloc_limit(*rdata,*rdata_len); 2858 2873 if (!*rdata) { 2859 2874 return False; … … 2863 2878 p2 = p + struct_len; 2864 2879 if (uLevel != 20) { 2865 srvstr_push(NULL, p,global_myname(),16,2880 srvstr_push(NULL, 0, p,global_myname(),16, 2866 2881 STR_ASCII|STR_UPPER|STR_TERMINATE); 2867 2882 } … … 2914 2929 2915 2930 *rparam_len = 6; 2916 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2931 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2917 2932 if (!*rparam) { 2918 2933 return False; … … 2949 2964 2950 2965 *rparam_len = 6; 2951 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);2966 *rparam = smb_realloc_limit(*rparam,*rparam_len); 2952 2967 if (!*rparam) { 2953 2968 return False; … … 2960 2975 2961 2976 *rdata_len = mdrcnt + 1024; 2962 *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);2977 *rdata = smb_realloc_limit(*rdata,*rdata_len); 2963 2978 if (!*rdata) { 2964 2979 return False; … … 3228 3243 3229 3244 *rparam_len = 6; 3230 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);3245 *rparam = smb_realloc_limit(*rparam,*rparam_len); 3231 3246 if (!*rparam) { 3232 3247 return False; … … 3253 3268 3254 3269 *rdata_len = mdrcnt + 1024; 3255 *rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);3270 *rdata = smb_realloc_limit(*rdata,*rdata_len); 3256 3271 if (!*rdata) { 3257 3272 return False; … … 3463 3478 } 3464 3479 if (mdrcnt > 0) { 3465 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);3480 *rdata = smb_realloc_limit(*rdata,mdrcnt); 3466 3481 if (!*rdata) { 3467 3482 return False; … … 3505 3520 *rdata_len = desc.usedlen; 3506 3521 *rparam_len = 6; 3507 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);3522 *rparam = smb_realloc_limit(*rparam,*rparam_len); 3508 3523 if (!*rparam) { 3509 3524 return False; … … 3552 3567 3553 3568 *rparam_len = 6; 3554 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);3569 *rparam = smb_realloc_limit(*rparam,*rparam_len); 3555 3570 if (!*rparam) { 3556 3571 return False; … … 3624 3639 3625 3640 if (mdrcnt > 0) { 3626 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);3641 *rdata = smb_realloc_limit(*rdata,mdrcnt); 3627 3642 if (!*rdata) { 3628 3643 return False; … … 3650 3665 3651 3666 *rparam_len = 6; 3652 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);3667 *rparam = smb_realloc_limit(*rparam,*rparam_len); 3653 3668 if (!*rparam) { 3654 3669 return False; … … 3720 3735 count = print_queue_status(snum,&queue,&status); 3721 3736 if (mdrcnt > 0) { 3722 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);3737 *rdata = smb_realloc_limit(*rdata,mdrcnt); 3723 3738 if (!*rdata) { 3724 3739 return False; … … 3741 3756 3742 3757 *rparam_len = 8; 3743 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);3758 *rparam = smb_realloc_limit(*rparam,*rparam_len); 3744 3759 if (!*rparam) { 3745 3760 return False; … … 3868 3883 } else { 3869 3884 if (mdrcnt > 0) { 3870 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);3885 *rdata = smb_realloc_limit(*rdata,mdrcnt); 3871 3886 if (!*rdata) { 3872 3887 return False; … … 3889 3904 3890 3905 *rparam_len = 6; 3891 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);3906 *rparam = smb_realloc_limit(*rparam,*rparam_len); 3892 3907 if (!*rparam) { 3893 3908 return False; … … 3945 3960 3946 3961 if (mdrcnt > 0) { 3947 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);3962 *rdata = smb_realloc_limit(*rdata,mdrcnt); 3948 3963 if (!*rdata) { 3949 3964 return False; … … 3970 3985 3971 3986 *rparam_len = 8; 3972 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);3987 *rparam = smb_realloc_limit(*rparam,*rparam_len); 3973 3988 if (!*rparam) { 3974 3989 return False; … … 4017 4032 4018 4033 if (mdrcnt > 0) { 4019 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);4034 *rdata = smb_realloc_limit(*rdata,mdrcnt); 4020 4035 if (!*rdata) { 4021 4036 return False; … … 4033 4048 4034 4049 *rparam_len = 8; 4035 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);4050 *rparam = smb_realloc_limit(*rparam,*rparam_len); 4036 4051 if (!*rparam) { 4037 4052 return False; … … 4079 4094 4080 4095 if (mdrcnt > 0) { 4081 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);4096 *rdata = smb_realloc_limit(*rdata,mdrcnt); 4082 4097 if (!*rdata) { 4083 4098 return False; … … 4096 4111 4097 4112 *rparam_len = 8; 4098 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);4113 *rparam = smb_realloc_limit(*rparam,*rparam_len); 4099 4114 if (!*rparam) { 4100 4115 return False; … … 4143 4158 4144 4159 if (mdrcnt > 0) { 4145 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);4160 *rdata = smb_realloc_limit(*rdata,mdrcnt); 4146 4161 if (!*rdata) { 4147 4162 return False; … … 4161 4176 4162 4177 *rparam_len = 8; 4163 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);4178 *rparam = smb_realloc_limit(*rparam,*rparam_len); 4164 4179 if (!*rparam) { 4165 4180 return False; … … 4192 4207 int uLevel; 4193 4208 struct pack_desc desc; 4194 struct sessionid *session_list = NULL;4209 struct sessionid *session_list; 4195 4210 int i, num_sessions; 4196 4211 … … 4215 4230 } 4216 4231 4217 num_sessions = list_sessions( &session_list);4232 num_sessions = list_sessions(talloc_tos(), &session_list); 4218 4233 4219 4234 if (mdrcnt > 0) { 4220 *rdata = SMB_REALLOC_LIMIT(*rdata,mdrcnt);4235 *rdata = smb_realloc_limit(*rdata,mdrcnt); 4221 4236 if (!*rdata) { 4222 SAFE_FREE(session_list);4223 4237 return False; 4224 4238 } … … 4229 4243 desc.format = str2; 4230 4244 if (!init_package(&desc,num_sessions,0)) { 4231 SAFE_FREE(session_list);4232 4245 return False; 4233 4246 } … … 4248 4261 4249 4262 *rparam_len = 8; 4250 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);4263 *rparam = smb_realloc_limit(*rparam,*rparam_len); 4251 4264 if (!*rparam) { 4252 SAFE_FREE(session_list);4253 4265 return False; 4254 4266 } … … 4259 4271 DEBUG(4,("RNetSessionEnum: errorcode %d\n",desc.errcode)); 4260 4272 4261 SAFE_FREE(session_list);4262 4273 return True; 4263 4274 } … … 4274 4285 { 4275 4286 *rparam_len = MIN(*rparam_len,mprcnt); 4276 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);4287 *rparam = smb_realloc_limit(*rparam,*rparam_len); 4277 4288 if (!*rparam) { 4278 4289 return False; … … 4300 4311 { 4301 4312 *rparam_len = 4; 4302 *rparam = SMB_REALLOC_LIMIT(*rparam,*rparam_len);4313 *rparam = smb_realloc_limit(*rparam,*rparam_len); 4303 4314 if (!*rparam) { 4304 4315 return False; … … 4366 4377 4367 4378 /**************************************************************************** 4368 Handle remote api calls 4369 ****************************************************************************/ 4370 4371 int api_reply(connection_struct *conn,uint16 vuid,char *outbuf,char *data,char *params, 4372 int tdscnt,int tpscnt,int mdrcnt,int mprcnt) 4379 Handle remote api calls. 4380 ****************************************************************************/ 4381 4382 void api_reply(connection_struct *conn, uint16 vuid, 4383 struct smb_request *req, 4384 char *data, char *params, 4385 int tdscnt, int tpscnt, 4386 int mdrcnt, int mprcnt) 4373 4387 { 4374 4388 int api_command; … … 4384 4398 if (!params) { 4385 4399 DEBUG(0,("ERROR: NULL params in api_reply()\n")); 4386 return 0; 4400 reply_nterror(req, NT_STATUS_INVALID_PARAMETER); 4401 return; 4387 4402 } 4388 4403 4389 4404 if (tpscnt < 2) { 4390 return 0; 4405 reply_nterror(req, NT_STATUS_INVALID_PARAMETER); 4406 return; 4391 4407 } 4392 4408 api_command = SVAL(params,0); … … 4421 4437 4422 4438 if (!user || user->guest) { 4423 return ERROR_NT(NT_STATUS_ACCESS_DENIED); 4439 reply_nterror(req, NT_STATUS_ACCESS_DENIED); 4440 return; 4424 4441 } 4425 4442 } … … 4439 4456 SAFE_FREE(rdata); 4440 4457 SAFE_FREE(rparam); 4441 return -1; 4458 reply_nterror(req, NT_STATUS_NO_MEMORY); 4459 return; 4442 4460 } 4443 4461 … … 4463 4481 /* If api_Unsupported returns false we can't return anything. */ 4464 4482 if (reply) { 4465 send_trans_reply(outbuf, rparam, rparam_len, rdata, rdata_len, False); 4483 send_trans_reply(req, rparam, rparam_len, 4484 rdata, rdata_len, False); 4466 4485 } 4467 4486 4468 4487 SAFE_FREE(rdata); 4469 4488 SAFE_FREE(rparam); 4470 return -1;4471 } 4489 return; 4490 }
Note: See TracChangeset
for help on using the changeset viewer.