Add validation for the size of the returned data during S3 pread

This commit is contained in:
obdev 2025-01-02 14:49:07 +00:00 committed by ob-robot
parent a4a7c5e9e8
commit d443b2f26a

View File

@ -1505,10 +1505,18 @@ int ObStorageS3Reader::pread_(char *buf,
handle_s3_outcome(outcome, ret);
OB_LOG(WARN, "failed to read object from s3",
K(ret), K_(bucket), K_(object), K(range_read));
} else if (FALSE_IT(read_size = outcome.GetResult().GetContentLength())) {
} else if (OB_UNLIKELY(read_size > get_data_size)) {
ret = OB_ERR_UNEXPECTED;
OB_LOG(WARN, "returned data size is larger than expected",
K(ret), K_(has_meta), K_(file_length),
K(read_size), K(get_data_size), K(buf_size), K(offset), K_(bucket), K_(object));
} else {
// For nohead reads, the returned size may be larger than buf_size,
// which may cause buffer overflow. Use the min function to prevent that.
read_size = MIN(outcome.GetResult().GetContentLength(), get_data_size);
if (OB_UNLIKELY(read_size < get_data_size)) {
OB_LOG(WARN, "returned data size is less than expected", K(ret),
K_(bucket), K_(object), K(offset), K(buf_size), K_(has_meta), K_(file_length));
}
outcome.GetResult().GetBody().read(buf, read_size);
// read size <= get_data_size <= buf_size