target-i386: Fix X86CPU error handling
Error **errp argument is not for emitting warnings, it means an error has occurred and the caller should not make any assumptions about the state of other return values (unless otherwise documented). Therefore cpu_x86_create() must unref the new X86CPU itself, and pc_new_cpu() must check for an Error rather than NULL return value. While at it, clean up a superfluous NULL check. Reported-by: Jan Kiszka <jan.kiszka@siemens.com> Cc: qemu-stable@nongnu.org Cc: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
		
							parent
							
								
									a1fc6246b3
								
							
						
					
					
						commit
						cd7b87ffe9
					
				
							
								
								
									
										13
									
								
								hw/i386/pc.c
								
								
								
								
							
							
						
						
									
										13
									
								
								hw/i386/pc.c
								
								
								
								
							| 
						 | 
					@ -912,20 +912,19 @@ static X86CPU *pc_new_cpu(const char *cpu_model, int64_t apic_id,
 | 
				
			||||||
    X86CPU *cpu;
 | 
					    X86CPU *cpu;
 | 
				
			||||||
    Error *local_err = NULL;
 | 
					    Error *local_err = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cpu = cpu_x86_create(cpu_model, icc_bridge, errp);
 | 
					    cpu = cpu_x86_create(cpu_model, icc_bridge, &local_err);
 | 
				
			||||||
    if (!cpu) {
 | 
					    if (local_err != NULL) {
 | 
				
			||||||
        return cpu;
 | 
					        error_propagate(errp, local_err);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object_property_set_int(OBJECT(cpu), apic_id, "apic-id", &local_err);
 | 
					    object_property_set_int(OBJECT(cpu), apic_id, "apic-id", &local_err);
 | 
				
			||||||
    object_property_set_bool(OBJECT(cpu), true, "realized", &local_err);
 | 
					    object_property_set_bool(OBJECT(cpu), true, "realized", &local_err);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (local_err) {
 | 
					    if (local_err) {
 | 
				
			||||||
        if (cpu != NULL) {
 | 
					 | 
				
			||||||
            object_unref(OBJECT(cpu));
 | 
					 | 
				
			||||||
            cpu = NULL;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        error_propagate(errp, local_err);
 | 
					        error_propagate(errp, local_err);
 | 
				
			||||||
 | 
					        object_unref(OBJECT(cpu));
 | 
				
			||||||
 | 
					        cpu = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return cpu;
 | 
					    return cpu;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1824,7 +1824,11 @@ X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
    error_propagate(errp, error);
 | 
					    if (error != NULL) {
 | 
				
			||||||
 | 
					        error_propagate(errp, error);
 | 
				
			||||||
 | 
					        object_unref(OBJECT(cpu));
 | 
				
			||||||
 | 
					        cpu = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    g_strfreev(model_pieces);
 | 
					    g_strfreev(model_pieces);
 | 
				
			||||||
    return cpu;
 | 
					    return cpu;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue