Changeset 105 for branches/samba-3.0/source/smbd/trans2.c
- Timestamp:
- Nov 26, 2007, 9:24:27 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/samba-3.0/source/smbd/trans2.c
r99 r105 1104 1104 int requires_resume_key, 1105 1105 BOOL dont_descend,char **ppdata, 1106 char *base_data, int space_remaining,1106 char *base_data, char *end_data, int space_remaining, 1107 1107 BOOL *out_of_space, BOOL *got_exact_match, 1108 1108 int *last_entry_off, struct ea_list *name_list, TALLOC_CTX *ea_ctx) … … 1294 1294 nameptr = p; 1295 1295 p += align_string(outbuf, p, 0); 1296 len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE);1296 len = srvstr_push(outbuf, p, fname, PTR_DIFF(end_data, p), STR_TERMINATE); 1297 1297 if (SVAL(outbuf, smb_flg2) & FLAGS2_UNICODE_STRINGS) { 1298 1298 if (len > 2) { … … 1329 1329 p += 27; 1330 1330 nameptr = p - 1; 1331 len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE | STR_NOALIGN);1331 len = srvstr_push(outbuf, p, fname, PTR_DIFF(end_data, p), STR_TERMINATE | STR_NOALIGN); 1332 1332 if (SVAL(outbuf, smb_flg2) & FLAGS2_UNICODE_STRINGS) { 1333 1333 if (len > 2) { … … 1383 1383 1384 1384 /* Push the ea_data followed by the name. */ 1385 p += fill_ea_buffer(ea_ctx, p, space_remaining , conn, name_list);1385 p += fill_ea_buffer(ea_ctx, p, space_remaining - (p - pdata), conn, name_list); 1386 1386 nameptr = p; 1387 len = srvstr_push(outbuf, p + 1, fname, -1, STR_TERMINATE | STR_NOALIGN);1387 len = srvstr_push(outbuf, p + 1, fname, PTR_DIFF(end_data, p+1), STR_TERMINATE | STR_NOALIGN); 1388 1388 if (SVAL(outbuf, smb_flg2) & FLAGS2_UNICODE_STRINGS) { 1389 1389 if (len > 2) { … … 1442 1442 } 1443 1443 p += 2 + 24; 1444 len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE_ASCII);1444 len = srvstr_push(outbuf, p, fname, PTR_DIFF(end_data, p), STR_TERMINATE_ASCII); 1445 1445 SIVAL(q,0,len); 1446 1446 p += len; … … 1463 1463 SOFF_T(p,0,allocation_size); p += 8; 1464 1464 SIVAL(p,0,nt_extmode); p += 4; 1465 len = srvstr_push(outbuf, p + 4, fname, -1, STR_TERMINATE_ASCII);1465 len = srvstr_push(outbuf, p + 4, fname, PTR_DIFF(end_data, p+4), STR_TERMINATE_ASCII); 1466 1466 SIVAL(p,0,len); 1467 1467 p += 4 + len; … … 1490 1490 p +=4; 1491 1491 } 1492 len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE_ASCII);1492 len = srvstr_push(outbuf, p, fname, PTR_DIFF(end_data, p), STR_TERMINATE_ASCII); 1493 1493 SIVAL(q, 0, len); 1494 1494 p += len; … … 1508 1508 /* this must *not* be null terminated or w2k gets in a loop trying to set an 1509 1509 acl on a dir (tridge) */ 1510 len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE_ASCII);1510 len = srvstr_push(outbuf, p, fname, PTR_DIFF(end_data, p), STR_TERMINATE_ASCII); 1511 1511 SIVAL(p, -4, len); 1512 1512 p += len; … … 1538 1538 SIVAL(p,0,sbuf.st_ino); p += 4; /* FileIndexLow */ 1539 1539 SIVAL(p,0,sbuf.st_dev); p += 4; /* FileIndexHigh */ 1540 len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE_ASCII);1540 len = srvstr_push(outbuf, p, fname, PTR_DIFF(end_data, p), STR_TERMINATE_ASCII); 1541 1541 SIVAL(q, 0, len); 1542 1542 p += len; … … 1589 1589 SIVAL(p,0,sbuf.st_ino); p += 4; /* FileIndexLow */ 1590 1590 SIVAL(p,0,sbuf.st_dev); p += 4; /* FileIndexHigh */ 1591 len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE_ASCII);1591 len = srvstr_push(outbuf, p, fname, PTR_DIFF(end_data, p), STR_TERMINATE_ASCII); 1592 1592 SIVAL(q,0,len); 1593 1593 p += len; … … 1612 1612 p = store_file_unix_basic(conn, p, 1613 1613 NULL, &sbuf); 1614 len = srvstr_push(outbuf, p, fname, -1, STR_TERMINATE);1614 len = srvstr_push(outbuf, p, fname, PTR_DIFF(end_data, p), STR_TERMINATE); 1615 1615 } else { 1616 1616 DEBUG(10,("get_lanman2_dir_entry: SMB_FIND_FILE_UNIX_INFO2\n")); … … 1619 1619 nameptr = p; 1620 1620 p += 4; 1621 len = srvstr_push(outbuf, p, fname, -1, 0);1621 len = srvstr_push(outbuf, p, fname, PTR_DIFF(end_data, p), 0); 1622 1622 SIVAL(nameptr, 0, len); 1623 1623 } … … 1670 1670 char *params = *pparams; 1671 1671 char *pdata = *ppdata; 1672 char *data_end; 1672 1673 uint32 dirtype; 1673 1674 int maxentries; … … 1815 1816 } 1816 1817 pdata = *ppdata; 1818 data_end = pdata + max_data_bytes + DIR_ENTRY_SAFETY_MARGIN - 1; 1817 1819 1818 1820 /* Realloc the params space */ … … 1869 1871 mask,dirtype,info_level, 1870 1872 requires_resume_key,dont_descend, 1871 &p,pdata, space_remaining, &out_of_space, &got_exact_match,1873 &p,pdata,data_end,space_remaining, &out_of_space, &got_exact_match, 1872 1874 &last_entry_off, ea_list, ea_ctx); 1873 1875 } … … 1963 1965 char *params = *pparams; 1964 1966 char *pdata = *ppdata; 1967 char *data_end; 1965 1968 int dptr_num; 1966 1969 int maxentries; … … 2089 2092 2090 2093 pdata = *ppdata; 2094 data_end = pdata + max_data_bytes + DIR_ENTRY_SAFETY_MARGIN - 1; 2091 2095 2092 2096 /* Realloc the params space */ … … 2181 2185 mask,dirtype,info_level, 2182 2186 requires_resume_key,dont_descend, 2183 &p,pdata, space_remaining, &out_of_space, &got_exact_match,2187 &p,pdata,data_end,space_remaining, &out_of_space, &got_exact_match, 2184 2188 &last_entry_off, ea_list, ea_ctx); 2185 2189 } … … 2320 2324 * the pushed string. The change here was adding the STR_TERMINATE. JRA. 2321 2325 */ 2322 len = srvstr_push(outbuf, pdata+l2_vol_szVolLabel, vname, -1, STR_NOALIGN|STR_TERMINATE);2326 len = srvstr_push(outbuf, pdata+l2_vol_szVolLabel, vname, max_data_bytes - l2_vol_szVolLabel, STR_NOALIGN|STR_TERMINATE); 2323 2327 SCVAL(pdata,l2_vol_cch,len); 2324 2328 data_len = l2_vol_szVolLabel + len; … … 2342 2346 /* NOTE! the fstype must *not* be null terminated or win98 won't recognise it 2343 2347 and will think we can't do long filenames */ 2344 len = srvstr_push(outbuf, pdata+12, fstype, -1, STR_UNICODE);2348 len = srvstr_push(outbuf, pdata+12, fstype, max_data_bytes - 12, STR_UNICODE); 2345 2349 SIVAL(pdata,8,len); 2346 2350 data_len = 12 + len; … … 2349 2353 case SMB_QUERY_FS_LABEL_INFO: 2350 2354 case SMB_FS_LABEL_INFORMATION: 2351 len = srvstr_push(outbuf, pdata+4, vname, -1, 0);2355 len = srvstr_push(outbuf, pdata+4, vname, max_data_bytes - 4, 0); 2352 2356 data_len = 4 + len; 2353 2357 SIVAL(pdata,0,len); … … 2365 2369 2366 2370 /* Max label len is 32 characters. */ 2367 len = srvstr_push(outbuf, pdata+18, vname, -1, STR_UNICODE);2371 len = srvstr_push(outbuf, pdata+18, vname, max_data_bytes - 18, STR_UNICODE); 2368 2372 SIVAL(pdata,12,len); 2369 2373 data_len = 18+len; … … 3600 3604 mangle_map(short_name,True,True,conn->params); 3601 3605 } 3602 len = srvstr_push(outbuf, pdata+4, short_name, -1, STR_UNICODE);3606 len = srvstr_push(outbuf, pdata+4, short_name, max_data_bytes - 4, STR_UNICODE); 3603 3607 data_size = 4 + len; 3604 3608 SIVAL(pdata,0,len); … … 3610 3614 this must be *exactly* right for ACLs on mapped drives to work 3611 3615 */ 3612 len = srvstr_push(outbuf, pdata+4, dos_fname, -1, STR_UNICODE);3616 len = srvstr_push(outbuf, pdata+4, dos_fname, max_data_bytes - 4, STR_UNICODE); 3613 3617 DEBUG(10,("call_trans2qfilepathinfo: SMB_QUERY_FILE_NAME_INFO\n")); 3614 3618 data_size = 4 + len; … … 3651 3655 SIVAL(pdata,0,ea_size); 3652 3656 pdata += 4; /* EA info */ 3653 len = srvstr_push(outbuf, pdata+4, dos_fname, -1, STR_UNICODE);3657 len = srvstr_push(outbuf, pdata+4, dos_fname, max_data_bytes - (pdata+4 - *ppdata), STR_UNICODE); 3654 3658 SIVAL(pdata,0,len); 3655 3659 pdata += 4 + len; … … 3813 3817 return(UNIXERROR(ERRDOS,ERRnoaccess)); 3814 3818 buffer[len] = 0; 3815 len = srvstr_push(outbuf, pdata, buffer, -1, STR_TERMINATE);3819 len = srvstr_push(outbuf, pdata, buffer, max_data_bytes, STR_TERMINATE); 3816 3820 pdata += len; 3817 3821 data_size = PTR_DIFF(pdata,(*ppdata));
Note:
See TracChangeset
for help on using the changeset viewer.