]> rtime.felk.cvut.cz Git - lisovros/iproute2_canprio.git/blobdiff - ip/ipmaddr.c
Add reference to tc-codel(8) to the SEE ALSO section
[lisovros/iproute2_canprio.git] / ip / ipmaddr.c
index b2c4adc0e9e2b15261bd98fb54838f4e5cde73e5..3ae947800ef4bf1f7e6f1e2e95614b54fcd54a93 100644 (file)
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>
+
 #include <linux/netdevice.h>
 #include <linux/if.h>
 #include <linux/if_arp.h>
 #include <linux/sockios.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <string.h>
 
 #include "rt_names.h"
 #include "utils.h"
@@ -42,11 +43,11 @@ static void usage(void)
        exit(-1);
 }
 
-static int parse_hex(char *str, unsigned char *addr)
+static int parse_hex(char *str, unsigned char *addr, size_t size)
 {
        int len=0;
 
-       while (*str) {
+       while (*str && (len < 2 * size)) {
                int tmp;
                if (str[1] == 0)
                        return -1;
@@ -103,7 +104,7 @@ void read_dev_mcast(struct ma_info **result_p)
 
                m.addr.family = AF_PACKET;
 
-               len = parse_hex(hexa, (unsigned char*)&m.addr.data);
+               len = parse_hex(hexa, (unsigned char*)&m.addr.data, sizeof (m.addr.data));
                if (len >= 0) {
                        struct ma_info *ma = malloc(sizeof(m));
 
@@ -127,14 +128,17 @@ void read_igmp(struct ma_info **result_p)
        if (!fp)
                return;
        memset(&m, 0, sizeof(m));
-       fgets(buf, sizeof(buf), fp);
+       if (!fgets(buf, sizeof(buf), fp)) {
+               fclose(fp);
+               return;
+       }
 
        m.addr.family = AF_INET;
        m.addr.bitlen = 32;
        m.addr.bytelen = 4;
 
        while (fgets(buf, sizeof(buf), fp)) {
-               struct ma_info *ma = malloc(sizeof(m));
+               struct ma_info *ma;
 
                if (buf[0] != '\t') {
                        sscanf(buf, "%d%s", &m.index, m.name);
@@ -175,7 +179,7 @@ void read_igmp6(struct ma_info **result_p)
 
                m.addr.family = AF_INET6;
 
-               len = parse_hex(hexa, (unsigned char*)&m.addr.data);
+               len = parse_hex(hexa, (unsigned char*)&m.addr.data, sizeof (m.addr.data));
                if (len >= 0) {
                        struct ma_info *ma = malloc(sizeof(m));
 
@@ -211,7 +215,7 @@ static void print_maddr(FILE *fp, struct ma_info *list)
                        fprintf(fp, "family %d ", list->addr.family);
                        break;
                }
-               fprintf(fp, "%s", 
+               fprintf(fp, "%s",
                        format_host(list->addr.family,
                                    -1,
                                    list->addr.data,
@@ -297,7 +301,8 @@ int multiaddr_modify(int cmd, int argc, char **argv)
                                usage();
                        if (ifr.ifr_hwaddr.sa_data[0])
                                duparg("address", *argv);
-                       if (ll_addr_a2n(ifr.ifr_hwaddr.sa_data, 14, *argv) < 0) {
+                       if (ll_addr_a2n(ifr.ifr_hwaddr.sa_data,
+                                       14, *argv) < 0) {
                                fprintf(stderr, "Error: \"%s\" is not a legal ll address.\n", *argv);
                                exit(1);
                        }