dix: AddExtension: simplify error return path
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
		
							parent
							
								
									9149af91d2
								
							
						
					
					
						commit
						d536bd7f66
					
				| 
						 | 
					@ -76,7 +76,6 @@ AddExtension(const char *name, int NumEvents, int NumErrors,
 | 
				
			||||||
             unsigned short (*MinorOpcodeProc) (ClientPtr c3))
 | 
					             unsigned short (*MinorOpcodeProc) (ClientPtr c3))
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
    ExtensionEntry *ext, **newexts;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!MainProc || !SwappedMainProc || !MinorOpcodeProc)
 | 
					    if (!MainProc || !SwappedMainProc || !MinorOpcodeProc)
 | 
				
			||||||
        return ((ExtensionEntry *) NULL);
 | 
					        return ((ExtensionEntry *) NULL);
 | 
				
			||||||
| 
						 | 
					@ -87,27 +86,21 @@ AddExtension(const char *name, int NumEvents, int NumErrors,
 | 
				
			||||||
        return ((ExtensionEntry *) NULL);
 | 
					        return ((ExtensionEntry *) NULL);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ext = calloc(1, sizeof(ExtensionEntry));
 | 
					    ExtensionEntry *ext = calloc(1, sizeof(ExtensionEntry));
 | 
				
			||||||
    if (!ext)
 | 
					    if (!ext)
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    if (!dixAllocatePrivates(&ext->devPrivates, PRIVATE_EXTENSION)) {
 | 
					    if (!dixAllocatePrivates(&ext->devPrivates, PRIVATE_EXTENSION))
 | 
				
			||||||
        free(ext);
 | 
					        goto badalloc;
 | 
				
			||||||
        return NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    ext->name = strdup(name);
 | 
					    ext->name = strdup(name);
 | 
				
			||||||
    if (!ext->name) {
 | 
					    if (!ext->name)
 | 
				
			||||||
        dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
 | 
					        goto badalloc;
 | 
				
			||||||
        free(ext);
 | 
					
 | 
				
			||||||
        return ((ExtensionEntry *) NULL);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    i = NumExtensions;
 | 
					    i = NumExtensions;
 | 
				
			||||||
    newexts = reallocarray(extensions, i + 1, sizeof(ExtensionEntry *));
 | 
					
 | 
				
			||||||
    if (!newexts) {
 | 
					    ExtensionEntry **newexts = reallocarray(extensions, i + 1, sizeof(ExtensionEntry *));
 | 
				
			||||||
        free((void *) ext->name);
 | 
					    if (!newexts)
 | 
				
			||||||
        dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
 | 
					        goto badalloc;
 | 
				
			||||||
        free(ext);
 | 
					
 | 
				
			||||||
        return ((ExtensionEntry *) NULL);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    NumExtensions++;
 | 
					    NumExtensions++;
 | 
				
			||||||
    extensions = newexts;
 | 
					    extensions = newexts;
 | 
				
			||||||
    extensions[i] = ext;
 | 
					    extensions[i] = ext;
 | 
				
			||||||
| 
						 | 
					@ -140,6 +133,14 @@ AddExtension(const char *name, int NumEvents, int NumErrors,
 | 
				
			||||||
    RegisterExtensionNames(ext);
 | 
					    RegisterExtensionNames(ext);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    return ext;
 | 
					    return ext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					badalloc:
 | 
				
			||||||
 | 
					    if (ext) {
 | 
				
			||||||
 | 
					        free((char*)ext->name);
 | 
				
			||||||
 | 
					        dixFreePrivates(ext->devPrivates, PRIVATE_EXTENSION);
 | 
				
			||||||
 | 
					        free(ext);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -541,6 +541,9 @@ _dixFreeObjectWithPrivates(void *object, PrivatePtr privates,
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
dixFreePrivates(PrivatePtr privates, DevPrivateType type)
 | 
					dixFreePrivates(PrivatePtr privates, DevPrivateType type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (!privates)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _dixFiniPrivates(privates, type);
 | 
					    _dixFiniPrivates(privates, type);
 | 
				
			||||||
    --global_keys[type].allocated;
 | 
					    --global_keys[type].allocated;
 | 
				
			||||||
    free(privates);
 | 
					    free(privates);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue