Skip to content

Commit b8c0aa9

Browse files
Dan Carpenterjonmason
authored andcommitted
NTB: EPF: Tidy up some bounds checks
This sscanf() is reading from the filename which was set by the kernel so it should be trust worthy. Although the data is likely trust worthy there is some bounds checking but unfortunately, it is not complete or consistent. Additionally, the Smatch static checker marks everything that comes from sscanf() as tainted and so Smatch complains that this code can lead to an out of bounds issue. Let's clean things up and make Smatch happy. The first problem is that there is no bounds checking in the _show() functions. The _store() and _show() functions are very similar so make the bounds checking the same in both. The second issue is that if "win_no" is zero it leads to an array underflow so add an if (win_no <= 0) check for that. Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Acked-by: Souptick Joarder (HPE) <jrdr.linux@gmail.com> Signed-off-by: Jon Mason <jdmason@kudzu.us>
1 parent 3305f43 commit b8c0aa9

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

drivers/pci/endpoint/functions/pci-epf-vntb.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -831,9 +831,16 @@ static ssize_t epf_ntb_##_name##_show(struct config_item *item, \
831831
{ \
832832
struct config_group *group = to_config_group(item); \
833833
struct epf_ntb *ntb = to_epf_ntb(group); \
834+
struct device *dev = &ntb->epf->dev; \
834835
int win_no; \
835836
\
836-
sscanf(#_name, "mw%d", &win_no); \
837+
if (sscanf(#_name, "mw%d", &win_no) != 1) \
838+
return -EINVAL; \
839+
\
840+
if (win_no <= 0 || win_no > ntb->num_mws) { \
841+
dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
842+
return -EINVAL; \
843+
} \
837844
\
838845
return sprintf(page, "%lld\n", ntb->mws_size[win_no - 1]); \
839846
}
@@ -856,7 +863,7 @@ static ssize_t epf_ntb_##_name##_store(struct config_item *item, \
856863
if (sscanf(#_name, "mw%d", &win_no) != 1) \
857864
return -EINVAL; \
858865
\
859-
if (ntb->num_mws < win_no) { \
866+
if (win_no <= 0 || win_no > ntb->num_mws) { \
860867
dev_err(dev, "Invalid num_nws: %d value\n", ntb->num_mws); \
861868
return -EINVAL; \
862869
} \

0 commit comments

Comments
 (0)