diff --git a/conf/cf-lex.l b/conf/cf-lex.l index c3154b36..9bbb3660 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -100,6 +100,7 @@ static struct include_file_stack *ifs_head; #define YY_INPUT(buf,result,max) result = cf_read_hook(buf, max, ifs->fd); #define YY_NO_UNPUT #define YY_FATAL_ERROR(msg) cf_error(msg) +#define YY_USER_ACTION ifs->chno += yyleng; ifs->toklen = yyleng; static void cf_include(char *arg, int alen); static int check_eof(void); @@ -313,7 +314,7 @@ else: { {WHITE}+ -\n ifs->lino++; +\n ifs->lino++; ifs->chno = 0; # BEGIN(COMMENT); @@ -323,13 +324,14 @@ else: { \n { ifs->lino++; + ifs->chno = 0; BEGIN(INITIAL); } . \*\/ BEGIN(INITIAL); -\n ifs->lino++; +\n ifs->lino++; ifs->chno = 0; \/\* cf_error("Comment nesting not supported"); <> cf_error("Unterminated comment"); . diff --git a/conf/conf.c b/conf/conf.c index 885e2e7e..8dbefe96 100644 --- a/conf/conf.c +++ b/conf/conf.c @@ -512,6 +512,7 @@ cf_error(const char *msg, ...) va_end(args); new_config->err_msg = cfg_strdup(buf); new_config->err_lino = ifs->lino; + new_config->err_chno = ifs->chno - ifs->toklen + 1; new_config->err_file_name = ifs->file_name; cf_lex_unwind(); longjmp(conf_jmpbuf, 1); diff --git a/conf/conf.h b/conf/conf.h index f174d352..5689fb67 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -47,6 +47,7 @@ struct config { u32 watchdog_timeout; /* Watchdog timeout (in seconds, 0 = disabled) */ char *err_msg; /* Parser error message */ int err_lino; /* Line containing error */ + int err_chno; /* Character where the parser stopped */ char *err_file_name; /* File name containing error */ char *file_name; /* Name of main configuration file */ int file_fd; /* File descriptor of main configuration file */ @@ -139,6 +140,8 @@ struct include_file_stack { char *file_name; /* File name */ int fd; /* File descriptor */ int lino; /* Current line num */ + int chno; /* Current char num (on current line) */ + int toklen; /* Current token length */ int depth; /* Include depth, 0 = cannot include */ struct include_file_stack *prev; /* Previous record in stack */ @@ -147,7 +150,6 @@ struct include_file_stack { extern struct include_file_stack *ifs; - int cf_lex(void); void cf_lex_init(int is_cli, struct config *c); void cf_lex_unwind(void); diff --git a/lib/printf.c b/lib/printf.c index cafeeb93..c2065d9a 100644 --- a/lib/printf.c +++ b/lib/printf.c @@ -424,6 +424,7 @@ int bvsnprintf(char *buf, int size, const char *fmt, va_list args) case 'X': flags |= LARGE; + /* fallthrough */ case 'x': base = 16; break; diff --git a/nest/a-path.c b/nest/a-path.c index 6bad9747..6f1c40bf 100644 --- a/nest/a-path.c +++ b/nest/a-path.c @@ -805,7 +805,7 @@ as_path_match(const struct adata *path, struct f_path_mask *mask) val2 = val = mask->val; goto step; case PM_ASN_EXPR: - ASSERT(0); + bug("Expressions should be evaluated on AS path mask construction."); case PM_ASN_RANGE: val = mask->val; val2 = mask->val2; diff --git a/proto/bfd/packets.c b/proto/bfd/packets.c index b76efda6..6d5151ea 100644 --- a/proto/bfd/packets.c +++ b/proto/bfd/packets.c @@ -141,6 +141,7 @@ bfd_fill_authentication(struct bfd_proto *p, struct bfd_session *s, struct bfd_c case BFD_AUTH_METICULOUS_KEYED_MD5: case BFD_AUTH_METICULOUS_KEYED_SHA1: meticulous = 1; + /* fallthrough */ case BFD_AUTH_KEYED_MD5: case BFD_AUTH_KEYED_SHA1: @@ -230,6 +231,7 @@ bfd_check_authentication(struct bfd_proto *p, struct bfd_session *s, struct bfd_ case BFD_AUTH_METICULOUS_KEYED_MD5: case BFD_AUTH_METICULOUS_KEYED_SHA1: meticulous = 1; + /* fallthrough */ case BFD_AUTH_KEYED_MD5: case BFD_AUTH_KEYED_SHA1: diff --git a/proto/ospf/dbdes.c b/proto/ospf/dbdes.c index 2626a24c..019aff04 100644 --- a/proto/ospf/dbdes.c +++ b/proto/ospf/dbdes.c @@ -353,6 +353,7 @@ ospf_receive_dbdes(struct ospf_packet *pkt, struct ospf_iface *ifa, ospf_neigh_sm(n, INM_2WAYREC); if (n->state != NEIGHBOR_EXSTART) return; + /* fallthrough */ case NEIGHBOR_EXSTART: if ((ifa->type != OSPF_IT_VLINK) && diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index 150f519f..327ad0a4 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -1200,6 +1200,7 @@ ospf_sh_state(struct proto *P, int verbose, int reachable) he->domain = 1; /* Abuse domain field to mark the LSA */ hex[jx++] = he; } + /* fallthrough */ default: accept = 0; } diff --git a/proto/ospf/packet.c b/proto/ospf/packet.c index db387661..599f3094 100644 --- a/proto/ospf/packet.c +++ b/proto/ospf/packet.c @@ -57,6 +57,7 @@ ospf_pkt_finalize2(struct ospf_iface *ifa, struct ospf_packet *pkt, uint *plen) return; } strncpy(auth->password, pass->password, sizeof(auth->password)); + /* fallthrough */ case OSPF_AUTH_NONE: { diff --git a/proto/radv/radv.c b/proto/radv/radv.c index 389f598c..a381f737 100644 --- a/proto/radv/radv.c +++ b/proto/radv/radv.c @@ -230,6 +230,7 @@ radv_iface_notify(struct radv_iface *ifa, int event) { case RA_EV_CHANGE: radv_invalidate(ifa); + /* fallthrough */ case RA_EV_INIT: ifa->initial = MAX_INITIAL_RTR_ADVERTISEMENTS; radv_prepare_prefixes(ifa); diff --git a/proto/rip/packets.c b/proto/rip/packets.c index 1b65362f..59ffd7c2 100644 --- a/proto/rip/packets.c +++ b/proto/rip/packets.c @@ -58,13 +58,17 @@ struct rip_block_auth { u16 must_be_ffff; u16 auth_type; - char password[0]; - u16 packet_len; - u8 key_id; - u8 auth_len; - u32 seq_num; - u32 unused1; - u32 unused2; + union { + char password[16]; + struct { + u16 packet_len; + u8 key_id; + u8 auth_len; + u32 seq_num; + u32 unused1; + u32 unused2; + }; + }; }; /* Authentication tail, RFC 4822 */ diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index a960b7f8..4455fc19 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -1128,7 +1128,7 @@ sk_ssh_connect(sock *s) default: return SSH_ERROR; } - } + } /* fallthrough */ case SK_SSH_SERVER_KNOWN: { @@ -1175,7 +1175,7 @@ sk_ssh_connect(sock *s) if (!server_identity_is_ok) return SSH_ERROR; } - } + } /* fallthrough */ case SK_SSH_USERAUTH: { @@ -1191,7 +1191,7 @@ sk_ssh_connect(sock *s) default: return SSH_ERROR; } - } + } /* fallthrough */ case SK_SSH_CHANNEL: { @@ -1199,7 +1199,7 @@ sk_ssh_connect(sock *s) s->ssh->channel = ssh_channel_new(s->ssh->session); if (s->ssh->channel == NULL) return SSH_ERROR; - } + } /* fallthrough */ case SK_SSH_SESSION: { @@ -1215,7 +1215,7 @@ sk_ssh_connect(sock *s) default: return SSH_ERROR; } - } + } /* fallthrough */ case SK_SSH_SUBSYSTEM: { @@ -1234,7 +1234,7 @@ sk_ssh_connect(sock *s) return SSH_ERROR; } } - } + } /* fallthrough */ case SK_SSH_ESTABLISHED: s->ssh->state = SK_SSH_ESTABLISHED; diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index a79df54e..794ebcd0 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -784,7 +784,8 @@ krt_got_route_async(struct krt_proto *p, rte *e, int new) switch (e->u.krt.src) { case KRT_SRC_BIRD: - ASSERT(0); /* Should be filtered by the back end */ + /* Should be filtered by the back end */ + bug("BIRD originated routes should not get here."); case KRT_SRC_REDIRECT: if (new) diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index c4e640a3..b1c796c6 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -214,7 +214,7 @@ read_config(void) if (!unix_read_config(&conf, config_name)) { if (conf->err_msg) - die("%s, line %d: %s", conf->err_file_name, conf->err_lino, conf->err_msg); + die("%s:%d:%d %s", conf->err_file_name, conf->err_lino, conf->err_chno, conf->err_msg); else die("Unable to open configuration file %s: %m", config_name); } @@ -231,7 +231,7 @@ async_config(void) if (!unix_read_config(&conf, config_name)) { if (conf->err_msg) - log(L_ERR "%s, line %d: %s", conf->err_file_name, conf->err_lino, conf->err_msg); + log(L_ERR "%s:%d:%d %s", conf->err_file_name, conf->err_lino, conf->err_chno, conf->err_msg); else log(L_ERR "Unable to open configuration file %s: %m", config_name); config_free(conf); @@ -252,7 +252,7 @@ cmd_read_config(char *name) if (!unix_read_config(&conf, name)) { if (conf->err_msg) - cli_msg(8002, "%s, line %d: %s", conf->err_file_name, conf->err_lino, conf->err_msg); + cli_msg(8002, "%s:%d:%d %s", conf->err_file_name, conf->err_lino, conf->err_chno, conf->err_msg); else cli_msg(8002, "%s: %m", name); config_free(conf);