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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
REFLECT_STRUCT(InitializeParam, rootUri, initializationOptions, capabilities,
 | 
			
		||||
               trace, workspaceFolders);
 | 
			
		||||
// initializationOptions is deserialized separately.
 | 
			
		||||
REFLECT_STRUCT(InitializeParam, rootUri, capabilities, trace, workspaceFolders);
 | 
			
		||||
 | 
			
		||||
struct InitializeResult {
 | 
			
		||||
  ServerCap capabilities;
 | 
			
		||||
@ -395,6 +395,17 @@ void Initialize(MessageHandler *m, InitializeParam ¶m, ReplyOnce &reply) {
 | 
			
		||||
void MessageHandler::initialize(JsonReader &reader, ReplyOnce &reply) {
 | 
			
		||||
  InitializeParam 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) {
 | 
			
		||||
    reply.Error(ErrorCode::InvalidRequest, "expected rootUri");
 | 
			
		||||
    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 DenseSet<CachedHashStringRef> Strings;
 | 
			
		||||
static std::mutex AllocMutex;
 | 
			
		||||
 | 
			
		||||
@ -379,6 +379,7 @@ template <typename T> void Reflect(BinaryWriter &vis, std::vector<T> &v) {
 | 
			
		||||
 | 
			
		||||
// ReflectMember
 | 
			
		||||
 | 
			
		||||
void ReflectMemberStart(JsonReader &);
 | 
			
		||||
template <typename T> void ReflectMemberStart(T &) {}
 | 
			
		||||
inline void ReflectMemberStart(JsonWriter &vis) { vis.StartObject(); }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user