do {
const char *line;
- char **cargv;
- int n, cargc;
+ char **cargv = NULL;
+ int n, cargc = 0;
if (!is_lldpctl(NULL) && (optind >= argc)) {
line = readline(prompt());
if (line == NULL) break; /* EOF */
i++)
if (input[2*i] != empty) word[j++] = input[2*i];
char **nargv = realloc(iargv, sizeof(char*) * (iargc + 1));
- if (!nargv) goto error;
+ if (!nargv) {
+ free(word);
+ goto error;
+ }
nargv[iargc++] = word;
iargv = nargv;
wbegin = -1;
}
break;
case CDP_TLV_PORT:
+ if (tlv_len == 0) {
+ log_warn("cd[", "too short port description received");
+ goto malformed;
+ }
if ((port->p_descr = (char *)calloc(1, tlv_len + 1)) == NULL) {
log_warn("cdp", "unable to allocate memory for port description");
goto malformed;
break;
}
- if ((state == 1) && (v == 0)) /* No VLAN, no need to send another TLV */
+ if ((state == 1) && (v == 0)) {
+ /* No VLAN, no need to send another TLV */
+ free(packet);
break;
+ }
#endif
/* Null TLV */
PEEK_DISCARD(4); /* Reserved */
PEEK_BYTES(&address, sizeof(address));
- if ((lvlan->v_name = (char *)calloc(1,
- tlv_len + 1 - 12)) == NULL) {
- log_warn("edp", "unable to allocate vlan name");
- free(lvlan);
- goto malformed;
- }
- PEEK_BYTES(lvlan->v_name, tlv_len - 12);
-
if (address.s_addr != INADDR_ANY) {
mgmt = lldpd_alloc_mgmt(LLDPD_AF_IPV4, &address,
sizeof(struct in_addr), 0);
if (mgmt == NULL) {
- assert(errno == ENOMEM);
log_warn("edp", "Out of memory");
goto malformed;
}
TAILQ_INSERT_TAIL(&chassis->c_mgmt, mgmt, m_entries);
}
+
+ if ((lvlan->v_name = (char *)calloc(1,
+ tlv_len + 1 - 12)) == NULL) {
+ log_warn("edp", "unable to allocate vlan name");
+ goto malformed;
+ }
+ PEEK_BYTES(lvlan->v_name, tlv_len - 12);
+
TAILQ_INSERT_TAIL(&port->p_vlans,
lvlan, v_entries);
+ lvlan = NULL;
#endif
gotvlans = 1;
break;
return 1;
malformed:
+ free(lvlan);
lldpd_chassis_cleanup(chassis, 1);
lldpd_port_cleanup(port, 1);
free(port);
}
client->cfg = cfg;
evutil_make_socket_nonblocking(s);
+ TAILQ_INSERT_TAIL(&lldpd_clients, client, next);
if ((client->bev = bufferevent_socket_new(cfg->g_base, s,
BEV_OPT_CLOSE_ON_FREE)) == NULL) {
log_warnx("event", "unable to allocate a new buffer event for new client");
client);
bufferevent_enable(client->bev, EV_READ | EV_WRITE);
log_debug("event", "new client accepted");
- TAILQ_INSERT_TAIL(&lldpd_clients, client, next);
return;
accept_failed:
levent_ctl_free_client(client);
u_int8_t *pos, *tlv;
char *b;
#ifdef ENABLE_DOT1
- struct lldpd_vlan *vlan;
+ struct lldpd_vlan *vlan = NULL;
int vlan_len;
struct lldpd_ppvid *ppvid;
- struct lldpd_pi *pi;
+ struct lldpd_pi *pi = NULL;
#endif
struct lldpd_mgmt *mgmt;
int af;
log_warn("lldp", "unable to alloc vlan name for "
"tlv received on %s",
hardware->h_ifname);
- free(vlan);
goto malformed;
}
PEEK_BYTES(vlan->v_name, vlan_len);
TAILQ_INSERT_TAIL(&port->p_vlans,
vlan, v_entries);
+ vlan = NULL;
break;
case LLDP_TLV_DOT1_PVID:
CHECK_TLV_SIZE(6, "PVID");
log_warn("lldp", "unable to alloc pid name for "
"tlv received on %s",
hardware->h_ifname);
- free(pi);
goto malformed;
}
PEEK_BYTES(pi->p_pi, pi->p_pi_len);
TAILQ_INSERT_TAIL(&port->p_pids,
pi, p_entries);
+ pi = NULL;
break;
default:
/* Unknown Dot1 TLV, ignore it */
*newport = port;
return 1;
malformed:
+#ifdef ENABLE_DOT1
+ free(vlan);
+ free(pi);
+#endif
lldpd_chassis_cleanup(chassis, 1);
lldpd_port_cleanup(port, 1);
free(port);
struct iovec iov = {
.iov_base = "READY=1",
- .iov_len = strlen(iov.iov_base)
+ .iov_len = strlen("READY=1")
};
struct msghdr hdr = {
.msg_name = &su,
void log_warnx(const char *, const char *, ...) __attribute__ ((format (printf, 2, 3)));
void log_info(const char *, const char *, ...) __attribute__ ((format (printf, 2, 3)));
void log_debug(const char *, const char *, ...) __attribute__ ((format (printf, 2, 3)));
-void fatal(const char*, const char *);
-void fatalx(const char *);
+void fatal(const char*, const char *) __attribute__((__noreturn__));
+void fatalx(const char *) __attribute__((__noreturn__));
void log_register(void (*cb)(int, const char*));
void log_accept(const char *);