NFS: Avoid memcpy() run-time warning for struct sockaddr overflows
authorKees Cook <keescook@chromium.org>
Mon, 17 Oct 2022 04:36:50 +0000 (21:36 -0700)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Thu, 27 Oct 2022 19:52:10 +0000 (15:52 -0400)
The 'nfs_server' and 'mount_server' structures include a union of
'struct sockaddr' (with the older 16 bytes max address size) and
'struct sockaddr_storage' which is large enough to hold all the
supported sa_family types (128 bytes max size). The runtime memcpy()
buffer overflow checker is seeing attempts to write beyond the 16
bytes as an overflow, but the actual expected size is that of 'struct
sockaddr_storage'. Plumb the use of 'struct sockaddr_storage' more
completely through-out NFS, which results in adjusting the memcpy()
buffers to the correct union members. Avoids this false positive run-time
warning under CONFIG_FORTIFY_SOURCE:

  memcpy: detected field-spanning write (size 28) of single field "&ctx->nfs_server.address" at fs/nfs/namespace.c:178 (size 16)

Reported-by: kernel test robot <yujie.liu@intel.com>
Link: https://lore.kernel.org/all/202210110948.26b43120-yujie.liu@intel.com
Cc: Trond Myklebust <trond.myklebust@hammerspace.com>
Cc: Anna Schumaker <anna@kernel.org>
Cc: linux-nfs@vger.kernel.org
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
14 files changed:
fs/nfs/client.c
fs/nfs/dns_resolve.c
fs/nfs/dns_resolve.h
fs/nfs/fs_context.c
fs/nfs/internal.h
fs/nfs/mount_clnt.c
fs/nfs/namespace.c
fs/nfs/nfs3client.c
fs/nfs/nfs4_fs.h
fs/nfs/nfs4client.c
fs/nfs/nfs4namespace.c
fs/nfs/nfs4proc.c
fs/nfs/pnfs_nfs.c
fs/nfs/super.c

index da8da5cdbbc1f39c47755eb5d91659b893510555..f50e025ae40640f14e3d79771c576f6ea1a8246f 100644 (file)
@@ -280,7 +280,7 @@ EXPORT_SYMBOL_GPL(nfs_put_client);
 static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *data)
 {
        struct nfs_client *clp;
-       const struct sockaddr *sap = data->addr;
+       const struct sockaddr *sap = (struct sockaddr *)data->addr;
        struct nfs_net *nn = net_generic(data->net, nfs_net_id);
        int error;
 
@@ -666,7 +666,7 @@ static int nfs_init_server(struct nfs_server *server,
        struct rpc_timeout timeparms;
        struct nfs_client_initdata cl_init = {
                .hostname = ctx->nfs_server.hostname,
-               .addr = (const struct sockaddr *)&ctx->nfs_server.address,
+               .addr = &ctx->nfs_server._address,
                .addrlen = ctx->nfs_server.addrlen,
                .nfs_mod = ctx->nfs_mod,
                .proto = ctx->nfs_server.protocol,
index e87d500ad95aad74ae48e76896e29d8f02df7778..6603b5cee029c0b04e6fdb0eb46be09252628d86 100644 (file)
@@ -16,8 +16,9 @@
 #include "dns_resolve.h"
 
 ssize_t nfs_dns_resolve_name(struct net *net, char *name, size_t namelen,
-               struct sockaddr *sa, size_t salen)
+               struct sockaddr_storage *ss, size_t salen)
 {
+       struct sockaddr *sa = (struct sockaddr *)ss;
        ssize_t ret;
        char *ip_addr = NULL;
        int ip_len;
@@ -341,7 +342,7 @@ out:
 }
 
 ssize_t nfs_dns_resolve_name(struct net *net, char *name,
-               size_t namelen, struct sockaddr *sa, size_t salen)
+               size_t namelen, struct sockaddr_storage *ss, size_t salen)
 {
        struct nfs_dns_ent key = {
                .hostname = name,
@@ -354,7 +355,7 @@ ssize_t nfs_dns_resolve_name(struct net *net, char *name,
        ret = do_cache_lookup_wait(nn->nfs_dns_resolve, &key, &item);
        if (ret == 0) {
                if (salen >= item->addrlen) {
-                       memcpy(sa, &item->addr, item->addrlen);
+                       memcpy(ss, &item->addr, item->addrlen);
                        ret = item->addrlen;
                } else
                        ret = -EOVERFLOW;
index 576ff4b54c82a84a1bfff8f970c2e309f40f0744..fe3b172c4de1d651089f2710acd38566902400ff 100644 (file)
@@ -32,6 +32,6 @@ extern void nfs_dns_resolver_cache_destroy(struct net *net);
 #endif
 
 extern ssize_t nfs_dns_resolve_name(struct net *net, char *name,
-               size_t namelen, struct sockaddr *sa, size_t salen);
+               size_t namelen, struct sockaddr_storage *sa, size_t salen);
 
 #endif
index 4da701fd1424f4e6b884aef4d98f0c2c9b900e48..09833ec102fca9a91754f47555aa2c68cbd9ff38 100644 (file)
@@ -273,9 +273,9 @@ static const struct constant_table nfs_secflavor_tokens[] = {
  * Address family must be initialized, and address must not be
  * the ANY address for that family.
  */
-static int nfs_verify_server_address(struct sockaddr *addr)
+static int nfs_verify_server_address(struct sockaddr_storage *addr)
 {
-       switch (addr->sa_family) {
+       switch (addr->ss_family) {
        case AF_INET: {
                struct sockaddr_in *sa = (struct sockaddr_in *)addr;
                return sa->sin_addr.s_addr != htonl(INADDR_ANY);
@@ -969,7 +969,7 @@ static int nfs23_parse_monolithic(struct fs_context *fc,
 {
        struct nfs_fs_context *ctx = nfs_fc2context(fc);
        struct nfs_fh *mntfh = ctx->mntfh;
-       struct sockaddr *sap = (struct sockaddr *)&ctx->nfs_server.address;
+       struct sockaddr_storage *sap = &ctx->nfs_server._address;
        int extra_flags = NFS_MOUNT_LEGACY_INTERFACE;
        int ret;
 
@@ -1044,7 +1044,7 @@ static int nfs23_parse_monolithic(struct fs_context *fc,
                memcpy(sap, &data->addr, sizeof(data->addr));
                ctx->nfs_server.addrlen = sizeof(data->addr);
                ctx->nfs_server.port = ntohs(data->addr.sin_port);
-               if (sap->sa_family != AF_INET ||
+               if (sap->ss_family != AF_INET ||
                    !nfs_verify_server_address(sap))
                        goto out_no_address;
 
@@ -1200,7 +1200,7 @@ static int nfs4_parse_monolithic(struct fs_context *fc,
                                 struct nfs4_mount_data *data)
 {
        struct nfs_fs_context *ctx = nfs_fc2context(fc);
-       struct sockaddr *sap = (struct sockaddr *)&ctx->nfs_server.address;
+       struct sockaddr_storage *sap = &ctx->nfs_server._address;
        int ret;
        char *c;
 
@@ -1314,7 +1314,7 @@ static int nfs_fs_context_validate(struct fs_context *fc)
 {
        struct nfs_fs_context *ctx = nfs_fc2context(fc);
        struct nfs_subversion *nfs_mod;
-       struct sockaddr *sap = (struct sockaddr *)&ctx->nfs_server.address;
+       struct sockaddr_storage *sap = &ctx->nfs_server._address;
        int max_namelen = PAGE_SIZE;
        int max_pathlen = NFS_MAXPATHLEN;
        int port = 0;
@@ -1540,7 +1540,7 @@ static int nfs_init_fs_context(struct fs_context *fc)
                ctx->version            = nfss->nfs_client->rpc_ops->version;
                ctx->minorversion       = nfss->nfs_client->cl_minorversion;
 
-               memcpy(&ctx->nfs_server.address, &nfss->nfs_client->cl_addr,
+               memcpy(&ctx->nfs_server._address, &nfss->nfs_client->cl_addr,
                        ctx->nfs_server.addrlen);
 
                if (fc->net_ns != net) {
index d914d609b85b2d67ae315668a3ca59c9afba3bf4..647fc3f547cbe953d7a2729d48b3cdb6f9f8523e 100644 (file)
@@ -69,7 +69,7 @@ static inline fmode_t flags_to_mode(int flags)
 struct nfs_client_initdata {
        unsigned long init_flags;
        const char *hostname;                   /* Hostname of the server */
-       const struct sockaddr *addr;            /* Address of the server */
+       const struct sockaddr_storage *addr;    /* Address of the server */
        const char *nodename;                   /* Hostname of the client */
        const char *ip_addr;                    /* IP address of the client */
        size_t addrlen;
@@ -180,7 +180,7 @@ static inline struct nfs_fs_context *nfs_fc2context(const struct fs_context *fc)
 
 /* mount_clnt.c */
 struct nfs_mount_request {
-       struct sockaddr         *sap;
+       struct sockaddr_storage *sap;
        size_t                  salen;
        char                    *hostname;
        char                    *dirpath;
@@ -223,7 +223,7 @@ extern void nfs4_server_set_init_caps(struct nfs_server *);
 extern struct nfs_server *nfs4_create_server(struct fs_context *);
 extern struct nfs_server *nfs4_create_referral_server(struct fs_context *);
 extern int nfs4_update_server(struct nfs_server *server, const char *hostname,
-                                       struct sockaddr *sap, size_t salen,
+                                       struct sockaddr_storage *sap, size_t salen,
                                        struct net *net);
 extern void nfs_free_server(struct nfs_server *server);
 extern struct nfs_server *nfs_clone_server(struct nfs_server *,
@@ -235,7 +235,7 @@ extern int nfs_client_init_status(const struct nfs_client *clp);
 extern int nfs_wait_client_init_complete(const struct nfs_client *clp);
 extern void nfs_mark_client_ready(struct nfs_client *clp, int state);
 extern struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
-                                            const struct sockaddr *ds_addr,
+                                            const struct sockaddr_storage *ds_addr,
                                             int ds_addrlen, int ds_proto,
                                             unsigned int ds_timeo,
                                             unsigned int ds_retrans,
@@ -243,7 +243,7 @@ extern struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
 extern struct rpc_clnt *nfs4_find_or_create_ds_client(struct nfs_client *,
                                                struct inode *);
 extern struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv,
-                       const struct sockaddr *ds_addr, int ds_addrlen,
+                       const struct sockaddr_storage *ds_addr, int ds_addrlen,
                        int ds_proto, unsigned int ds_timeo,
                        unsigned int ds_retrans);
 #ifdef CONFIG_PROC_FS
@@ -894,13 +894,13 @@ static inline bool nfs_error_is_fatal_on_server(int err)
  * Select between a default port value and a user-specified port value.
  * If a zero value is set, then autobind will be used.
  */
-static inline void nfs_set_port(struct sockaddr *sap, int *port,
+static inline void nfs_set_port(struct sockaddr_storage *sap, int *port,
                                const unsigned short default_port)
 {
        if (*port == NFS_UNSPEC_PORT)
                *port = default_port;
 
-       rpc_set_port(sap, *port);
+       rpc_set_port((struct sockaddr *)sap, *port);
 }
 
 struct nfs_direct_req {
index c5e3b6b3366a65b5d6167b6808289430986eafde..68e76b6263710e53f4e96ecf7156de968c9e4e40 100644 (file)
@@ -158,7 +158,7 @@ int nfs_mount(struct nfs_mount_request *info, int timeo, int retrans)
        struct rpc_create_args args = {
                .net            = info->net,
                .protocol       = info->protocol,
-               .address        = info->sap,
+               .address        = (struct sockaddr *)info->sap,
                .addrsize       = info->salen,
                .timeout        = &mnt_timeout,
                .servername     = info->hostname,
@@ -245,7 +245,7 @@ void nfs_umount(const struct nfs_mount_request *info)
        struct rpc_create_args args = {
                .net            = info->net,
                .protocol       = IPPROTO_UDP,
-               .address        = info->sap,
+               .address        = (struct sockaddr *)info->sap,
                .addrsize       = info->salen,
                .timeout        = &nfs_umnt_timeout,
                .servername     = info->hostname,
index 3295af4110f1b1c5890f110c3d49424a3d19406f..2f336ace755546e327bae19cbdc117f1cbb380d2 100644 (file)
@@ -175,7 +175,7 @@ struct vfsmount *nfs_d_automount(struct path *path)
        }
 
        /* for submounts we want the same server; referrals will reassign */
-       memcpy(&ctx->nfs_server.address, &client->cl_addr, client->cl_addrlen);
+       memcpy(&ctx->nfs_server._address, &client->cl_addr, client->cl_addrlen);
        ctx->nfs_server.addrlen = client->cl_addrlen;
        ctx->nfs_server.port    = server->port;
 
index b49359afac883b4d26b4a9d58fe52d4c4d5b0169..669cda757a5cec083948ab07ece258b50eb4ddd6 100644 (file)
@@ -78,7 +78,7 @@ struct nfs_server *nfs3_clone_server(struct nfs_server *source,
  * the MDS.
  */
 struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv,
-               const struct sockaddr *ds_addr, int ds_addrlen,
+               const struct sockaddr_storage *ds_addr, int ds_addrlen,
                int ds_proto, unsigned int ds_timeo, unsigned int ds_retrans)
 {
        struct rpc_timeout ds_timeout;
@@ -98,7 +98,7 @@ struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv,
        char buf[INET6_ADDRSTRLEN + 1];
 
        /* fake a hostname because lockd wants it */
-       if (rpc_ntop(ds_addr, buf, sizeof(buf)) <= 0)
+       if (rpc_ntop((struct sockaddr *)ds_addr, buf, sizeof(buf)) <= 0)
                return ERR_PTR(-EINVAL);
        cl_init.hostname = buf;
 
index 400a71e75238b55869811dce27238b0d0e88c27e..cfef738d765e0d73c274acbc9835ec7c52ef288f 100644 (file)
@@ -281,7 +281,7 @@ struct rpc_clnt *nfs4_negotiate_security(struct rpc_clnt *, struct inode *,
 int nfs4_submount(struct fs_context *, struct nfs_server *);
 int nfs4_replace_transport(struct nfs_server *server,
                                const struct nfs4_fs_locations *locations);
-size_t nfs_parse_server_name(char *string, size_t len, struct sockaddr *sa,
+size_t nfs_parse_server_name(char *string, size_t len, struct sockaddr_storage *ss,
                             size_t salen, struct net *net, int port);
 /* nfs4proc.c */
 extern int nfs4_handle_exception(struct nfs_server *, int, struct nfs4_exception *);
index 7a5162afa5c0dc33336a36d51fc2a5f0ca32aebb..3b9b534813095c3d22cdd7311fa2648354ae04b1 100644 (file)
@@ -889,7 +889,7 @@ nfs4_find_client_sessionid(struct net *net, const struct sockaddr *addr,
  */
 static int nfs4_set_client(struct nfs_server *server,
                const char *hostname,
-               const struct sockaddr *addr,
+               const struct sockaddr_storage *addr,
                const size_t addrlen,
                const char *ip_addr,
                int proto, const struct rpc_timeout *timeparms,
@@ -924,7 +924,7 @@ static int nfs4_set_client(struct nfs_server *server,
                __set_bit(NFS_CS_MIGRATION, &cl_init.init_flags);
        if (test_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status))
                __set_bit(NFS_CS_TSM_POSSIBLE, &cl_init.init_flags);
-       server->port = rpc_get_port(addr);
+       server->port = rpc_get_port((struct sockaddr *)addr);
 
        /* Allocate or find a client reference we can use */
        clp = nfs_get_client(&cl_init);
@@ -960,7 +960,7 @@ static int nfs4_set_client(struct nfs_server *server,
  * the MDS.
  */
 struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
-               const struct sockaddr *ds_addr, int ds_addrlen,
+               const struct sockaddr_storage *ds_addr, int ds_addrlen,
                int ds_proto, unsigned int ds_timeo, unsigned int ds_retrans,
                u32 minor_version)
 {
@@ -980,7 +980,7 @@ struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
        };
        char buf[INET6_ADDRSTRLEN + 1];
 
-       if (rpc_ntop(ds_addr, buf, sizeof(buf)) <= 0)
+       if (rpc_ntop((struct sockaddr *)ds_addr, buf, sizeof(buf)) <= 0)
                return ERR_PTR(-EINVAL);
        cl_init.hostname = buf;
 
@@ -1148,7 +1148,7 @@ static int nfs4_init_server(struct nfs_server *server, struct fs_context *fc)
        /* Get a client record */
        error = nfs4_set_client(server,
                                ctx->nfs_server.hostname,
-                               &ctx->nfs_server.address,
+                               &ctx->nfs_server._address,
                                ctx->nfs_server.addrlen,
                                ctx->client_address,
                                ctx->nfs_server.protocol,
@@ -1238,7 +1238,7 @@ struct nfs_server *nfs4_create_referral_server(struct fs_context *fc)
        rpc_set_port(&ctx->nfs_server.address, NFS_RDMA_PORT);
        error = nfs4_set_client(server,
                                ctx->nfs_server.hostname,
-                               &ctx->nfs_server.address,
+                               &ctx->nfs_server._address,
                                ctx->nfs_server.addrlen,
                                parent_client->cl_ipaddr,
                                XPRT_TRANSPORT_RDMA,
@@ -1254,7 +1254,7 @@ struct nfs_server *nfs4_create_referral_server(struct fs_context *fc)
        rpc_set_port(&ctx->nfs_server.address, NFS_PORT);
        error = nfs4_set_client(server,
                                ctx->nfs_server.hostname,
-                               &ctx->nfs_server.address,
+                               &ctx->nfs_server._address,
                                ctx->nfs_server.addrlen,
                                parent_client->cl_ipaddr,
                                XPRT_TRANSPORT_TCP,
@@ -1303,14 +1303,14 @@ error:
  * Returns zero on success, or a negative errno value.
  */
 int nfs4_update_server(struct nfs_server *server, const char *hostname,
-                      struct sockaddr *sap, size_t salen, struct net *net)
+                      struct sockaddr_storage *sap, size_t salen, struct net *net)
 {
        struct nfs_client *clp = server->nfs_client;
        struct rpc_clnt *clnt = server->client;
        struct xprt_create xargs = {
                .ident          = clp->cl_proto,
                .net            = net,
-               .dstaddr        = sap,
+               .dstaddr        = (struct sockaddr *)sap,
                .addrlen        = salen,
                .servername     = hostname,
        };
index f2dbf904c59895b7e6c4f13fd595a50c98164657..9a98595bb160457e1346d82dfbd0ff9cfa71c611 100644 (file)
@@ -164,16 +164,17 @@ static int nfs4_validate_fspath(struct dentry *dentry,
        return 0;
 }
 
-size_t nfs_parse_server_name(char *string, size_t len, struct sockaddr *sa,
+size_t nfs_parse_server_name(char *string, size_t len, struct sockaddr_storage *ss,
                             size_t salen, struct net *net, int port)
 {
+       struct sockaddr *sa = (struct sockaddr *)ss;
        ssize_t ret;
 
        ret = rpc_pton(net, string, len, sa, salen);
        if (ret == 0) {
                ret = rpc_uaddr2sockaddr(net, string, len, sa, salen);
                if (ret == 0) {
-                       ret = nfs_dns_resolve_name(net, string, len, sa, salen);
+                       ret = nfs_dns_resolve_name(net, string, len, ss, salen);
                        if (ret < 0)
                                ret = 0;
                }
@@ -331,7 +332,7 @@ static int try_location(struct fs_context *fc,
 
                ctx->nfs_server.addrlen =
                        nfs_parse_server_name(buf->data, buf->len,
-                                             &ctx->nfs_server.address,
+                                             &ctx->nfs_server._address,
                                              sizeof(ctx->nfs_server._address),
                                              fc->net_ns, 0);
                if (ctx->nfs_server.addrlen == 0)
@@ -483,14 +484,13 @@ static int nfs4_try_replacing_one_location(struct nfs_server *server,
                char *page, char *page2,
                const struct nfs4_fs_location *location)
 {
-       const size_t addr_bufsize = sizeof(struct sockaddr_storage);
        struct net *net = rpc_net_ns(server->client);
-       struct sockaddr *sap;
+       struct sockaddr_storage *sap;
        unsigned int s;
        size_t salen;
        int error;
 
-       sap = kmalloc(addr_bufsize, GFP_KERNEL);
+       sap = kmalloc(sizeof(*sap), GFP_KERNEL);
        if (sap == NULL)
                return -ENOMEM;
 
@@ -506,10 +506,10 @@ static int nfs4_try_replacing_one_location(struct nfs_server *server,
                        continue;
 
                salen = nfs_parse_server_name(buf->data, buf->len,
-                                               sap, addr_bufsize, net, 0);
+                                             sap, sizeof(*sap), net, 0);
                if (salen == 0)
                        continue;
-               rpc_set_port(sap, NFS_PORT);
+               rpc_set_port((struct sockaddr *)sap, NFS_PORT);
 
                error = -ENOMEM;
                hostname = kmemdup_nul(buf->data, buf->len, GFP_KERNEL);
index e2efcd26336c06d0799a53060e789b2162266a92..4c4df7f213b6c898d81c560617dfb92f6df4313f 100644 (file)
@@ -3951,7 +3951,7 @@ static void test_fs_location_for_trunking(struct nfs4_fs_location *location,
 
        for (i = 0; i < location->nservers; i++) {
                struct nfs4_string *srv_loc = &location->servers[i];
-               struct sockaddr addr;
+               struct sockaddr_storage addr;
                size_t addrlen;
                struct xprt_create xprt_args = {
                        .ident = 0,
@@ -3974,7 +3974,7 @@ static void test_fs_location_for_trunking(struct nfs4_fs_location *location,
                                                clp->cl_net, server->port);
                if (!addrlen)
                        return;
-               xprt_args.dstaddr = &addr;
+               xprt_args.dstaddr = (struct sockaddr *)&addr;
                xprt_args.addrlen = addrlen;
                servername = kmalloc(srv_loc->len + 1, GFP_KERNEL);
                if (!servername)
index 987c88ddeaf060161e2d1c5fc0a870a94352bac8..5d035dd2d7bf06ef3598fad843a1886769887ef1 100644 (file)
@@ -821,7 +821,7 @@ static void nfs4_clear_ds_conn_bit(struct nfs4_pnfs_ds *ds)
 
 static struct nfs_client *(*get_v3_ds_connect)(
                        struct nfs_server *mds_srv,
-                       const struct sockaddr *ds_addr,
+                       const struct sockaddr_storage *ds_addr,
                        int ds_addrlen,
                        int ds_proto,
                        unsigned int ds_timeo,
@@ -882,7 +882,7 @@ static int _nfs4_pnfs_v3_ds_connect(struct nfs_server *mds_srv,
                        continue;
                }
                clp = get_v3_ds_connect(mds_srv,
-                               (struct sockaddr *)&da->da_addr,
+                               &da->da_addr,
                                da->da_addrlen, da->da_transport,
                                timeo, retrans);
                if (IS_ERR(clp))
@@ -951,7 +951,7 @@ static int _nfs4_pnfs_v4_ds_connect(struct nfs_server *mds_srv,
                                put_cred(xprtdata.cred);
                } else {
                        clp = nfs4_set_ds_client(mds_srv,
-                                               (struct sockaddr *)&da->da_addr,
+                                               &da->da_addr,
                                                da->da_addrlen,
                                                da->da_transport, timeo,
                                                retrans, minor_version);
index ee66ffdb985e8094131a5226baecb876cb05c4a0..05ae23657527da80dc0c66469df936dfff92c5eb 100644 (file)
@@ -822,8 +822,7 @@ static int nfs_request_mount(struct fs_context *fc,
 {
        struct nfs_fs_context *ctx = nfs_fc2context(fc);
        struct nfs_mount_request request = {
-               .sap            = (struct sockaddr *)
-                                               &ctx->mount_server.address,
+               .sap            = &ctx->mount_server._address,
                .dirpath        = ctx->nfs_server.export_path,
                .protocol       = ctx->mount_server.protocol,
                .fh             = root_fh,
@@ -854,7 +853,7 @@ static int nfs_request_mount(struct fs_context *fc,
         * Construct the mount server's address.
         */
        if (ctx->mount_server.address.sa_family == AF_UNSPEC) {
-               memcpy(request.sap, &ctx->nfs_server.address,
+               memcpy(request.sap, &ctx->nfs_server._address,
                       ctx->nfs_server.addrlen);
                ctx->mount_server.addrlen = ctx->nfs_server.addrlen;
        }