Add validation for the size of the returned data during S3 pread
This commit is contained in:
parent
a4a7c5e9e8
commit
d443b2f26a
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user