diff --git a/src/Makefile.am b/src/Makefile.am index d0d1f41db8..314f6df960 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -365,7 +365,8 @@ INTERFACE_CONF_SOURCES = \ # Secret driver generic impl APIs SECRET_CONF_SOURCES = \ - conf/secret_conf.h conf/secret_conf.c + conf/secret_conf.h conf/secret_conf.c \ + conf/virsecretobj.h conf/virsecretobj.c # Network driver generic impl APIs NODE_DEVICE_CONF_SOURCES = \ diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c new file mode 100644 index 0000000000..905e138528 --- /dev/null +++ b/src/conf/virsecretobj.c @@ -0,0 +1,138 @@ +/* + * virsecretobj.c: internal objects handling + * + * Copyright (C) 2009-2016 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include "datatypes.h" +#include "virsecretobj.h" +#include "viralloc.h" +#include "virhash.h" + + +static virClassPtr virSecretObjClass; +static virClassPtr virSecretObjListClass; +static void virSecretObjDispose(void *obj); +static void virSecretObjListDispose(void *obj); + +struct _virSecretObjList { + virObjectLockable parent; + + /* uuid string -> virSecretObj mapping + * for O(1), lockless lookup-by-uuid */ + virHashTable *objs; +}; + +struct virSecretSearchData { + int usageType; + const char *usageID; +}; + + +static int +virSecretObjOnceInit(void) +{ + if (!(virSecretObjClass = virClassNew(virClassForObjectLockable(), + "virSecretObj", + sizeof(virSecretObj), + virSecretObjDispose))) + return -1; + + if (!(virSecretObjListClass = virClassNew(virClassForObjectLockable(), + "virSecretObjList", + sizeof(virSecretObjList), + virSecretObjListDispose))) + return -1; + + return 0; +} + + +VIR_ONCE_GLOBAL_INIT(virSecretObj) + +virSecretObjPtr +virSecretObjNew(void) +{ + virSecretObjPtr secret; + + if (virSecretObjInitialize() < 0) + return NULL; + + if (!(secret = virObjectLockableNew(virSecretObjClass))) + return NULL; + + return secret; +} + + +void +virSecretObjEndAPI(virSecretObjPtr *secret) +{ + if (!*secret) + return; + + virObjectUnlock(*secret); + virObjectUnref(*secret); + *secret = NULL; +} + + +virSecretObjListPtr +virSecretObjListNew(void) +{ + virSecretObjListPtr secrets; + + if (virSecretObjInitialize() < 0) + return NULL; + + if (!(secrets = virObjectLockableNew(virSecretObjListClass))) + return NULL; + + if (!(secrets->objs = virHashCreate(50, virObjectFreeHashData))) { + virObjectUnref(secrets); + return NULL; + } + + return secrets; +} + + +static void +virSecretObjDispose(void *obj) +{ + virSecretObjPtr secret = obj; + + virSecretDefFree(secret->def); + if (secret->value) { + /* Wipe before free to ensure we don't leave a secret on the heap */ + memset(secret->value, 0, secret->value_size); + VIR_FREE(secret->value); + } + VIR_FREE(secret->configFile); + VIR_FREE(secret->base64File); +} + + +static void +virSecretObjListDispose(void *obj) +{ + virSecretObjListPtr secrets = obj; + + virHashFree(secrets->objs); +} diff --git a/src/conf/virsecretobj.h b/src/conf/virsecretobj.h new file mode 100644 index 0000000000..3fc08446a5 --- /dev/null +++ b/src/conf/virsecretobj.h @@ -0,0 +1,49 @@ +/* + * virsecretobj.h: internal objects handling + * + * Copyright (C) 2009-2010, 2013-2014, 2016 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#ifndef __VIRSECRETOBJ_H__ +# define __VIRSECRETOBJ_H__ + +# include "internal.h" + +# include "secret_conf.h" + +typedef struct _virSecretObj virSecretObj; +typedef virSecretObj *virSecretObjPtr; +struct _virSecretObj { + virSecretObjPtr next; + char *configFile; + char *base64File; + virSecretDefPtr def; + unsigned char *value; /* May be NULL */ + size_t value_size; +}; + + +virSecretObjPtr virSecretObjNew(void); + +void virSecretObjEndAPI(virSecretObjPtr *secret); + +typedef struct _virSecretObjList virSecretObjList; +typedef virSecretObjList *virSecretObjListPtr; + +virSecretObjListPtr virSecretObjListNew(void); + +#endif /* __VIRSECRETOBJ_H__ */ diff --git a/src/secret/secret_driver.c b/src/secret/secret_driver.c index 4d157973d4..9165a9f23d 100644 --- a/src/secret/secret_driver.c +++ b/src/secret/secret_driver.c @@ -35,6 +35,7 @@ #include "virlog.h" #include "viralloc.h" #include "secret_conf.h" +#include "virsecretobj.h" #include "secret_driver.h" #include "virthread.h" #include "viruuid.h" @@ -52,17 +53,6 @@ enum { SECRET_MAX_XML_FILE = 10*1024*1024 }; /* Internal driver state */ -typedef struct _virSecretObj virSecretObj; -typedef virSecretObj *virSecretObjPtr; -struct _virSecretObj { - virSecretObjPtr next; - char *configFile; - char *base64File; - virSecretDefPtr def; - unsigned char *value; /* May be NULL */ - size_t value_size; -}; - typedef struct _virSecretDriverState virSecretDriverState; typedef virSecretDriverState *virSecretDriverStatePtr; struct _virSecretDriverState {