From a5f25889216411ad7492047fafe6de03b8408440 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Sun, 9 May 2010 20:17:54 +0200 Subject: relax mnl_attr_type_valid() checkings and change errno value This patch relaxes strict attribute checkings in the example files. I have also changed the errno value, now it's EOPNOTSUPP instead of EINVAL. Signed-off-by: Pablo Neira Ayuso --- examples/genl-family-get.c | 19 +++++++------------ examples/nf-queue.c | 8 ++++---- examples/rtnl-link-dump.c | 7 +++---- examples/rtnl-link-dump2.c | 7 +++---- examples/rtnl-link-dump3.c | 8 ++++---- examples/rtnl-link-event.c | 7 +++---- examples/rtnl-route-dump.c | 15 +++++++-------- src/attr.c | 7 ++++++- 8 files changed, 37 insertions(+), 41 deletions(-) diff --git a/examples/genl-family-get.c b/examples/genl-family-get.c index 7b9acfa..326755e 100644 --- a/examples/genl-family-get.c +++ b/examples/genl-family-get.c @@ -17,10 +17,9 @@ static int parse_mc_grps_cb(const struct nlattr *attr, void *data) const struct nlattr **tb = (const struct nlattr **)data; int type = mnl_attr_get_type(attr); - if (mnl_attr_type_valid(attr, CTRL_ATTR_MCAST_GRP_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + /* skip unsupported attribute in user-space */ + if (mnl_attr_type_valid(attr, CTRL_ATTR_MCAST_GRP_MAX) < 0) + return MNL_CB_OK; switch(type) { case CTRL_ATTR_MCAST_GRP_ID: @@ -65,10 +64,8 @@ static int parse_family_ops_cb(const struct nlattr *attr, void *data) const struct nlattr **tb = (const struct nlattr **)data; int type = mnl_attr_get_type(attr); - if (mnl_attr_type_valid(attr, CTRL_ATTR_OP_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + if (mnl_attr_type_valid(attr, CTRL_ATTR_OP_MAX) < 0) + return MNL_CB_OK; switch(type) { case CTRL_ATTR_OP_ID: @@ -110,10 +107,8 @@ static int data_attr_cb(const struct nlattr *attr, void *data) const struct nlattr **tb = (const struct nlattr **)data; int type = mnl_attr_get_type(attr); - if (mnl_attr_type_valid(attr, CTRL_ATTR_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + if (mnl_attr_type_valid(attr, CTRL_ATTR_MAX) < 0) + return MNL_CB_OK; switch(type) { case CTRL_ATTR_FAMILY_NAME: diff --git a/examples/nf-queue.c b/examples/nf-queue.c index bde9db1..1df004a 100644 --- a/examples/nf-queue.c +++ b/examples/nf-queue.c @@ -26,10 +26,10 @@ static int parse_attr_cb(const struct nlattr *attr, void *data) const struct nlattr **tb = (const struct nlattr **)data; int type = mnl_attr_get_type(attr); - if (mnl_attr_type_valid(attr, NFQA_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + /* skip unsupported attribute in user-space */ + if (mnl_attr_type_valid(attr, NFQA_MAX) < 0) + return MNL_CB_OK; + switch(type) { case NFQA_MARK: case NFQA_IFINDEX_INDEV: diff --git a/examples/rtnl-link-dump.c b/examples/rtnl-link-dump.c index 4bbc997..8bce803 100644 --- a/examples/rtnl-link-dump.c +++ b/examples/rtnl-link-dump.c @@ -19,10 +19,9 @@ static int data_attr_cb(const struct nlattr *attr, void *data) const struct nlattr **tb = (const struct nlattr **)data; int type = mnl_attr_get_type(attr); - if (mnl_attr_type_valid(attr, IFLA_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + /* skip unsupported attribute in user-space */ + if (mnl_attr_type_valid(attr, IFLA_MAX) < 0) + return MNL_CB_OK; switch(type) { case IFLA_MTU: diff --git a/examples/rtnl-link-dump2.c b/examples/rtnl-link-dump2.c index 7162ab9..ac3a6be 100644 --- a/examples/rtnl-link-dump2.c +++ b/examples/rtnl-link-dump2.c @@ -16,10 +16,9 @@ static int data_attr_cb(const struct nlattr *attr, void *data) { - if (mnl_attr_type_valid(attr, IFLA_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + /* skip unsupported attribute in user-space */ + if (mnl_attr_type_valid(attr, IFLA_MAX) < 0) + return MNL_CB_OK; switch(mnl_attr_get_type(attr)) { case IFLA_MTU: diff --git a/examples/rtnl-link-dump3.c b/examples/rtnl-link-dump3.c index 07acfbd..3c1473e 100644 --- a/examples/rtnl-link-dump3.c +++ b/examples/rtnl-link-dump3.c @@ -31,10 +31,10 @@ static int data_cb(const struct nlmsghdr *nlh, void *data) mnl_attr_for_each(attr, nlh, sizeof(*ifm)) { int type = mnl_attr_get_type(attr); - if (mnl_attr_type_valid(attr, IFLA_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + /* skip unsupported attribute in user-space */ + if (mnl_attr_type_valid(attr, IFLA_MAX) < 0) + return MNL_CB_OK; + switch(type) { case IFLA_MTU: if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) { diff --git a/examples/rtnl-link-event.c b/examples/rtnl-link-event.c index b0bd5dc..aa51a1e 100644 --- a/examples/rtnl-link-event.c +++ b/examples/rtnl-link-event.c @@ -18,10 +18,9 @@ static int data_attr_cb(const struct nlattr *attr, void *data) const struct nlattr **tb = (const struct nlattr **)data; int type = mnl_attr_get_type(attr); - if (mnl_attr_type_valid(attr, IFLA_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + /* skip unsupported attribute in user-space */ + if (mnl_attr_type_valid(attr, IFLA_MAX) < 0) + return MNL_CB_OK; switch(type) { case IFLA_MTU: diff --git a/examples/rtnl-route-dump.c b/examples/rtnl-route-dump.c index bc038cd..34c95cf 100644 --- a/examples/rtnl-route-dump.c +++ b/examples/rtnl-route-dump.c @@ -17,10 +17,10 @@ static int data_attr_cb2(const struct nlattr *attr, void *data) { - if (mnl_attr_type_valid(attr, RTAX_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + /* skip unsupported attribute in user-space */ + if (mnl_attr_type_valid(attr, RTAX_MAX) < 0) + return MNL_CB_OK; + if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) { perror("mnl_attr_validate"); return MNL_CB_ERROR; @@ -76,10 +76,9 @@ static int data_attr_cb(const struct nlattr *attr, void *data) const struct nlattr **tb = (const struct nlattr **)data; int type = mnl_attr_get_type(attr); - if (mnl_attr_type_valid(attr, RTA_MAX) < 0) { - perror("mnl_attr_type_valid"); - return MNL_CB_ERROR; - } + /* skip unsupported attribute in user-space */ + if (mnl_attr_type_valid(attr, RTA_MAX) < 0) + return MNL_CB_OK; switch(type) { case RTA_TABLE: diff --git a/src/attr.c b/src/attr.c index 37fa798..d220652 100644 --- a/src/attr.c +++ b/src/attr.c @@ -115,11 +115,16 @@ struct nlattr *mnl_attr_next(const struct nlattr *attr, int *len) * This function allows to check if the attribute type is higher than the * maximum supported type. If the attribute type is invalid, this function * returns -1 and errno is explicitly set. On success, this function returns 1. + * + * Strict attribute checking in user-space is not a good idea since you may + * run an old application with a newer kernel that supports new attributes. + * This leads to backward compatibility breakages in user-space. Better check + * if you support an attribute, if not, skip it. */ int mnl_attr_type_valid(const struct nlattr *attr, uint16_t max) { if (mnl_attr_get_type(attr) > max) { - errno = EINVAL; + errno = EOPNOTSUPP; return -1; } return 1; -- cgit v1.2.3