Skip to content

Commit 1b66c11

Browse files
committed
Merge tag 'nfsd-6.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux
Pull nfsd fixes from Chuck Lever: - A collection of minor bug fixes * tag 'nfsd-6.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux: NFSD: Remove open coding of string copy SUNRPC: Fix trace_svc_register() call site SUNRPC: always free ctxt when freeing deferred request SUNRPC: double free xprt_ctxt while still in use SUNRPC: Fix error handling in svc_setup_socket() SUNRPC: Fix encoding of accepted but unsuccessful RPC replies lockd: define nlm_port_min,max with CONFIG_SYSCTL nfsd: define exports_proc_ops with CONFIG_PROC_FS SUNRPC: Avoid relying on crypto API to derive CBC-CTS output IV
2 parents cba5826 + 21a3f33 commit 1b66c11

File tree

11 files changed

+85
-64
lines changed

11 files changed

+85
-64
lines changed

fs/lockd/svc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ static const unsigned long nlm_grace_period_min = 0;
7777
static const unsigned long nlm_grace_period_max = 240;
7878
static const unsigned long nlm_timeout_min = 3;
7979
static const unsigned long nlm_timeout_max = 20;
80-
static const int nlm_port_min = 0, nlm_port_max = 65535;
8180

8281
#ifdef CONFIG_SYSCTL
82+
static const int nlm_port_min = 0, nlm_port_max = 65535;
8383
static struct ctl_table_header * nlm_sysctl_table;
8484
#endif
8585

fs/nfsd/nfsctl.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -153,18 +153,6 @@ static int exports_net_open(struct net *net, struct file *file)
153153
return 0;
154154
}
155155

156-
static int exports_proc_open(struct inode *inode, struct file *file)
157-
{
158-
return exports_net_open(current->nsproxy->net_ns, file);
159-
}
160-
161-
static const struct proc_ops exports_proc_ops = {
162-
.proc_open = exports_proc_open,
163-
.proc_read = seq_read,
164-
.proc_lseek = seq_lseek,
165-
.proc_release = seq_release,
166-
};
167-
168156
static int exports_nfsd_open(struct inode *inode, struct file *file)
169157
{
170158
return exports_net_open(inode->i_sb->s_fs_info, file);
@@ -1458,6 +1446,19 @@ static struct file_system_type nfsd_fs_type = {
14581446
MODULE_ALIAS_FS("nfsd");
14591447

14601448
#ifdef CONFIG_PROC_FS
1449+
1450+
static int exports_proc_open(struct inode *inode, struct file *file)
1451+
{
1452+
return exports_net_open(current->nsproxy->net_ns, file);
1453+
}
1454+
1455+
static const struct proc_ops exports_proc_ops = {
1456+
.proc_open = exports_proc_open,
1457+
.proc_read = seq_read,
1458+
.proc_lseek = seq_lseek,
1459+
.proc_release = seq_release,
1460+
};
1461+
14611462
static int create_proc_exports_entry(void)
14621463
{
14631464
struct proc_dir_entry *entry;

fs/nfsd/trace.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,19 +1365,19 @@ TRACE_EVENT(nfsd_cb_setup,
13651365
__field(u32, cl_id)
13661366
__field(unsigned long, authflavor)
13671367
__sockaddr(addr, clp->cl_cb_conn.cb_addrlen)
1368-
__array(unsigned char, netid, 8)
1368+
__string(netid, netid)
13691369
),
13701370
TP_fast_assign(
13711371
__entry->cl_boot = clp->cl_clientid.cl_boot;
13721372
__entry->cl_id = clp->cl_clientid.cl_id;
1373-
strlcpy(__entry->netid, netid, sizeof(__entry->netid));
1373+
__assign_str(netid, netid);
13741374
__entry->authflavor = authflavor;
13751375
__assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
13761376
clp->cl_cb_conn.cb_addrlen)
13771377
),
13781378
TP_printk("addr=%pISpc client %08x:%08x proto=%s flavor=%s",
13791379
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
1380-
__entry->netid, show_nfsd_authflavor(__entry->authflavor))
1380+
__get_str(netid), show_nfsd_authflavor(__entry->authflavor))
13811381
);
13821382

13831383
TRACE_EVENT(nfsd_cb_setup_err,

include/linux/sunrpc/svc_rdma.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ extern struct svc_rdma_recv_ctxt *
176176
extern void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
177177
struct svc_rdma_recv_ctxt *ctxt);
178178
extern void svc_rdma_flush_recv_queues(struct svcxprt_rdma *rdma);
179-
extern void svc_rdma_release_rqst(struct svc_rqst *rqstp);
179+
extern void svc_rdma_release_ctxt(struct svc_xprt *xprt, void *ctxt);
180180
extern int svc_rdma_recvfrom(struct svc_rqst *);
181181

182182
/* svc_rdma_rw.c */

include/linux/sunrpc/svc_xprt.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ struct svc_xprt_ops {
2323
int (*xpo_sendto)(struct svc_rqst *);
2424
int (*xpo_result_payload)(struct svc_rqst *, unsigned int,
2525
unsigned int);
26-
void (*xpo_release_rqst)(struct svc_rqst *);
26+
void (*xpo_release_ctxt)(struct svc_xprt *xprt, void *ctxt);
2727
void (*xpo_detach)(struct svc_xprt *);
2828
void (*xpo_free)(struct svc_xprt *);
2929
void (*xpo_kill_temp_xprt)(struct svc_xprt *);

net/sunrpc/auth_gss/gss_krb5_crypto.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,16 @@ gss_krb5_cts_crypt(struct crypto_sync_skcipher *cipher, struct xdr_buf *buf,
639639

640640
ret = write_bytes_to_xdr_buf(buf, offset, data, len);
641641

642+
#if IS_ENABLED(CONFIG_KUNIT)
643+
/*
644+
* CBC-CTS does not define an output IV but RFC 3962 defines it as the
645+
* penultimate block of ciphertext, so copy that into the IV buffer
646+
* before returning.
647+
*/
648+
if (encrypt)
649+
memcpy(iv, data, crypto_sync_skcipher_ivsize(cipher));
650+
#endif
651+
642652
out:
643653
kfree(data);
644654
return ret;

net/sunrpc/svc.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,7 @@ static int __svc_register(struct net *net, const char *progname,
10521052
#endif
10531053
}
10541054

1055-
trace_svc_register(progname, version, protocol, port, family, error);
1055+
trace_svc_register(progname, version, family, protocol, port, error);
10561056
return error;
10571057
}
10581058

@@ -1416,7 +1416,7 @@ svc_process_common(struct svc_rqst *rqstp)
14161416
/* Only RPCv2 supported */
14171417
xdr_stream_encode_u32(xdr, RPC_VERSION);
14181418
xdr_stream_encode_u32(xdr, RPC_VERSION);
1419-
goto sendit;
1419+
return 1; /* don't wrap */
14201420

14211421
err_bad_auth:
14221422
dprintk("svc: authentication failed (%d)\n",
@@ -1432,15 +1432,20 @@ svc_process_common(struct svc_rqst *rqstp)
14321432
err_bad_prog:
14331433
dprintk("svc: unknown program %d\n", rqstp->rq_prog);
14341434
serv->sv_stats->rpcbadfmt++;
1435-
xdr_stream_encode_u32(xdr, RPC_PROG_UNAVAIL);
1435+
*rqstp->rq_accept_statp = rpc_prog_unavail;
14361436
goto sendit;
14371437

14381438
err_bad_vers:
14391439
svc_printk(rqstp, "unknown version (%d for prog %d, %s)\n",
14401440
rqstp->rq_vers, rqstp->rq_prog, progp->pg_name);
14411441

14421442
serv->sv_stats->rpcbadfmt++;
1443-
xdr_stream_encode_u32(xdr, RPC_PROG_MISMATCH);
1443+
*rqstp->rq_accept_statp = rpc_prog_mismatch;
1444+
1445+
/*
1446+
* svc_authenticate() has already added the verifier and
1447+
* advanced the stream just past rq_accept_statp.
1448+
*/
14441449
xdr_stream_encode_u32(xdr, process.mismatch.lovers);
14451450
xdr_stream_encode_u32(xdr, process.mismatch.hivers);
14461451
goto sendit;
@@ -1449,19 +1454,19 @@ svc_process_common(struct svc_rqst *rqstp)
14491454
svc_printk(rqstp, "unknown procedure (%d)\n", rqstp->rq_proc);
14501455

14511456
serv->sv_stats->rpcbadfmt++;
1452-
xdr_stream_encode_u32(xdr, RPC_PROC_UNAVAIL);
1457+
*rqstp->rq_accept_statp = rpc_proc_unavail;
14531458
goto sendit;
14541459

14551460
err_garbage_args:
14561461
svc_printk(rqstp, "failed to decode RPC header\n");
14571462

14581463
serv->sv_stats->rpcbadfmt++;
1459-
xdr_stream_encode_u32(xdr, RPC_GARBAGE_ARGS);
1464+
*rqstp->rq_accept_statp = rpc_garbage_args;
14601465
goto sendit;
14611466

14621467
err_system_err:
14631468
serv->sv_stats->rpcbadfmt++;
1464-
xdr_stream_encode_u32(xdr, RPC_SYSTEM_ERR);
1469+
*rqstp->rq_accept_statp = rpc_system_err;
14651470
goto sendit;
14661471
}
14671472

net/sunrpc/svc_xprt.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -532,13 +532,23 @@ void svc_reserve(struct svc_rqst *rqstp, int space)
532532
}
533533
EXPORT_SYMBOL_GPL(svc_reserve);
534534

535+
static void free_deferred(struct svc_xprt *xprt, struct svc_deferred_req *dr)
536+
{
537+
if (!dr)
538+
return;
539+
540+
xprt->xpt_ops->xpo_release_ctxt(xprt, dr->xprt_ctxt);
541+
kfree(dr);
542+
}
543+
535544
static void svc_xprt_release(struct svc_rqst *rqstp)
536545
{
537546
struct svc_xprt *xprt = rqstp->rq_xprt;
538547

539-
xprt->xpt_ops->xpo_release_rqst(rqstp);
548+
xprt->xpt_ops->xpo_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
549+
rqstp->rq_xprt_ctxt = NULL;
540550

541-
kfree(rqstp->rq_deferred);
551+
free_deferred(xprt, rqstp->rq_deferred);
542552
rqstp->rq_deferred = NULL;
543553

544554
svc_rqst_release_pages(rqstp);
@@ -1054,7 +1064,7 @@ static void svc_delete_xprt(struct svc_xprt *xprt)
10541064
spin_unlock_bh(&serv->sv_lock);
10551065

10561066
while ((dr = svc_deferred_dequeue(xprt)) != NULL)
1057-
kfree(dr);
1067+
free_deferred(xprt, dr);
10581068

10591069
call_xpt_users(xprt);
10601070
svc_xprt_put(xprt);
@@ -1176,8 +1186,8 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many)
11761186
if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) {
11771187
spin_unlock(&xprt->xpt_lock);
11781188
trace_svc_defer_drop(dr);
1189+
free_deferred(xprt, dr);
11791190
svc_xprt_put(xprt);
1180-
kfree(dr);
11811191
return;
11821192
}
11831193
dr->xprt = NULL;
@@ -1222,14 +1232,14 @@ static struct cache_deferred_req *svc_defer(struct cache_req *req)
12221232
dr->addrlen = rqstp->rq_addrlen;
12231233
dr->daddr = rqstp->rq_daddr;
12241234
dr->argslen = rqstp->rq_arg.len >> 2;
1225-
dr->xprt_ctxt = rqstp->rq_xprt_ctxt;
1226-
rqstp->rq_xprt_ctxt = NULL;
12271235

12281236
/* back up head to the start of the buffer and copy */
12291237
skip = rqstp->rq_arg.len - rqstp->rq_arg.head[0].iov_len;
12301238
memcpy(dr->args, rqstp->rq_arg.head[0].iov_base - skip,
12311239
dr->argslen << 2);
12321240
}
1241+
dr->xprt_ctxt = rqstp->rq_xprt_ctxt;
1242+
rqstp->rq_xprt_ctxt = NULL;
12331243
trace_svc_defer(rqstp);
12341244
svc_xprt_get(rqstp->rq_xprt);
12351245
dr->xprt = rqstp->rq_xprt;
@@ -1262,6 +1272,8 @@ static noinline int svc_deferred_recv(struct svc_rqst *rqstp)
12621272
rqstp->rq_daddr = dr->daddr;
12631273
rqstp->rq_respages = rqstp->rq_pages;
12641274
rqstp->rq_xprt_ctxt = dr->xprt_ctxt;
1275+
1276+
dr->xprt_ctxt = NULL;
12651277
svc_xprt_received(rqstp->rq_xprt);
12661278
return dr->argslen << 2;
12671279
}

net/sunrpc/svcsock.c

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -121,27 +121,27 @@ static void svc_reclassify_socket(struct socket *sock)
121121
#endif
122122

123123
/**
124-
* svc_tcp_release_rqst - Release transport-related resources
125-
* @rqstp: request structure with resources to be released
124+
* svc_tcp_release_ctxt - Release transport-related resources
125+
* @xprt: the transport which owned the context
126+
* @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
126127
*
127128
*/
128-
static void svc_tcp_release_rqst(struct svc_rqst *rqstp)
129+
static void svc_tcp_release_ctxt(struct svc_xprt *xprt, void *ctxt)
129130
{
130131
}
131132

132133
/**
133-
* svc_udp_release_rqst - Release transport-related resources
134-
* @rqstp: request structure with resources to be released
134+
* svc_udp_release_ctxt - Release transport-related resources
135+
* @xprt: the transport which owned the context
136+
* @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
135137
*
136138
*/
137-
static void svc_udp_release_rqst(struct svc_rqst *rqstp)
139+
static void svc_udp_release_ctxt(struct svc_xprt *xprt, void *ctxt)
138140
{
139-
struct sk_buff *skb = rqstp->rq_xprt_ctxt;
141+
struct sk_buff *skb = ctxt;
140142

141-
if (skb) {
142-
rqstp->rq_xprt_ctxt = NULL;
143+
if (skb)
143144
consume_skb(skb);
144-
}
145145
}
146146

147147
union svc_pktinfo_u {
@@ -696,7 +696,8 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
696696
unsigned int sent;
697697
int err;
698698

699-
svc_udp_release_rqst(rqstp);
699+
svc_udp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
700+
rqstp->rq_xprt_ctxt = NULL;
700701

701702
svc_set_cmsg_data(rqstp, cmh);
702703

@@ -768,7 +769,7 @@ static const struct svc_xprt_ops svc_udp_ops = {
768769
.xpo_recvfrom = svc_udp_recvfrom,
769770
.xpo_sendto = svc_udp_sendto,
770771
.xpo_result_payload = svc_sock_result_payload,
771-
.xpo_release_rqst = svc_udp_release_rqst,
772+
.xpo_release_ctxt = svc_udp_release_ctxt,
772773
.xpo_detach = svc_sock_detach,
773774
.xpo_free = svc_sock_free,
774775
.xpo_has_wspace = svc_udp_has_wspace,
@@ -895,6 +896,9 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
895896
trace_svcsock_accept_err(xprt, serv->sv_name, err);
896897
return NULL;
897898
}
899+
if (IS_ERR(sock_alloc_file(newsock, O_NONBLOCK, NULL)))
900+
return NULL;
901+
898902
set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags);
899903

900904
err = kernel_getpeername(newsock, sin);
@@ -935,7 +939,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
935939
return &newsvsk->sk_xprt;
936940

937941
failed:
938-
sock_release(newsock);
942+
sockfd_put(newsock);
939943
return NULL;
940944
}
941945

@@ -1298,7 +1302,8 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
12981302
unsigned int sent;
12991303
int err;
13001304

1301-
svc_tcp_release_rqst(rqstp);
1305+
svc_tcp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
1306+
rqstp->rq_xprt_ctxt = NULL;
13021307

13031308
atomic_inc(&svsk->sk_sendqlen);
13041309
mutex_lock(&xprt->xpt_mutex);
@@ -1343,7 +1348,7 @@ static const struct svc_xprt_ops svc_tcp_ops = {
13431348
.xpo_recvfrom = svc_tcp_recvfrom,
13441349
.xpo_sendto = svc_tcp_sendto,
13451350
.xpo_result_payload = svc_sock_result_payload,
1346-
.xpo_release_rqst = svc_tcp_release_rqst,
1351+
.xpo_release_ctxt = svc_tcp_release_ctxt,
13471352
.xpo_detach = svc_tcp_sock_detach,
13481353
.xpo_free = svc_sock_free,
13491354
.xpo_has_wspace = svc_tcp_has_wspace,
@@ -1430,7 +1435,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
14301435
struct socket *sock,
14311436
int flags)
14321437
{
1433-
struct file *filp = NULL;
14341438
struct svc_sock *svsk;
14351439
struct sock *inet;
14361440
int pmap_register = !(flags & SVC_SOCK_ANONYMOUS);
@@ -1439,14 +1443,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
14391443
if (!svsk)
14401444
return ERR_PTR(-ENOMEM);
14411445

1442-
if (!sock->file) {
1443-
filp = sock_alloc_file(sock, O_NONBLOCK, NULL);
1444-
if (IS_ERR(filp)) {
1445-
kfree(svsk);
1446-
return ERR_CAST(filp);
1447-
}
1448-
}
1449-
14501446
inet = sock->sk;
14511447

14521448
if (pmap_register) {
@@ -1456,8 +1452,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
14561452
inet->sk_protocol,
14571453
ntohs(inet_sk(inet)->inet_sport));
14581454
if (err < 0) {
1459-
if (filp)
1460-
fput(filp);
14611455
kfree(svsk);
14621456
return ERR_PTR(err);
14631457
}

net/sunrpc/xprtrdma/svc_rdma_recvfrom.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -239,21 +239,20 @@ void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
239239
}
240240

241241
/**
242-
* svc_rdma_release_rqst - Release transport-specific per-rqst resources
243-
* @rqstp: svc_rqst being released
242+
* svc_rdma_release_ctxt - Release transport-specific per-rqst resources
243+
* @xprt: the transport which owned the context
244+
* @vctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
244245
*
245246
* Ensure that the recv_ctxt is released whether or not a Reply
246247
* was sent. For example, the client could close the connection,
247248
* or svc_process could drop an RPC, before the Reply is sent.
248249
*/
249-
void svc_rdma_release_rqst(struct svc_rqst *rqstp)
250+
void svc_rdma_release_ctxt(struct svc_xprt *xprt, void *vctxt)
250251
{
251-
struct svc_rdma_recv_ctxt *ctxt = rqstp->rq_xprt_ctxt;
252-
struct svc_xprt *xprt = rqstp->rq_xprt;
252+
struct svc_rdma_recv_ctxt *ctxt = vctxt;
253253
struct svcxprt_rdma *rdma =
254254
container_of(xprt, struct svcxprt_rdma, sc_xprt);
255255

256-
rqstp->rq_xprt_ctxt = NULL;
257256
if (ctxt)
258257
svc_rdma_recv_ctxt_put(rdma, ctxt);
259258
}

0 commit comments

Comments
 (0)