hostmem: fix QEMU crash by 'info memdev'
'info memdev' crashes QEMU: (qemu) info memdev Unexpected error in parse_str() at qapi/string-input-visitor.c:111: Parameter 'null' expects an int64 value or range It is caused by null uint16List is returned if 'host-nodes' is the default value Return MAX_NODES under this case to fix this bug Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									aa5cb7f5e8
								
							
						
					
					
						commit
						1454d33f05
					
				@ -64,6 +64,14 @@ out:
 | 
				
			|||||||
    error_propagate(errp, local_err);
 | 
					    error_propagate(errp, local_err);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint16List **host_memory_append_node(uint16List **node,
 | 
				
			||||||
 | 
					                                            unsigned long value)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					     *node = g_malloc0(sizeof(**node));
 | 
				
			||||||
 | 
					     (*node)->value = value;
 | 
				
			||||||
 | 
					     return &(*node)->next;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
host_memory_backend_get_host_nodes(Object *obj, Visitor *v, const char *name,
 | 
					host_memory_backend_get_host_nodes(Object *obj, Visitor *v, const char *name,
 | 
				
			||||||
                                   void *opaque, Error **errp)
 | 
					                                   void *opaque, Error **errp)
 | 
				
			||||||
@ -74,13 +82,12 @@ host_memory_backend_get_host_nodes(Object *obj, Visitor *v, const char *name,
 | 
				
			|||||||
    unsigned long value;
 | 
					    unsigned long value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    value = find_first_bit(backend->host_nodes, MAX_NODES);
 | 
					    value = find_first_bit(backend->host_nodes, MAX_NODES);
 | 
				
			||||||
    if (value == MAX_NODES) {
 | 
					 | 
				
			||||||
        return;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *node = g_malloc0(sizeof(**node));
 | 
					    node = host_memory_append_node(node, value);
 | 
				
			||||||
    (*node)->value = value;
 | 
					
 | 
				
			||||||
    node = &(*node)->next;
 | 
					    if (value == MAX_NODES) {
 | 
				
			||||||
 | 
					        goto out;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    do {
 | 
					    do {
 | 
				
			||||||
        value = find_next_bit(backend->host_nodes, MAX_NODES, value + 1);
 | 
					        value = find_next_bit(backend->host_nodes, MAX_NODES, value + 1);
 | 
				
			||||||
@ -88,11 +95,10 @@ host_memory_backend_get_host_nodes(Object *obj, Visitor *v, const char *name,
 | 
				
			|||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        *node = g_malloc0(sizeof(**node));
 | 
					        node = host_memory_append_node(node, value);
 | 
				
			||||||
        (*node)->value = value;
 | 
					 | 
				
			||||||
        node = &(*node)->next;
 | 
					 | 
				
			||||||
    } while (true);
 | 
					    } while (true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
    visit_type_uint16List(v, name, &host_nodes, errp);
 | 
					    visit_type_uint16List(v, name, &host_nodes, errp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user