1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-05 20:58:40 +03:00

When deleting a key from the registry make sure the non-default

security descriptor gets deleted as well.

Guenther
This commit is contained in:
Günther Deschner 2007-11-06 00:50:47 +01:00
parent bf23c4ddff
commit d140d68537
4 changed files with 32 additions and 14 deletions

View File

@ -498,7 +498,7 @@ WERROR reg_deletekey(struct registry_key *parent, const char *path)
TALLOC_CTX *mem_ctx;
char *name, *end;
int num_subkeys;
struct registry_key *tmp_key;
struct registry_key *tmp_key, *key;
if (!(mem_ctx = talloc_init("reg_createkey"))) return WERR_NOMEM;
@ -508,14 +508,14 @@ WERROR reg_deletekey(struct registry_key *parent, const char *path)
}
/* check if the key has subkeys */
err = reg_openkey(mem_ctx, parent, name, REG_KEY_READ, &tmp_key);
err = reg_openkey(mem_ctx, parent, name, REG_KEY_READ, &key);
if (!W_ERROR_IS_OK(err)) {
goto error;
}
if (!W_ERROR_IS_OK(err = fill_subkey_cache(tmp_key))) {
if (!W_ERROR_IS_OK(err = fill_subkey_cache(key))) {
goto error;
}
if (tmp_key->subkeys->num_subkeys > 0) {
if (key->subkeys->num_subkeys > 0) {
err = WERR_ACCESS_DENIED;
goto error;
}
@ -556,7 +556,10 @@ WERROR reg_deletekey(struct registry_key *parent, const char *path)
goto error;
}
regkey_set_secdesc(key->key, NULL);
err = WERR_OK;
error:
TALLOC_FREE(mem_ctx);
return err;

View File

@ -788,6 +788,21 @@ static WERROR regdb_set_secdesc(const char *key,
}
normalize_dbkey(tdbkey);
if (secdesc == NULL) {
/* assuming a delete */
int tdb_ret;
tdb_ret = tdb_trans_delete(tdb_reg->tdb,
string_term_tdb_data(tdbkey));
if (tdb_ret == -1) {
err = ntstatus_to_werror(map_nt_error_from_unix(errno));
} else {
err = WERR_OK;
}
goto done;
}
err = ntstatus_to_werror(marshall_sec_desc(mem_ctx, secdesc,
&tdbdata.dptr,
&tdbdata.dsize));

View File

@ -101,16 +101,6 @@ WERROR regkey_open_internal( TALLOC_CTX *ctx, REGISTRY_KEY **regkey,
return WERR_OK;
}
WERROR regkey_set_secdesc(REGISTRY_KEY *key,
struct security_descriptor *psecdesc)
{
if (key->hook && key->hook->ops && key->hook->ops->set_secdesc) {
return key->hook->ops->set_secdesc(key->name, psecdesc);
}
return WERR_ACCESS_DENIED;
}
/*
* Utility function to create a registry key without opening the hive
* before. Assumes the hive already exists.

View File

@ -204,3 +204,13 @@ WERROR regkey_get_secdesc(TALLOC_CTX *mem_ctx, REGISTRY_KEY *key,
*psecdesc = secdesc;
return WERR_OK;
}
WERROR regkey_set_secdesc(REGISTRY_KEY *key,
struct security_descriptor *psecdesc)
{
if (key->hook && key->hook->ops && key->hook->ops->set_secdesc) {
return key->hook->ops->set_secdesc(key->name, psecdesc);
}
return WERR_ACCESS_DENIED;
}