lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <ZUP81f/bQ7yjt4W/@tissot.1015granger.net> Date: Thu, 2 Nov 2023 15:47:33 -0400 From: Chuck Lever <chuck.lever@...cle.com> To: Jakub Kicinski <kuba@...nel.org> Cc: davem@...emloft.net, netdev@...r.kernel.org, edumazet@...gle.com, pabeni@...hat.com, lorenzo@...nel.org Subject: Re: [PATCH net] nfsd: regenerate user space parsers after ynl-gen changes On Thu, Nov 02, 2023 at 11:52:27AM -0700, Jakub Kicinski wrote: > Commit 8cea95b0bd79 ("tools: ynl-gen: handle do ops with no input attrs") > added support for some of the previously-skipped ops in nfsd. > Regenerate the user space parsers to fill them in. > > Signed-off-by: Jakub Kicinski <kuba@...nel.org> > --- > CC: chuck.lever@...cle.com > CC: lorenzo@...nel.org Acked-by: Chuck Lever <chuck.lever@...cle.com> > --- > include/uapi/linux/nfsd_netlink.h | 6 +- > tools/net/ynl/generated/nfsd-user.c | 120 ++++++++++++++++++++++++++-- > tools/net/ynl/generated/nfsd-user.h | 44 ++++++++-- > 3 files changed, 156 insertions(+), 14 deletions(-) > > diff --git a/include/uapi/linux/nfsd_netlink.h b/include/uapi/linux/nfsd_netlink.h > index c8ae72466ee6..3cd044edee5d 100644 > --- a/include/uapi/linux/nfsd_netlink.h > +++ b/include/uapi/linux/nfsd_netlink.h > @@ -3,8 +3,8 @@ > /* Documentation/netlink/specs/nfsd.yaml */ > /* YNL-GEN uapi header */ > > -#ifndef _UAPI_LINUX_NFSD_H > -#define _UAPI_LINUX_NFSD_H > +#ifndef _UAPI_LINUX_NFSD_NETLINK_H > +#define _UAPI_LINUX_NFSD_NETLINK_H > > #define NFSD_FAMILY_NAME "nfsd" > #define NFSD_FAMILY_VERSION 1 > @@ -36,4 +36,4 @@ enum { > NFSD_CMD_MAX = (__NFSD_CMD_MAX - 1) > }; > > -#endif /* _UAPI_LINUX_NFSD_H */ > +#endif /* _UAPI_LINUX_NFSD_NETLINK_H */ > diff --git a/tools/net/ynl/generated/nfsd-user.c b/tools/net/ynl/generated/nfsd-user.c > index fec6828680ce..360b6448c6e9 100644 > --- a/tools/net/ynl/generated/nfsd-user.c > +++ b/tools/net/ynl/generated/nfsd-user.c > @@ -50,9 +50,116 @@ struct ynl_policy_nest nfsd_rpc_status_nest = { > /* Common nested types */ > /* ============== NFSD_CMD_RPC_STATUS_GET ============== */ > /* NFSD_CMD_RPC_STATUS_GET - dump */ > -void nfsd_rpc_status_get_list_free(struct nfsd_rpc_status_get_list *rsp) > +int nfsd_rpc_status_get_rsp_dump_parse(const struct nlmsghdr *nlh, void *data) > { > - struct nfsd_rpc_status_get_list *next = rsp; > + struct nfsd_rpc_status_get_rsp_dump *dst; > + struct ynl_parse_arg *yarg = data; > + unsigned int n_compound_ops = 0; > + const struct nlattr *attr; > + int i; > + > + dst = yarg->data; > + > + if (dst->compound_ops) > + return ynl_error_parse(yarg, "attribute already present (rpc-status.compound-ops)"); > + > + mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { > + unsigned int type = mnl_attr_get_type(attr); > + > + if (type == NFSD_A_RPC_STATUS_XID) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.xid = 1; > + dst->xid = mnl_attr_get_u32(attr); > + } else if (type == NFSD_A_RPC_STATUS_FLAGS) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.flags = 1; > + dst->flags = mnl_attr_get_u32(attr); > + } else if (type == NFSD_A_RPC_STATUS_PROG) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.prog = 1; > + dst->prog = mnl_attr_get_u32(attr); > + } else if (type == NFSD_A_RPC_STATUS_VERSION) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.version = 1; > + dst->version = mnl_attr_get_u8(attr); > + } else if (type == NFSD_A_RPC_STATUS_PROC) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.proc = 1; > + dst->proc = mnl_attr_get_u32(attr); > + } else if (type == NFSD_A_RPC_STATUS_SERVICE_TIME) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.service_time = 1; > + dst->service_time = mnl_attr_get_u64(attr); > + } else if (type == NFSD_A_RPC_STATUS_SADDR4) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.saddr4 = 1; > + dst->saddr4 = mnl_attr_get_u32(attr); > + } else if (type == NFSD_A_RPC_STATUS_DADDR4) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.daddr4 = 1; > + dst->daddr4 = mnl_attr_get_u32(attr); > + } else if (type == NFSD_A_RPC_STATUS_SADDR6) { > + unsigned int len; > + > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + > + len = mnl_attr_get_payload_len(attr); > + dst->_present.saddr6_len = len; > + dst->saddr6 = malloc(len); > + memcpy(dst->saddr6, mnl_attr_get_payload(attr), len); > + } else if (type == NFSD_A_RPC_STATUS_DADDR6) { > + unsigned int len; > + > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + > + len = mnl_attr_get_payload_len(attr); > + dst->_present.daddr6_len = len; > + dst->daddr6 = malloc(len); > + memcpy(dst->daddr6, mnl_attr_get_payload(attr), len); > + } else if (type == NFSD_A_RPC_STATUS_SPORT) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.sport = 1; > + dst->sport = mnl_attr_get_u16(attr); > + } else if (type == NFSD_A_RPC_STATUS_DPORT) { > + if (ynl_attr_validate(yarg, attr)) > + return MNL_CB_ERROR; > + dst->_present.dport = 1; > + dst->dport = mnl_attr_get_u16(attr); > + } else if (type == NFSD_A_RPC_STATUS_COMPOUND_OPS) { > + n_compound_ops++; > + } > + } > + > + if (n_compound_ops) { > + dst->compound_ops = calloc(n_compound_ops, sizeof(*dst->compound_ops)); > + dst->n_compound_ops = n_compound_ops; > + i = 0; > + mnl_attr_for_each(attr, nlh, sizeof(struct genlmsghdr)) { > + if (mnl_attr_get_type(attr) == NFSD_A_RPC_STATUS_COMPOUND_OPS) { > + dst->compound_ops[i] = mnl_attr_get_u32(attr); > + i++; > + } > + } > + } > + > + return MNL_CB_OK; > +} > + > +void > +nfsd_rpc_status_get_rsp_list_free(struct nfsd_rpc_status_get_rsp_list *rsp) > +{ > + struct nfsd_rpc_status_get_rsp_list *next = rsp; > > while ((void *)next != YNL_LIST_END) { > rsp = next; > @@ -65,15 +172,16 @@ void nfsd_rpc_status_get_list_free(struct nfsd_rpc_status_get_list *rsp) > } > } > > -struct nfsd_rpc_status_get_list *nfsd_rpc_status_get_dump(struct ynl_sock *ys) > +struct nfsd_rpc_status_get_rsp_list * > +nfsd_rpc_status_get_dump(struct ynl_sock *ys) > { > struct ynl_dump_state yds = {}; > struct nlmsghdr *nlh; > int err; > > yds.ys = ys; > - yds.alloc_sz = sizeof(struct nfsd_rpc_status_get_list); > - yds.cb = nfsd_rpc_status_get_rsp_parse; > + yds.alloc_sz = sizeof(struct nfsd_rpc_status_get_rsp_list); > + yds.cb = nfsd_rpc_status_get_rsp_dump_parse; > yds.rsp_cmd = NFSD_CMD_RPC_STATUS_GET; > yds.rsp_policy = &nfsd_rpc_status_nest; > > @@ -86,7 +194,7 @@ struct nfsd_rpc_status_get_list *nfsd_rpc_status_get_dump(struct ynl_sock *ys) > return yds.first; > > free_list: > - nfsd_rpc_status_get_list_free(yds.first); > + nfsd_rpc_status_get_rsp_list_free(yds.first); > return NULL; > } > > diff --git a/tools/net/ynl/generated/nfsd-user.h b/tools/net/ynl/generated/nfsd-user.h > index b6b69501031a..989c6e209ced 100644 > --- a/tools/net/ynl/generated/nfsd-user.h > +++ b/tools/net/ynl/generated/nfsd-user.h > @@ -21,13 +21,47 @@ const char *nfsd_op_str(int op); > /* Common nested types */ > /* ============== NFSD_CMD_RPC_STATUS_GET ============== */ > /* NFSD_CMD_RPC_STATUS_GET - dump */ > -struct nfsd_rpc_status_get_list { > - struct nfsd_rpc_status_get_list *next; > - struct nfsd_rpc_status_get_rsp obj __attribute__ ((aligned (8))); > +struct nfsd_rpc_status_get_rsp_dump { > + struct { > + __u32 xid:1; > + __u32 flags:1; > + __u32 prog:1; > + __u32 version:1; > + __u32 proc:1; > + __u32 service_time:1; > + __u32 saddr4:1; > + __u32 daddr4:1; > + __u32 saddr6_len; > + __u32 daddr6_len; > + __u32 sport:1; > + __u32 dport:1; > + } _present; > + > + __u32 xid /* big-endian */; > + __u32 flags; > + __u32 prog; > + __u8 version; > + __u32 proc; > + __s64 service_time; > + __u32 saddr4 /* big-endian */; > + __u32 daddr4 /* big-endian */; > + void *saddr6; > + void *daddr6; > + __u16 sport /* big-endian */; > + __u16 dport /* big-endian */; > + unsigned int n_compound_ops; > + __u32 *compound_ops; > }; > > -void nfsd_rpc_status_get_list_free(struct nfsd_rpc_status_get_list *rsp); > +struct nfsd_rpc_status_get_rsp_list { > + struct nfsd_rpc_status_get_rsp_list *next; > + struct nfsd_rpc_status_get_rsp_dump obj __attribute__((aligned(8))); > +}; > > -struct nfsd_rpc_status_get_list *nfsd_rpc_status_get_dump(struct ynl_sock *ys); > +void > +nfsd_rpc_status_get_rsp_list_free(struct nfsd_rpc_status_get_rsp_list *rsp); > + > +struct nfsd_rpc_status_get_rsp_list * > +nfsd_rpc_status_get_dump(struct ynl_sock *ys); > > #endif /* _LINUX_NFSD_GEN_H */ > -- > 2.41.0 > -- Chuck Lever
Powered by blists - more mailing lists