summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Graf <tgr@lsx.localdomain>2008-05-14 21:08:06 (GMT)
committerThomas Graf <tgr@lsx.localdomain>2008-05-14 21:08:06 (GMT)
commit0cf780859cbce363a6e2cd4b8d19c5498a3530f5 (patch)
tree1caa26c26c02713db8bab0eb13f5f19533dc2189
parentb4fbe1d34d6f54045b5c6236d86aacd4340ec83d (diff)
downloadlibnl-0cf780859cbce363a6e2cd4b8d19c5498a3530f5.zip
libnl-0cf780859cbce363a6e2cd4b8d19c5498a3530f5.tar.gz
libnl-0cf780859cbce363a6e2cd4b8d19c5498a3530f5.tar.bz2
Check length of provided address label
-rw-r--r--include/netlink/route/addr.h2
-rw-r--r--lib/route/addr.c9
2 files changed, 8 insertions, 3 deletions
diff --git a/include/netlink/route/addr.h b/include/netlink/route/addr.h
index 9004ca0..a239072 100644
--- a/include/netlink/route/addr.h
+++ b/include/netlink/route/addr.h
@@ -42,7 +42,7 @@ extern int rtnl_addr_delete(struct nl_handle *,
extern char * rtnl_addr_flags2str(int, char *, size_t);
extern int rtnl_addr_str2flags(const char *);
-extern void rtnl_addr_set_label(struct rtnl_addr *, const char *);
+extern int rtnl_addr_set_label(struct rtnl_addr *, const char *);
extern char * rtnl_addr_get_label(struct rtnl_addr *);
extern void rtnl_addr_set_ifindex(struct rtnl_addr *, int);
diff --git a/lib/route/addr.c b/lib/route/addr.c
index 905dce2..1edcd69 100644
--- a/lib/route/addr.c
+++ b/lib/route/addr.c
@@ -850,10 +850,15 @@ int rtnl_addr_delete(struct nl_handle *handle, struct rtnl_addr *addr,
* @{
*/
-void rtnl_addr_set_label(struct rtnl_addr *addr, const char *label)
+int rtnl_addr_set_label(struct rtnl_addr *addr, const char *label)
{
- strncpy(addr->a_label, label, sizeof(addr->a_label) - 1);
+ if (strlen(label) > sizeof(addr->a_label) - 1)
+ return -NLE_RANGE;
+
+ strcpy(addr->a_label, label);
addr->ce_mask |= ADDR_ATTR_LABEL;
+
+ return 0;
}
char *rtnl_addr_get_label(struct rtnl_addr *addr)