/*
- * $Id: nbp.c,v 1.8 2002-01-04 04:45:47 sibaz Exp $
+ * $Id: nbp.c,v 1.11 2005-04-28 20:49:46 bfernhomberg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
data += SZ_NBPHDR;
if ( sendto( fd, packet, data - packet, 0, (struct sockaddr *)to,
sizeof( struct sockaddr_at )) < 0 ) {
- LOG(log_error, logtype_default, "sendto: %s", strerror(errno) );
+ LOG(log_error, logtype_atalkd, "sendto: %s", strerror(errno) );
}
}
struct nbpnve nn;
struct sockaddr_at sat;
struct nbptab *ntab;
- struct ziptab *zt;
+ struct ziptab *zt=NULL;
struct interface *iface;
struct list *l;
struct rtmptab *rtmp;
char *end, *nbpop, *zonep, packet[ ATP_BUFSIZ ];
int n, i, cc, locallkup;
+ u_char tmplen;
end = data + len;
if ( data >= end ) {
- LOG(log_info, logtype_default, "nbp_packet malformed packet" );
+ LOG(log_info, logtype_atalkd, "nbp_packet malformed packet" );
return 1;
}
if ( *data++ != DDPTYPE_NBP ) {
- LOG(log_info, logtype_default, "nbp_packet bad ddp type" );
+ LOG(log_info, logtype_atalkd, "nbp_packet bad ddp type" );
return 1;
}
if ( data + SZ_NBPHDR + SZ_NBPTUPLE > end ) {
- LOG(log_info, logtype_default, "nbp_packet: malformed packet" );
+ LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
return 1;
}
memcpy( &nh, data, SZ_NBPHDR );
nbpop = data; /* remember for fwd and brrq */
data += SZ_NBPHDR;
if ( nh.nh_cnt != 1 ) {
- LOG(log_info, logtype_default, "nbp_packet: bad tuple count (%d/%d)", nh.nh_cnt,
+ LOG(log_info, logtype_atalkd, "nbp_packet: bad tuple count (%d/%d)", nh.nh_cnt,
nh.nh_op );
return 1;
}
nn.nn_sat.sat_port = nt.nt_port;
/* object */
- if ( data >= end || ( *data < 0 || *data > 32 ) || data + *data > end ) {
- LOG(log_info, logtype_default, "nbp_packet: malformed packet" );
+ tmplen = (u_char) *data;
+ if ( data >= end || tmplen > 32 || data + tmplen > end ) {
+ LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
return 1;
}
- nn.nn_objlen = *data++;
+ nn.nn_objlen = tmplen;
+ data++;
memcpy( nn.nn_obj, data, nn.nn_objlen );
data += nn.nn_objlen;
/* type */
- if ( data >= end || ( *data < 0 || *data > 32 ) || data + *data > end ) {
- LOG(log_info, logtype_default, "nbp_packet: malformed packet" );
+ tmplen = (u_char) *data;
+ if ( data >= end || tmplen > 32 || data + tmplen > end ) {
+ LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
return 1;
}
- nn.nn_typelen = *data++;
+ nn.nn_typelen = tmplen;
+ data++;
memcpy( nn.nn_type, data, nn.nn_typelen );
data += nn.nn_typelen;
/* zone */
- if ( data >= end || ( *data < 0 || *data > 32 ) || data + *data > end ) {
- LOG(log_info, logtype_default, "nbp_packet: malformed packet" );
+ tmplen = (u_char) *data;
+ if ( data >= end || tmplen > 32 || data + tmplen > end ) {
+ LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
return 1;
}
zonep = data; /* remember for fwd */
- nn.nn_zonelen = *data++;
+ nn.nn_zonelen = tmplen;
+ data++;
memcpy( nn.nn_zone, data, nn.nn_zonelen );
data += nn.nn_zonelen;
if ( data != end ) {
- LOG(log_info, logtype_default, "nbp_packet: malformed packet" );
+ LOG(log_info, logtype_atalkd, "nbp_packet: malformed packet" );
return 1;
}
/* calculate and save multicast address */
if (zone_bcast(zt) < 0) {
- LOG(log_error, logtype_default, "nbp_packet: zone_bcast");
+ LOG(log_error, logtype_atalkd, "nbp_packet: zone_bcast");
return -1;
}
if ( zt == (struct ziptab *)l->l_data ) {
/* add multicast */
if (addmulti(iface->i_name, zt->zt_bcast) < 0) {
- LOG(log_error, logtype_default, "nbp_packet: addmulti: %s",
+ LOG(log_error, logtype_atalkd, "nbp_packet: addmulti: %s",
strerror(errno) );
return -1;
}
if (( ntab = (struct nbptab *)malloc( sizeof( struct nbptab )))
== 0 ) {
- LOG(log_error, logtype_default, "nbp_packet: malloc: %s", strerror(errno) );
+ LOG(log_error, logtype_atalkd, "nbp_packet: malloc: %s", strerror(errno) );
return -1;
}
memcpy( &ntab->nt_nve, &nn, sizeof( struct nbpnve ));
if ( sendto( ap->ap_fd, data - len, len, 0, (struct sockaddr *)&sat,
sizeof( struct sockaddr_at )) < 0 ) {
- LOG(log_error, logtype_default, "nbp brrq sendto: %s", strerror(errno) );
+ LOG(log_error, logtype_atalkd, "nbp brrq sendto: %s", strerror(errno) );
}
locallkup = 1;
}
}
if ( !iface ) {
- LOG(log_error, logtype_default, "nbp_packet: \
+ LOG(log_error, logtype_atalkd, "nbp_packet: \
Can't find route's interface!" );
return -1;
}
}
}
if ( !ap ) {
- LOG(log_error, logtype_default, "nbp_packet: Can't find port!" );
+ LOG(log_error, logtype_atalkd, "nbp_packet: Can't find port!" );
return -1;
}
if ( sendto( ap->ap_fd, data - len, len, 0,
(struct sockaddr *)&sat,
sizeof( struct sockaddr_at )) < 0 ) {
- LOG(log_error, logtype_default, "nbp brrq sendto %u.%u: %s",
+ LOG(log_error, logtype_atalkd, "nbp brrq sendto %u.%u: %s",
ntohs( sat.sat_addr.s_net ), sat.sat_addr.s_node,
strerror(errno) );
continue;
from->sat_addr.s_node = ATADDR_BCAST;
if ( sendto( ap->ap_fd, data - len, len, 0, (struct sockaddr *)from,
sizeof( struct sockaddr_at )) < 0 ) {
- LOG(log_error, logtype_default, "nbp fwd sendto %u.%u: %s",
+ LOG(log_error, logtype_atalkd, "nbp fwd sendto %u.%u: %s",
ntohs( from->sat_addr.s_net ), from->sat_addr.s_node,
strerror(errno) );
return 0;
* Another tuple won't fit. Send what we've already
* got, and start the next packet.
*/
- if ( data + SZ_NBPTUPLE + 3 + ntab->nt_nve.nn_objlen +
+ if ( n > 14 || data + SZ_NBPTUPLE + 3 + ntab->nt_nve.nn_objlen +
ntab->nt_nve.nn_typelen + ntab->nt_nve.nn_zonelen > end ) {
nh.nh_op = NBPOP_LKUPREPLY;
nh.nh_cnt = n;
if ( sendto( ap->ap_fd, packet, cc, 0,
(struct sockaddr *)&nn.nn_sat,
sizeof( struct sockaddr_at )) < 0 ) {
- LOG(log_error, logtype_default, "nbp lkup sendto %u.%u: %s",
+ LOG(log_error, logtype_atalkd, "nbp lkup sendto %u.%u: %s",
ntohs( nn.nn_sat.sat_addr.s_net ),
nn.nn_sat.sat_addr.s_node,
strerror(errno) );
if ( sendto( ap->ap_fd, packet, cc, 0,
(struct sockaddr *)&nn.nn_sat,
sizeof( struct sockaddr_at )) < 0 ) {
- LOG(log_error, logtype_default, "nbp lkup sendto %u.%u: %s",
+ LOG(log_error, logtype_atalkd, "nbp lkup sendto %u.%u: %s",
ntohs( nn.nn_sat.sat_addr.s_net ),
nn.nn_sat.sat_addr.s_node,
strerror(errno) );
break;
default :
- LOG(log_info, logtype_default, "nbp_packet: bad op (%d)", nh.nh_op );
+ LOG(log_info, logtype_atalkd, "nbp_packet: bad op (%d)", nh.nh_op );
return 1;
}