* [SEPOL] Const in APIs (2)
@ 2006-01-06 15:27 Ivan Gyurdiev
2006-01-09 14:11 ` Stephen Smalley
0 siblings, 1 reply; 2+ messages in thread
From: Ivan Gyurdiev @ 2006-01-06 15:27 UTC (permalink / raw)
To: SELinux List; +Cc: Stephen Smalley
[-- Attachment #1: Type: text/plain, Size: 269 bytes --]
Remove malloc nonsense due to non-const hashtab keys.
Note: I don't understand how symtab_init can get away with initializing
a comparator/hasher with non-const keys. I specifically marked those
const in hashtab_init, but that doesn't seem to cause any warnings.
[-- Attachment #2: libsepol.const_api2.diff --]
[-- Type: text/x-patch, Size: 9299 bytes --]
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsepol/include/sepol/policydb/hashtab.h new/libsepol/include/sepol/policydb/hashtab.h
--- old/libsepol/include/sepol/policydb/hashtab.h 2005-10-07 16:45:17.000000000 -0400
+++ new/libsepol/include/sepol/policydb/hashtab.h 2006-01-06 10:15:09.000000000 -0500
@@ -52,13 +52,17 @@ typedef hashtab_val_t *hashtab_t;
Returns NULL if insufficent space is available or
the new hash table otherwise.
*/
-extern hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
- hashtab_key_t key),
- int (*keycmp) (hashtab_t h,
- hashtab_key_t key1,
- hashtab_key_t key2),
- unsigned int size);
-
+extern hashtab_t hashtab_create(
+ unsigned int (*hash_value) (
+ hashtab_t h,
+ const hashtab_key_t key),
+
+ int (*keycmp) (
+ hashtab_t h,
+ const hashtab_key_t key1,
+ const hashtab_key_t key2),
+
+ unsigned int size);
/*
Inserts the specified (key, datum) pair into the specified hash table.
@@ -103,7 +107,9 @@ extern int hashtab_replace(hashtab_t h,
Returns NULL if no entry has the specified key or
the datum of the entry otherwise.
*/
-extern hashtab_datum_t hashtab_search(hashtab_t h, hashtab_key_t k);
+extern hashtab_datum_t hashtab_search(
+ hashtab_t h,
+ const hashtab_key_t k);
/*
Destroys the specified hash table.
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsepol/src/hashtab.c new/libsepol/src/hashtab.c
--- old/libsepol/src/hashtab.c 2005-10-07 16:45:46.000000000 -0400
+++ new/libsepol/src/hashtab.c 2006-01-06 10:10:47.000000000 -0500
@@ -11,13 +11,17 @@
#include <string.h>
#include <sepol/policydb/hashtab.h>
-hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
- hashtab_key_t key),
- int (*keycmp) (hashtab_t h,
- hashtab_key_t key1,
- hashtab_key_t key2),
- unsigned int size)
-{
+hashtab_t hashtab_create(
+ unsigned int (*hash_value) (
+ hashtab_t h,
+ const hashtab_key_t key),
+
+ int (*keycmp) (
+ hashtab_t h,
+ const hashtab_key_t key1,
+ const hashtab_key_t key2),
+ unsigned int size) {
+
hashtab_t p;
unsigned int i;
@@ -165,13 +169,13 @@ int hashtab_replace(hashtab_t h, hashtab
}
-hashtab_datum_t
-hashtab_search(hashtab_t h, hashtab_key_t key)
-{
+hashtab_datum_t hashtab_search(
+ hashtab_t h,
+ const hashtab_key_t key) {
+
int hvalue;
hashtab_ptr_t cur;
-
if (!h)
return NULL;
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsepol/src/roles.c new/libsepol/src/roles.c
--- old/libsepol/src/roles.c 2005-10-26 09:34:29.000000000 -0400
+++ new/libsepol/src/roles.c 2006-01-06 10:09:00.000000000 -0500
@@ -2,6 +2,7 @@
#include <string.h>
#include <stddef.h>
+#include <sepol/policydb/hashtab.h>
#include <sepol/policydb/policydb.h>
#include "debug.h"
@@ -15,14 +16,10 @@ int sepol_role_exists(
int* response) {
policydb_t *policydb = &p->p;
- char* role_copy = strdup(role);
- if (!role_copy) {
- ERR(handle, "out of memory, role check failed");
- return STATUS_ERR;
- }
+ *response = (hashtab_search(policydb->p_roles.table,
+ (const hashtab_key_t) role) != NULL);
- *response = (hashtab_search(policydb->p_roles.table, role_copy) != NULL);
- free(role_copy);
+ handle = NULL;
return STATUS_SUCCESS;
}
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsepol/src/symtab.c new/libsepol/src/symtab.c
--- old/libsepol/src/symtab.c 2005-10-07 16:45:46.000000000 -0400
+++ new/libsepol/src/symtab.c 2006-01-06 10:11:44.000000000 -0500
@@ -8,6 +8,7 @@
*/
#include <string.h>
+#include <sepol/policydb/hashtab.h>
#include <sepol/policydb/symtab.h>
static unsigned int symhash(hashtab_t h, hashtab_key_t key)
diff -Naurp --exclude ports_local.c --exclude-from excludes old/libsepol/src/users.c new/libsepol/src/users.c
--- old/libsepol/src/users.c 2006-01-06 09:36:28.000000000 -0500
+++ new/libsepol/src/users.c 2006-01-06 10:08:46.000000000 -0500
@@ -7,6 +7,7 @@
#include "handle.h"
#include <sepol/policydb/policydb.h>
+#include <sepol/policydb/hashtab.h>
#include <sepol/policydb/expand.h>
#include "user_internal.h"
#include "mls.h"
@@ -108,11 +109,10 @@ int sepol_user_modify(
/* For user data */
const char *cname, *cmls_level, *cmls_range;
- char *name = NULL, *mls_level = NULL, *mls_range = NULL;
+ char *name = NULL;
const char **roles = NULL;
size_t num_roles = 0;
- char *role = NULL;
/* Low-level representation */
user_datum_t* usrdatum = NULL;
@@ -127,22 +127,17 @@ int sepol_user_modify(
/* First, extract all the data */
sepol_user_key_unpack(key, &cname);
- name = strdup(cname);
cmls_level = sepol_user_get_mlslevel(user);
cmls_range = sepol_user_get_mlsrange(user);
- mls_level = cmls_level? strdup(cmls_level): NULL;
- mls_range = cmls_range? strdup(cmls_range): NULL;
/* Make sure that worked properly */
if (sepol_user_get_roles(handle, user, &roles, &num_roles) < 0)
goto err;
- if (!name || (cmls_level && !mls_level) || (cmls_range && !mls_range))
- goto omem;
-
/* Now, see if a user exists */
- usrdatum = hashtab_search(policydb->p_users.table, name);
+ usrdatum = hashtab_search(policydb->p_users.table,
+ (const hashtab_key_t) cname);
/* If it does, we will modify it */
if (usrdatum) {
@@ -163,15 +158,13 @@ int sepol_user_modify(
/* For every role */
for (i = 0; i < num_roles; i++) {
- char* role = strdup(roles[i]);
- if (!role)
- goto omem;
/* Search for the role */
- roldatum = hashtab_search(policydb->p_roles.table, role);
+ roldatum = hashtab_search(policydb->p_roles.table,
+ (const hashtab_key_t) roles[i]);
if (!roldatum) {
ERR(handle, "undefined role %s for user %s",
- role, name);
+ roles[i], cname);
goto err;
}
@@ -183,47 +176,44 @@ int sepol_user_modify(
goto omem;
}
}
-
- free(role);
- role = NULL;
}
/* For MLS systems */
if (policydb->mls) {
/* MLS level */
- if (mls_level == NULL) {
+ if (cmls_level == NULL) {
ERR(handle, "MLS is enabled, but no MLS "
- "default level was defined for user %s", name);
+ "default level was defined for user %s", cname);
goto err;
}
context_init(&context);
- if (mls_from_string(handle, policydb, mls_level, &context) < 0) {
+ if (mls_from_string(handle, policydb, cmls_level, &context) < 0) {
context_destroy(&context);
goto err;
}
if (mls_level_cpy(&usrdatum->dfltlevel, &context.range.level[0]) < 0) {
- ERR(handle, "could not copy MLS level %s", mls_level);
+ ERR(handle, "could not copy MLS level %s", cmls_level);
context_destroy(&context);
goto err;
}
context_destroy(&context);
/* MLS range */
- if (mls_range == NULL) {
+ if (cmls_range == NULL) {
ERR(handle, "MLS is enabled, but no MLS"
- "range was defined for user %s", name);
+ "range was defined for user %s", cname);
goto err;
}
context_init(&context);
- if (mls_from_string(handle, policydb, mls_range, &context) < 0) {
+ if (mls_from_string(handle, policydb, cmls_range, &context) < 0) {
context_destroy(&context);
goto err;
}
if (mls_range_cpy(&usrdatum->range, &context.range) < 0) {
- ERR(handle, "could not copy MLS range %s", mls_range);
+ ERR(handle, "could not copy MLS range %s", cmls_range);
context_destroy(&context);
goto err;
}
@@ -247,6 +237,11 @@ int sepol_user_modify(
goto omem;
policydb->sym_val_to_name[SYM_USERS] = tmp_ptr;
+ /* Need to copy the user name */
+ name = strdup(cname);
+ if (!name)
+ goto omem;
+
/* Store user */
usrdatum->value = ++policydb->p_users.nprim;
if (hashtab_insert(policydb->p_users.table, name,
@@ -265,10 +260,7 @@ int sepol_user_modify(
}
}
- free(name);
free(roles);
- free(mls_range);
- free(mls_level);
return STATUS_SUCCESS;
omem:
@@ -278,10 +270,7 @@ int sepol_user_modify(
ERR(handle, "could not load %s into policy", name);
free(name);
- free(role);
free(roles);
- free(mls_range);
- free(mls_level);
if (new && usrdatum) {
role_set_destroy(&usrdatum->roles);
free(usrdatum);
@@ -298,17 +287,12 @@ int sepol_user_exists(
const policydb_t* policydb = &p->p;
const char* cname;
- char* name = NULL;
sepol_user_key_unpack(key, &cname);
- name = strdup(cname);
- if (!name) {
- ERR(handle, "out of memory, user check failed");
- return STATUS_ERR;
- }
-
- *response = (hashtab_search(policydb->p_users.table, name) != NULL);
- free(name);
+ *response = (hashtab_search(policydb->p_users.table,
+ (const hashtab_key_t) cname) != NULL);
+
+ handle = NULL;
return STATUS_SUCCESS;
}
@@ -334,16 +318,10 @@ int sepol_user_query(
user_datum_t* usrdatum = NULL;
const char* cname;
- char* name = NULL;
sepol_user_key_unpack(key, &cname);
- name = strdup(cname);
- if (!name)
- goto omem;
-
- usrdatum = hashtab_search(policydb->p_users.table, name);
- free(name);
- name = NULL;
+ usrdatum = hashtab_search(policydb->p_users.table,
+ (const hashtab_key_t) cname);
if (!usrdatum) {
*response = NULL;
@@ -356,12 +334,8 @@ int sepol_user_query(
return STATUS_SUCCESS;
- omem:
- ERR(handle, "out of memory");
-
err:
ERR(handle, "could not query user %s", cname);
- free(name);
return STATUS_ERR;
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [SEPOL] Const in APIs (2)
2006-01-06 15:27 [SEPOL] Const in APIs (2) Ivan Gyurdiev
@ 2006-01-09 14:11 ` Stephen Smalley
0 siblings, 0 replies; 2+ messages in thread
From: Stephen Smalley @ 2006-01-09 14:11 UTC (permalink / raw)
To: Ivan Gyurdiev; +Cc: Daniel J Walsh, SELinux List
On Fri, 2006-01-06 at 10:27 -0500, Ivan Gyurdiev wrote:
> Remove malloc nonsense due to non-const hashtab keys.
>
> Note: I don't understand how symtab_init can get away with initializing
> a comparator/hasher with non-const keys. I specifically marked those
> const in hashtab_init, but that doesn't seem to cause any warnings.
Merged as of libsepol 1.11.8.
"Strong typing is for weak minds"
--
Stephen Smalley
National Security Agency
--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2006-01-09 14:11 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-06 15:27 [SEPOL] Const in APIs (2) Ivan Gyurdiev
2006-01-09 14:11 ` Stephen Smalley
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.