@@ -217,6 +217,9 @@ rocksdb::Status RedisSets::SAdd(const Slice& key, const std::vector<std::string>
217217 ParsedSetsMetaValue parsed_sets_meta_value (&meta_value);
218218 if (parsed_sets_meta_value.IsStale () || parsed_sets_meta_value.count () == 0 ) {
219219 version = parsed_sets_meta_value.InitialMetaValue ();
220+ if (!parsed_sets_meta_value.check_set_count (static_cast <int32_t >(filtered_members.size ()))) {
221+ return Status::InvalidArgument (" set size overflow" );
222+ }
220223 parsed_sets_meta_value.set_count (static_cast <int32_t >(filtered_members.size ()));
221224 batch.Put (handles_[0 ], key, meta_value);
222225 for (const auto & member : filtered_members) {
@@ -243,6 +246,9 @@ rocksdb::Status RedisSets::SAdd(const Slice& key, const std::vector<std::string>
243246 if (cnt == 0 ) {
244247 return rocksdb::Status::OK ();
245248 } else {
249+ if (!parsed_sets_meta_value.CheckModifyCount (cnt)){
250+ return Status::InvalidArgument (" set size overflow" );
251+ }
246252 parsed_sets_meta_value.ModifyCount (cnt);
247253 batch.Put (handles_[0 ], key, meta_value);
248254 }
@@ -420,6 +426,9 @@ rocksdb::Status RedisSets::SDiffstore(const Slice& destination, const std::vecto
420426 ParsedSetsMetaValue parsed_sets_meta_value (&meta_value);
421427 statistic = parsed_sets_meta_value.count ();
422428 version = parsed_sets_meta_value.InitialMetaValue ();
429+ if (!parsed_sets_meta_value.check_set_count (static_cast <int32_t >(members.size ()))) {
430+ return Status::InvalidArgument (" set size overflow" );
431+ }
423432 parsed_sets_meta_value.set_count (static_cast <int32_t >(members.size ()));
424433 batch.Put (handles_[0 ], destination, meta_value);
425434 } else if (s.IsNotFound ()) {
@@ -603,6 +612,9 @@ rocksdb::Status RedisSets::SInterstore(const Slice& destination, const std::vect
603612 ParsedSetsMetaValue parsed_sets_meta_value (&meta_value);
604613 statistic = parsed_sets_meta_value.count ();
605614 version = parsed_sets_meta_value.InitialMetaValue ();
615+ if (!parsed_sets_meta_value.check_set_count (static_cast <int32_t >(members.size ()))) {
616+ return Status::InvalidArgument (" set size overflow" );
617+ }
606618 parsed_sets_meta_value.set_count (static_cast <int32_t >(members.size ()));
607619 batch.Put (handles_[0 ], destination, meta_value);
608620 } else if (s.IsNotFound ()) {
@@ -714,6 +726,9 @@ rocksdb::Status RedisSets::SMove(const Slice& source, const Slice& destination,
714726 s = db_->Get (default_read_options_, handles_[1 ], sets_member_key.Encode (), &member_value);
715727 if (s.ok ()) {
716728 *ret = 1 ;
729+ if (!parsed_sets_meta_value.CheckModifyCount (-1 )){
730+ return Status::InvalidArgument (" set size overflow" );
731+ }
717732 parsed_sets_meta_value.ModifyCount (-1 );
718733 batch.Put (handles_[0 ], source, meta_value);
719734 batch.Delete (handles_[1 ], sets_member_key.Encode ());
@@ -747,6 +762,9 @@ rocksdb::Status RedisSets::SMove(const Slice& source, const Slice& destination,
747762 SetsMemberKey sets_member_key (destination, version, member);
748763 s = db_->Get (default_read_options_, handles_[1 ], sets_member_key.Encode (), &member_value);
749764 if (s.IsNotFound ()) {
765+ if (!parsed_sets_meta_value.CheckModifyCount (1 )){
766+ return Status::InvalidArgument (" set size overflow" );
767+ }
750768 parsed_sets_meta_value.ModifyCount (1 );
751769 batch.Put (handles_[0 ], destination, meta_value);
752770 batch.Put (handles_[1 ], sets_member_key.Encode (), Slice ());
@@ -843,6 +861,9 @@ rocksdb::Status RedisSets::SPop(const Slice& key, std::vector<std::string>* memb
843861 }
844862 }
845863
864+ if (!parsed_sets_meta_value.CheckModifyCount (static_cast <int32_t >(-cnt))){
865+ return Status::InvalidArgument (" set size overflow" );
866+ }
846867 parsed_sets_meta_value.ModifyCount (static_cast <int32_t >(-cnt));
847868 batch.Put (handles_[0 ], key, meta_value);
848869 delete iter;
@@ -974,6 +995,9 @@ rocksdb::Status RedisSets::SRem(const Slice& key, const std::vector<std::string>
974995 }
975996 }
976997 *ret = cnt;
998+ if (!parsed_sets_meta_value.CheckModifyCount (-cnt)){
999+ return Status::InvalidArgument (" set size overflow" );
1000+ }
9771001 parsed_sets_meta_value.ModifyCount (-cnt);
9781002 batch.Put (handles_[0 ], key, meta_value);
9791003 }
@@ -1086,6 +1110,9 @@ rocksdb::Status RedisSets::SUnionstore(const Slice& destination, const std::vect
10861110 ParsedSetsMetaValue parsed_sets_meta_value (&meta_value);
10871111 statistic = parsed_sets_meta_value.count ();
10881112 version = parsed_sets_meta_value.InitialMetaValue ();
1113+ if (!parsed_sets_meta_value.check_set_count (static_cast <int32_t >(members.size ()))) {
1114+ return Status::InvalidArgument (" set size overflow" );
1115+ }
10891116 parsed_sets_meta_value.set_count (static_cast <int32_t >(members.size ()));
10901117 batch.Put (handles_[0 ], destination, meta_value);
10911118 } else if (s.IsNotFound ()) {
0 commit comments