tracepoint(librbd, writesame_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(),
ictx->read_only, ofs, len, bl.length() <= 0 ? NULL : bl.c_str(), bl.length(),
op_flags);
- if (bl.length() <= 0 || len % bl.length()) {
+ if (bl.length() <= 0 || len % bl.length() ||
+ len > std::numeric_limits<int>::max()) {
tracepoint(librbd, writesame_exit, -EINVAL);
return -EINVAL;
}
extern "C" int rbd_discard(rbd_image_t image, uint64_t ofs, uint64_t len)
{
librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
- tracepoint(librbd, discard_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, ofs, len);
+ tracepoint(librbd, discard_enter, ictx, ictx->name.c_str(),
+ ictx->snap_name.c_str(), ictx->read_only, ofs, len);
+ if (len > std::numeric_limits<int>::max()) {
+ tracepoint(librbd, discard_exit, -EINVAL);
+ return -EINVAL;
+ }
+
int r = ictx->io_work_queue->discard(ofs, len, ictx->skip_partial_discard);
tracepoint(librbd, discard_exit, r);
return r;
tracepoint(librbd, writesame_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(),
ictx->read_only, ofs, len, data_len <= 0 ? NULL : buf, data_len, op_flags);
- if (data_len <= 0 || len % data_len) {
+ if (data_len == 0 || len % data_len ||
+ len > std::numeric_limits<int>::max()) {
tracepoint(librbd, writesame_exit, -EINVAL);
return -EINVAL;
}