mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-11-03 22:04:24 +00:00 
			
		
		
		
	Add error checking of object deserialization; ignore non-object initializationOptions
This commit is contained in:
		
							parent
							
								
									a41b976a77
								
							
						
					
					
						commit
						aded3faf97
					
				@ -226,8 +226,8 @@ void Reflect(JsonReader &reader, InitializeParam::Trace &value) {
 | 
				
			|||||||
    value = InitializeParam::Trace::Verbose;
 | 
					    value = InitializeParam::Trace::Verbose;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
REFLECT_STRUCT(InitializeParam, rootUri, initializationOptions, capabilities,
 | 
					// initializationOptions is deserialized separately.
 | 
				
			||||||
               trace, workspaceFolders);
 | 
					REFLECT_STRUCT(InitializeParam, rootUri, capabilities, trace, workspaceFolders);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct InitializeResult {
 | 
					struct InitializeResult {
 | 
				
			||||||
  ServerCap capabilities;
 | 
					  ServerCap capabilities;
 | 
				
			||||||
@ -395,6 +395,17 @@ void Initialize(MessageHandler *m, InitializeParam ¶m, ReplyOnce &reply) {
 | 
				
			|||||||
void MessageHandler::initialize(JsonReader &reader, ReplyOnce &reply) {
 | 
					void MessageHandler::initialize(JsonReader &reader, ReplyOnce &reply) {
 | 
				
			||||||
  InitializeParam param;
 | 
					  InitializeParam param;
 | 
				
			||||||
  Reflect(reader, param);
 | 
					  Reflect(reader, param);
 | 
				
			||||||
 | 
					  auto it = reader.m->FindMember("initializationOptions");
 | 
				
			||||||
 | 
					  if (it != reader.m->MemberEnd() && it->value.IsObject()) {
 | 
				
			||||||
 | 
					    JsonReader m1(&it->value);
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      Reflect(m1, param.initializationOptions);
 | 
				
			||||||
 | 
					    } catch (std::invalid_argument &) {
 | 
				
			||||||
 | 
					      reader.path_.push_back("initializationOptions");
 | 
				
			||||||
 | 
					      reader.path_.insert(reader.path_.end(), m1.path_.begin(), m1.path_.end());
 | 
				
			||||||
 | 
					      throw;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  if (!param.rootUri) {
 | 
					  if (!param.rootUri) {
 | 
				
			||||||
    reply.Error(ErrorCode::InvalidRequest, "expected rootUri");
 | 
					    reply.Error(ErrorCode::InvalidRequest, "expected rootUri");
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
 | 
				
			|||||||
@ -408,6 +408,11 @@ void Reflect(JsonWriter &vis, SerializeFormat &v) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ReflectMemberStart(JsonReader &vis) {
 | 
				
			||||||
 | 
					  if (!vis.m->IsObject())
 | 
				
			||||||
 | 
					    throw std::invalid_argument("object");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static BumpPtrAllocator Alloc;
 | 
					static BumpPtrAllocator Alloc;
 | 
				
			||||||
static DenseSet<CachedHashStringRef> Strings;
 | 
					static DenseSet<CachedHashStringRef> Strings;
 | 
				
			||||||
static std::mutex AllocMutex;
 | 
					static std::mutex AllocMutex;
 | 
				
			||||||
 | 
				
			|||||||
@ -379,6 +379,7 @@ template <typename T> void Reflect(BinaryWriter &vis, std::vector<T> &v) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ReflectMember
 | 
					// ReflectMember
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ReflectMemberStart(JsonReader &);
 | 
				
			||||||
template <typename T> void ReflectMemberStart(T &) {}
 | 
					template <typename T> void ReflectMemberStart(T &) {}
 | 
				
			||||||
inline void ReflectMemberStart(JsonWriter &vis) { vis.StartObject(); }
 | 
					inline void ReflectMemberStart(JsonWriter &vis) { vis.StartObject(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user