[SCSI] libiscsi_tcp: fix max_r2t manipulation
Problem description from Xi Wang: A large max_r2t could lead to integer overflow in subsequent call to iscsi_tcp_r2tpool_alloc(), allocating a smaller buffer than expected and leading to out-of-bounds write. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:

committed by
James Bottomley

parent
df1c7baba1
commit
1304be5fe0
@@ -1170,6 +1170,24 @@ void iscsi_tcp_r2tpool_free(struct iscsi_session *session)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_tcp_r2tpool_free);
|
||||
|
||||
int iscsi_tcp_set_max_r2t(struct iscsi_conn *conn, char *buf)
|
||||
{
|
||||
struct iscsi_session *session = conn->session;
|
||||
unsigned short r2ts = 0;
|
||||
|
||||
sscanf(buf, "%hu", &r2ts);
|
||||
if (session->max_r2t == r2ts)
|
||||
return 0;
|
||||
|
||||
if (!r2ts || !is_power_of_2(r2ts))
|
||||
return -EINVAL;
|
||||
|
||||
session->max_r2t = r2ts;
|
||||
iscsi_tcp_r2tpool_free(session);
|
||||
return iscsi_tcp_r2tpool_alloc(session);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_tcp_set_max_r2t);
|
||||
|
||||
void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,
|
||||
struct iscsi_stats *stats)
|
||||
{
|
||||
|
Reference in New Issue
Block a user