diff options
author | Thomas Osterried <thomas@osterried.de> | 2009-04-09 13:25:14 +0000 |
---|---|---|
committer | Thomas Osterried <thomas@osterried.de> | 2009-04-09 13:25:14 +0000 |
commit | 49741bec9c1a5725f175a1a0f4b4e4c0eb6834a9 (patch) | |
tree | 473a475135f5bd7ec117ab771afa8f81fbcf0f72 /rsconfig.c | |
parent | ab92cf5d7b324c53c7a7c2ffbbb8d9b2ec18e722 (diff) |
nrconfig.c: call comparison fix.
axconfig.c, nrconfig.c and rsconfig.c:
assurances against null pointer deferences.
Diffstat (limited to 'rsconfig.c')
-rw-r--r-- | rsconfig.c | 58 |
1 files changed, 36 insertions, 22 deletions
@@ -49,9 +49,10 @@ static RS_Port *rs_port_ptr(char *name) return p; while (p != NULL) { - if (strcasecmp(name, p->Name) == 0) - return p; - + if (p->Name != NULL) { + if (strcasecmp(name, p->Name) == 0) + return p; + } p = p->Next; } @@ -84,9 +85,10 @@ char *rs_config_get_name(char *device) RS_Port *p = rs_ports; while (p != NULL) { - if (strcmp(device, p->Device) == 0) - return p->Name; - + if (p->Device != NULL) { + if (strcmp(device, p->Device) == 0) + return p->Name; + } p = p->Next; } @@ -119,11 +121,12 @@ char *rs_config_get_port(rose_address *address) rose_address addr; while (p != NULL) { - rose_aton(p->Addr, addr.rose_addr); + if (p->Addr != NULL) { + rose_aton(p->Addr, addr.rose_addr); - if (rose_cmp(address, &addr) == 0) - return p->Name; - + if (rose_cmp(address, &addr) == 0) + return p->Name; + } p = p->Next; } @@ -162,11 +165,11 @@ static int rs_config_init_port(int fd, int lineno, char *line, const char **ifca } for (p = rs_ports; p != NULL; p = p->Next) { - if (strcasecmp(name, p->Name) == 0) { + if (p->Name != NULL && strcasecmp(name, p->Name) == 0) { fprintf(stderr, "rsconfig: duplicate port name %s in line %d of config file\n", name, lineno); return FALSE; } - if (strcasecmp(addr, p->Addr) == 0) { + if (p->Addr != NULL && strcasecmp(addr, p->Addr) == 0) { fprintf(stderr, "rsconfig: duplicate address %s in line %d of config file\n", addr, lineno); return FALSE; } @@ -217,6 +220,7 @@ int rs_config_load_ports(void) int fd, lineno = 1, n = 0, i; const char **calllist = NULL; const char **devlist = NULL; + const char **pp; int callcount = 0; struct ifreq ifr; @@ -240,10 +244,11 @@ int rs_config_load_ports(void) s = strchr(buffer, ':'); if (s) *s = 0; s = buffer; - while (*s == ' ') ++s; + while (isspace(*s & 0xff)) ++s; memset(&ifr, 0, sizeof(ifr)); - strcpy(ifr.ifr_name, s); + strncpy(ifr.ifr_name, s, IFNAMSIZ-1); + ifr.ifr_name[IFNAMSIZ-1] = 0; if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { fprintf(stderr, "rsconfig: SIOCGIFHWADDR: %s\n", strerror(errno)); @@ -266,13 +271,21 @@ int rs_config_load_ports(void) continue; - calllist = realloc(calllist, sizeof(char *) * (callcount+2)); - devlist = realloc(devlist, sizeof(char *) * (callcount+2)); - calllist[callcount] = strdup(s); - devlist [callcount] = strdup(ifr.ifr_name); - ++callcount; - calllist[callcount] = NULL; - devlist [callcount] = NULL; + if ((pp = realloc(calllist, sizeof(char *) * (callcount+2))) == 0) + break; + calllist = pp; + if ((pp = realloc(devlist, sizeof(char *) * (callcount+2))) == 0) + break; + devlist = pp; + if ((calllist[callcount] = strdup(s)) != NULL) { + if ((devlist[callcount] = strdup(ifr.ifr_name)) != NULL) { + ++callcount; + calllist[callcount] = NULL; + devlist [callcount] = NULL; + } else { + free((void*)calllist[callcount]); + } + } } fclose(fp); fp = NULL; @@ -301,7 +314,8 @@ int rs_config_load_ports(void) for(i = 0; calllist && calllist[i]; ++i) { free((void*)calllist[i]); - free((void*)devlist[i]); + if (devlist[i] != NULL) + free((void*)devlist[i]); } if (calllist) free(calllist); if (devlist) free(devlist); |