]> arthur.barton.de Git - netatalk.git/blobdiff - etc/atalkd/nbp.c
- merge branch-netatalk-afp-3x-dev, HEAD was tagged before
[netatalk.git] / etc / atalkd / nbp.c
index e78736e36e349a1064e65a99755098e22936969d..a01521f73dc07f49f8a4b83bacbe01054208e575 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $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.
@@ -64,7 +64,7 @@ void nbp_ack( fd, nh_op, nh_id, to )
     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) );
     }
 }
 
@@ -79,32 +79,33 @@ int nbp_packet( ap, from, data, len )
     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;
     }
@@ -122,35 +123,41 @@ int nbp_packet( ap, from, data, len )
     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;
     }
 
@@ -206,7 +213,7 @@ int nbp_packet( ap, from, data, len )
 
            /* 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;
            }
 
@@ -218,7 +225,7 @@ int nbp_packet( ap, from, data, len )
                    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;
                        }
@@ -229,7 +236,7 @@ int nbp_packet( ap, from, data, len )
 
        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 ));
@@ -404,7 +411,7 @@ int nbp_packet( ap, from, data, len )
 
            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;
@@ -425,7 +432,7 @@ int nbp_packet( ap, from, data, len )
                        }
                    }
                    if ( !iface ) {
-                       LOG(log_error, logtype_default, "nbp_packet: \
+                       LOG(log_error, logtype_atalkd, "nbp_packet: \
 Can't find route's interface!" );
                        return -1;
                    }
@@ -439,7 +446,7 @@ Can't find route's interface!" );
                    }
                }
                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;
                }
 
@@ -470,7 +477,7 @@ Can't find route's interface!" );
                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;
@@ -492,7 +499,7 @@ Can't find route's interface!" );
            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;
@@ -556,7 +563,7 @@ Can't find route's interface!" );
             * 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;
@@ -568,7 +575,7 @@ Can't find route's interface!" );
                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) );
@@ -631,7 +638,7 @@ Can't find route's interface!" );
            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) );
@@ -641,7 +648,7 @@ Can't find route's interface!" );
        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;
     }