This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
{
struct dgram_packet *dgram = &p->packet.dgram;
int ttl = IVAL(buf,1)/1000;
- nstring announce_name;
+ unstring announce_name;
uint32 servertype = IVAL(buf,23);
fstring comment;
struct work_record *work;
struct server_record *servrec;
- nstring work_name;
- nstring source_name;
+ unstring work_name;
+ unstring source_name;
START_PROFILE(host_announce);
pull_ascii_fstring(comment, buf+31);
- comment[42] = 0;
- pull_ascii_nstring(announce_name, buf+5);
- pull_ascii_nstring(source_name, dgram->source_name.name);
+ pull_ascii_nstring(announce_name, sizeof(announce_name), buf+5);
+ pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);
DEBUG(3,("process_host_announce: from %s<%02x> IP %s to \
%s for server %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
}
/* For a host announce the workgroup name is the destination name. */
- pull_ascii_nstring(work_name, dgram->dest_name.name);
+ pull_ascii_nstring(work_name, sizeof(work_name), dgram->dest_name.name);
/*
* Syntax servers version 5.1 send HostAnnounce packets to
*/
if(strequal(work_name, global_myname()))
- nstrcpy(work_name,lp_workgroup());
+ unstrcpy(work_name,lp_workgroup());
/*
* We are being very agressive here in adding a workgroup
{
struct dgram_packet *dgram = &p->packet.dgram;
int ttl = IVAL(buf,1)/1000;
- nstring workgroup_announce_name;
- nstring master_name;
+ unstring workgroup_announce_name;
+ unstring master_name;
uint32 servertype = IVAL(buf,23);
struct work_record *work;
- nstring source_name;
- nstring dest_name;
+ unstring source_name;
+ unstring dest_name;
START_PROFILE(workgroup_announce);
- pull_ascii_nstring(workgroup_announce_name,buf+5);
- pull_ascii_nstring(master_name,buf+31);
- pull_ascii_nstring(source_name,dgram->source_name.name);
- pull_ascii_nstring(dest_name,dgram->dest_name.name);
+ pull_ascii_nstring(workgroup_announce_name,sizeof(workgroup_announce_name),buf+5);
+ pull_ascii_nstring(master_name,sizeof(master_name),buf+31);
+ pull_ascii_nstring(source_name,sizeof(source_name),dgram->source_name.name);
+ pull_ascii_nstring(dest_name,sizeof(dest_name),dgram->dest_name.name);
DEBUG(3,("process_workgroup_announce: from %s<%02x> IP %s to \
%s for workgroup %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
{
struct dgram_packet *dgram = &p->packet.dgram;
int ttl = IVAL(buf,1)/1000;
- nstring server_name;
+ unstring server_name;
uint32 servertype = IVAL(buf,23);
fstring comment;
- nstring work_name;
+ unstring work_name;
struct work_record *work;
struct server_record *servrec;
- nstring source_name;
+ unstring source_name;
START_PROFILE(local_master_announce);
- pull_ascii_nstring(server_name,buf+5);
+ pull_ascii_nstring(server_name,sizeof(server_name),buf+5);
pull_ascii_fstring(comment, buf+31);
- comment[42] = 0;
- pull_ascii_nstring(source_name, dgram->source_name.name);
- pull_ascii_nstring(work_name, dgram->dest_name.name);
+ pull_ascii_nstring(source_name, sizeof(source_name), dgram->source_name.name);
+ pull_ascii_nstring(work_name, sizeof(work_name), dgram->dest_name.name);
DEBUG(3,("process_local_master_announce: from %s<%02x> IP %s to \
%s for server %s.\n", source_name, source_name[15], inet_ntoa(p->ip),
void process_master_browser_announce(struct subnet_record *subrec,
struct packet_struct *p,char *buf)
{
- nstring local_master_name;
+ unstring local_master_name;
struct work_record *work;
struct browse_cache_record *browrec;
START_PROFILE(master_browser_announce);
- pull_ascii_nstring(local_master_name,buf);
+ pull_ascii_nstring(local_master_name,sizeof(local_master_name),buf);
DEBUG(3,("process_master_browser_announce: Local master announce from %s IP %s.\n",
local_master_name, inet_ntoa(p->ip)));
Process an incoming LanMan host announcement packet.
*******************************************************************/
-void process_lm_host_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf)
+void process_lm_host_announce(struct subnet_record *subrec, struct packet_struct *p, char *buf, int len)
{
struct dgram_packet *dgram = &p->packet.dgram;
uint32 servertype = IVAL(buf,1);
int osmajor=CVAL(buf,5); /* major version of node software */
int osminor=CVAL(buf,6); /* minor version of node software */
int ttl = SVAL(buf,7);
- nstring announce_name;
+ unstring announce_name;
struct work_record *work;
struct server_record *servrec;
- nstring work_name;
- nstring source_name;
+ unstring work_name;
+ unstring source_name;
fstring comment;
- char *s = buf+9;
+ char *s = get_safe_str_ptr(buf,len,buf,9);
START_PROFILE(lm_host_announce);
- s = skip_string(s,1);
+ if (!s) {
+ goto done;
+ }
+ s = skip_string(buf,len,s);
+ if (!s) {
+ goto done;
+ }
pull_ascii(comment, s, sizeof(fstring), 43, STR_TERMINATE);
- pull_ascii_nstring(announce_name,buf+9);
- pull_ascii_nstring(source_name,dgram->source_name.name);
+ pull_ascii_nstring(announce_name,sizeof(announce_name),buf+9);
+ pull_ascii_nstring(source_name,sizeof(source_name),dgram->source_name.name);
/* For a LanMan host announce the workgroup name is the destination name. */
- pull_ascii_nstring(work_name,dgram->dest_name.name);
+ pull_ascii_nstring(work_name,sizeof(work_name),dgram->dest_name.name);
DEBUG(3,("process_lm_host_announce: LM Announcement from %s IP %s to \
%s for server %s.\n", nmb_namestr(&dgram->source_name), inet_ntoa(p->ip),
*/
if(strequal(work_name, global_myname()))
- nstrcpy(work_name,lp_workgroup());
+ unstrcpy(work_name,lp_workgroup());
/*
* We are being very agressive here in adding a workgroup
char outbuf[1024];
char *p, *countptr;
unsigned int count = 0;
- nstring send_to_namestr;
+ unstring send_to_namestr;
#if 0
struct server_record *servrec;
#endif
- fstring myname;
+ unstring myname;
memset(outbuf,'\0',sizeof(outbuf));
/* We always return at least one name - our own. */
count = 1;
- fstrcpy(myname, global_myname());
+ unstrcpy(myname, global_myname());
strupper_m(myname);
myname[15]='\0';
push_pstring_base(p, myname, outbuf);
- p = skip_string(p,1);
+ p = skip_string(outbuf,sizeof(outbuf),p);
/* Look for backup browsers in this workgroup. */
DEBUG(5,("send_backup_list_response: Adding server %s number %d\n",
p, count));
- p = skip_string(p,1);
+ p = skip_string(outbuf,sizeof(outbuf),p);
}
#endif
SCVAL(countptr, 0, count);
- pull_ascii_nstring(send_to_namestr, send_to_name->name);
+ pull_ascii_nstring(send_to_namestr, sizeof(send_to_namestr), send_to_name->name);
DEBUG(4,("send_backup_list_response: sending response to %s<00> IP %s with %d servers.\n",
send_to_namestr, inet_ntoa(sendto_ip), count));
unsigned char max_number_requested = CVAL(buf,0);
uint32 token = IVAL(buf,1); /* Sender's key index for the workgroup. */
int name_type = dgram->dest_name.name_type;
- nstring workgroup_name;
+ unstring workgroup_name;
struct subnet_record *search_subrec = subrec;
START_PROFILE(get_backup_list);
- pull_ascii_nstring(workgroup_name, dgram->dest_name.name);
+ pull_ascii_nstring(workgroup_name, sizeof(workgroup_name), dgram->dest_name.name);
DEBUG(3,("process_get_backup_list_request: request from %s IP %s to %s.\n",
nmb_namestr(&dgram->source_name), inet_ntoa(p->ip),
{
struct dgram_packet *dgram = &p->packet.dgram;
struct work_record *work;
- nstring workgroup_name;
+ unstring workgroup_name;
START_PROFILE(announce_request);
- pull_ascii_nstring(workgroup_name, dgram->dest_name.name);
+ pull_ascii_nstring(workgroup_name, sizeof(workgroup_name), dgram->dest_name.name);
DEBUG(3,("process_announce_request: Announce request from %s IP %s to %s.\n",
nmb_namestr(&dgram->source_name), inet_ntoa(p->ip),
nmb_namestr(&dgram->dest_name)));
work->needannounce = True;
done:
- END_PROFILE(lm_host_announce);
+ END_PROFILE(announce_request);
}
/*******************************************************************
through the "lm announce" parameter in smb.conf)
******************************************************************/
-void process_lm_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf)
+void process_lm_announce_request(struct subnet_record *subrec, struct packet_struct *p, char *buf, int len)
{
struct dgram_packet *dgram = &p->packet.dgram;
- nstring workgroup_name;
+ unstring workgroup_name;
START_PROFILE(lm_announce_request);
- pull_ascii_nstring(workgroup_name, dgram->dest_name.name);
+ pull_ascii_nstring(workgroup_name, sizeof(workgroup_name), dgram->dest_name.name);
DEBUG(3,("process_lm_announce_request: Announce request from %s IP %s to %s.\n",
nmb_namestr(&dgram->source_name), inet_ntoa(p->ip),
nmb_namestr(&dgram->dest_name)));
done:
- END_PROFILE(lm_host_announce);
+ END_PROFILE(lm_announce_request);
}