Possible problems found by static analysis of code.
[platform/upstream/net-tools.git] / ipmaddr.c
index 1b64474..3e3f821 100644 (file)
--- a/ipmaddr.c
+++ b/ipmaddr.c
@@ -8,6 +8,9 @@
  *
  * Authors:    Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  *
+ * Changes:    Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ *             20010404 - use setlocale
+ *
  */
 
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <sys/socket.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>
 
+#if defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1))
+#include <net/if.h>
+#else
+#include <linux/if.h>
+#endif
+
+#include "config.h"
 #include "intl.h"
-#include "utils.h"
+#include "util.h"
+#include "util-ank.h"
 #include "net-support.h"
 #include "version.h"
 #include "pathnames.h"
@@ -39,7 +46,7 @@ int  filter_family;
 #define DELADDR                2
 
 char *Release = RELEASE,
-     *Version = "ipmaddr 1.0",
+     *Version = "ipmaddr 1.1",
      *Signature = "Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>";
 
 static void version(void)
@@ -69,7 +76,7 @@ static void print_lla(FILE *fp, int len, unsigned char *addr)
        }
 }
 
-static int parse_lla(char *str, unsigned char *addr)
+static int parse_lla(char *str, char *addr)
 {
        int len=0;
 
@@ -153,8 +160,7 @@ void read_dev_mcast(struct ma_info **result_p)
 
                len = parse_hex(hexa, (unsigned char*)&m.addr.data);
                if (len >= 0) {
-                       struct ma_info *ma = malloc(sizeof(m));
-
+                       struct ma_info *ma = xmalloc(sizeof(m));
                        memcpy(ma, &m, sizeof(m));
                        ma->addr.bytelen = len;
                        ma->addr.bitlen = len<<3;
@@ -168,22 +174,21 @@ void read_dev_mcast(struct ma_info **result_p)
 
 void read_igmp(struct ma_info **result_p)
 {
-       struct ma_info m;
+       struct ma_info m, *ma = NULL;
        char buf[256];
        FILE *fp = fopen(_PATH_PROCNET_IGMP, "r");
 
        if (!fp)
                return;
        memset(&m, 0, sizeof(m));
-       fgets(buf, sizeof(buf), fp);
+       if (fgets(buf, sizeof(buf), fp))
+               /* eat line */;
 
        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));
-
                if (buf[0] != '\t') {
                        sscanf(buf, "%d%s", &m.index, m.name);
                        continue;
@@ -194,7 +199,7 @@ void read_igmp(struct ma_info **result_p)
 
                sscanf(buf, "%08x%d", (__u32*)&m.addr.data, &m.users);
 
-               ma = malloc(sizeof(m));
+               ma = xmalloc(sizeof(m));
                memcpy(ma, &m, sizeof(m));
                maddr_ins(result_p, ma);
        }
@@ -225,8 +230,7 @@ void read_igmp6(struct ma_info **result_p)
 
                len = parse_hex(hexa, (unsigned char*)&m.addr.data);
                if (len >= 0) {
-                       struct ma_info *ma = malloc(sizeof(m));
-
+                       struct ma_info *ma = xmalloc(sizeof(m));
                        memcpy(ma, &m, sizeof(m));
 
                        ma->addr.bytelen = len;
@@ -285,13 +289,15 @@ static void print_mlist(FILE *fp, struct ma_info *list)
 static int multiaddr_list(int argc, char **argv)
 {
        struct ma_info *list = NULL;
+       size_t l;
 
        while (argc > 0) {
                if (strcmp(*argv, "dev") == 0) {
                        NEXT_ARG();
-                       if (filter_dev[0])
+                       l = strlen(*argv);
+                       if (l <= 0 || l >= sizeof(filter_dev))
                                usage();
-                       strcpy(filter_dev, *argv);
+                       strncpy(filter_dev, *argv, sizeof (filter_dev));
                } else if (strcmp(*argv, "all") == 0) {
                        filter_family = AF_UNSPEC;
                } else if (strcmp(*argv, "ipv4") == 0) {
@@ -301,9 +307,10 @@ static int multiaddr_list(int argc, char **argv)
                } else if (strcmp(*argv, "link") == 0) {
                        filter_family = AF_PACKET;
                } else {
-                       if (filter_dev[0])
+                       l = strlen(*argv);
+                       if (l <= 0 || l >= sizeof(filter_dev))
                                usage();
-                       strcpy(filter_dev, *argv);
+                       strncpy(filter_dev, *argv, sizeof (filter_dev));
                }
                argv++; argc--;
        }
@@ -384,6 +391,12 @@ int main(int argc, char **argv)
 {
        char *basename;
 
+#if I18N
+       setlocale (LC_ALL, "");
+       bindtextdomain("net-tools", "/usr/share/locale");
+       textdomain("net-tools");
+#endif
+
        basename = strrchr(argv[0], '/');
        if (basename == NULL)
                basename = argv[0];