mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ksmbd: limits exceeding the maximum allowable outstanding requests
If the client ignores the CreditResponse received from the server and continues to send the request, ksmbd limits the requests if it exceeds smb2 max credits. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
		
							parent
							
								
									914d7e5709
								
							
						
					
					
						commit
						b589f5db6d
					
				
					 4 changed files with 13 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -62,6 +62,7 @@ struct ksmbd_conn *ksmbd_conn_alloc(void)
 | 
			
		|||
	atomic_set(&conn->req_running, 0);
 | 
			
		||||
	atomic_set(&conn->r_count, 0);
 | 
			
		||||
	conn->total_credits = 1;
 | 
			
		||||
	conn->outstanding_credits = 1;
 | 
			
		||||
 | 
			
		||||
	init_waitqueue_head(&conn->req_running_q);
 | 
			
		||||
	INIT_LIST_HEAD(&conn->conns_list);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,7 +61,8 @@ struct ksmbd_conn {
 | 
			
		|||
	atomic_t			req_running;
 | 
			
		||||
	/* References which are made for this Server object*/
 | 
			
		||||
	atomic_t			r_count;
 | 
			
		||||
	unsigned short			total_credits;
 | 
			
		||||
	unsigned int			total_credits;
 | 
			
		||||
	unsigned int			outstanding_credits;
 | 
			
		||||
	spinlock_t			credits_lock;
 | 
			
		||||
	wait_queue_head_t		req_running_q;
 | 
			
		||||
	/* Lock to protect requests list*/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -337,7 +337,16 @@ static int smb2_validate_credit_charge(struct ksmbd_conn *conn,
 | 
			
		|||
			    credit_charge, conn->total_credits);
 | 
			
		||||
		ret = 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ((u64)conn->outstanding_credits + credit_charge > conn->vals->max_credits) {
 | 
			
		||||
		ksmbd_debug(SMB, "Limits exceeding the maximum allowable outstanding requests, given : %u, pending : %u\n",
 | 
			
		||||
			    credit_charge, conn->outstanding_credits);
 | 
			
		||||
		ret = 1;
 | 
			
		||||
	} else
 | 
			
		||||
		conn->outstanding_credits += credit_charge;
 | 
			
		||||
 | 
			
		||||
	spin_unlock(&conn->credits_lock);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -322,6 +322,7 @@ int smb2_set_rsp_credits(struct ksmbd_work *work)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	conn->total_credits -= credit_charge;
 | 
			
		||||
	conn->outstanding_credits -= credit_charge;
 | 
			
		||||
	credits_requested = max_t(unsigned short,
 | 
			
		||||
				  le16_to_cpu(req_hdr->CreditRequest), 1);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue