X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fplugins%2Fpppoe%2Fif.c;h=3dfea8c0fa20347c0c0a78c35cb386d6989b974b;hb=HEAD;hp=a3c384815ce2552055a152169293062af073b697;hpb=607d8eadccfd62c1fa84a36bd1440bd48b4e55ca;p=ppp.git diff --git a/pppd/plugins/pppoe/if.c b/pppd/plugins/pppoe/if.c index a3c3848..d5a4624 100644 --- a/pppd/plugins/pppoe/if.c +++ b/pppd/plugins/pppoe/if.c @@ -99,6 +99,7 @@ openInterface(char const *ifname, UINT16_t type, unsigned char *hwaddr) int fd; struct ifreq ifr; int domain, stype; + size_t maxlen; #ifdef HAVE_STRUCT_SOCKADDR_LL struct sockaddr_ll sa; @@ -111,11 +112,18 @@ openInterface(char const *ifname, UINT16_t type, unsigned char *hwaddr) #ifdef HAVE_STRUCT_SOCKADDR_LL domain = PF_PACKET; stype = SOCK_RAW; + maxlen = IFNAMSIZ; #else domain = PF_INET; stype = SOCK_PACKET; + maxlen = sizeof(sa.sa_data); #endif + if (strlen(ifname) >= maxlen) { + error("Can't use interface %.16s: name is too long", ifname); + return -1; + } + if ((fd = socket(domain, stype, htons(type))) < 0) { /* Give a more helpful message for the common error case */ if (errno == EPERM) { @@ -175,7 +183,7 @@ openInterface(char const *ifname, UINT16_t type, unsigned char *hwaddr) sa.sll_ifindex = ifr.ifr_ifindex; #else - strcpy(sa.sa_data, ifname); + strlcpy(sa.sa_data, ifname, sizeof(sa.sa_data)); #endif /* We're only interested in packets on specified interface */ @@ -205,14 +213,14 @@ sendPacket(PPPoEConnection *conn, int sock, PPPoEPacket *pkt, int size) { int err; - if (debug) + if (debug_on()) pppoe_log_packet("Send ", pkt); #if defined(HAVE_STRUCT_SOCKADDR_LL) err = send(sock, pkt, size, 0); #else struct sockaddr sa; - strcpy(sa.sa_data, conn->ifName); + strlcpy(sa.sa_data, conn->ifName, sizeof(sa.sa_data)); err = sendto(sock, pkt, size, 0, &sa, sizeof(sa)); #endif if (err < 0) { @@ -240,7 +248,7 @@ receivePacket(int sock, PPPoEPacket *pkt, int *size) error("error receiving pppoe packet: %m"); return -1; } - if (debug) + if (debug_on()) pppoe_log_packet("Recv ", pkt); return 0; }