1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
Bugzilla Bug 176714 – *** stack smashing detected ***: /sbin/ifconfig terminated
--- lib/interface.c-old 2005-12-30 11:08:15.000000000 -0800
+++ lib/interface.c 2005-12-30 11:17:02.000000000 -0800
@@ -201,10 +201,11 @@
return err;
}
-static char *get_name(char *name, char *p)
+static char *get_name(char **namep, char *p)
{
while (isspace(*p))
p++;
+ char *name = *namep = p;
while (*p) {
if (isspace(*p))
break;
@@ -305,9 +306,10 @@
{
static int proc_read;
FILE *fh;
- char buf[512];
struct interface *ife;
int err;
+ char *line = NULL;
+ size_t linelen = 0;
if (proc_read)
return 0;
@@ -320,8 +322,11 @@
_PATH_PROCNET_DEV, strerror(errno));
return if_readconf();
}
- fgets(buf, sizeof buf, fh); /* eat line */
- fgets(buf, sizeof buf, fh);
+ if (getline(&line, &linelen, fh) == -1 /* eat line */
+ || getline(&line, &linelen, fh) == -1) {
+ err = -1;
+ goto out;
+ }
#if 0 /* pretty, but can't cope with missing fields */
fmt = proc_gen_fmt(_PATH_PROCNET_DEV, 1, fh,
@@ -346,13 +351,13 @@
if (!fmt)
return -1;
#else
- procnetdev_vsn = procnetdev_version(buf);
+ procnetdev_vsn = procnetdev_version(line);
#endif
err = 0;
- while (fgets(buf, sizeof buf, fh)) {
- char *s, name[IFNAMSIZ];
- s = get_name(name, buf);
+ while (getline(&line, &linelen, fh) != -1) {
+ char *s, *name;
+ s = get_name(&name, line);
ife = add_interface(name);
get_dev_fields(s, ife);
ife->statistics_valid = 1;
@@ -368,6 +373,8 @@
#if 0
free(fmt);
#endif
+ out:
+ free(line);
fclose(fh);
return err;
}
@@ -376,8 +383,9 @@
static int if_readlist_rep(char *target, struct interface *ife)
{
FILE *fh;
- char buf[512];
int err;
+ char *line = NULL;
+ size_t linelen = 0;
fh = fopen(_PATH_PROCNET_DEV, "r");
if (!fh) {
@@ -385,15 +393,18 @@
_PATH_PROCNET_DEV, strerror(errno));
return if_readconf();
}
- fgets(buf, sizeof buf, fh); /* eat line */
- fgets(buf, sizeof buf, fh);
+ if (getline(&line, &linelen, fh) == -1 /* eat line */
+ || getline(&line, &linelen, fh) == -1) {
+ err = -1;
+ goto out;
+ }
- procnetdev_vsn = procnetdev_version(buf);
+ procnetdev_vsn = procnetdev_version(line);
err = 0;
- while (fgets(buf, sizeof buf, fh)) {
- char *s, name[IFNAMSIZ];
- s = get_name(name, buf);
+ while (getline(&line, &linelen, fh) != -1) {
+ char *s, *name;
+ s = get_name(&name, line);
get_dev_fields(s, ife);
if (target && !strcmp(target,name))
{
@@ -406,6 +417,8 @@
err = -1;
}
+ out:
+ free(line);
fclose(fh);
return err;
}
|