const char *smack_label_set_add(SmackLabelSet handle, const char *long_name)
{
- char sl[SMACK64_LEN + 1];
- int pos, len ,ret;
+ char short_name[SMACK64_LEN + 1];
+ int pos, len;
struct smack_label *l;
+ uint32_t h;
+ int i, c;
- len = strlen(long_name);
- pos = (len > SMACK64_LEN) ? len - SMACK64_LEN : 0;
+ // djb2 based on http://www.cse.yorku.ca/~oz/hash.html
+ h = 5381;
- strcpy(sl, &long_name[pos]);
+ for (i = 0; long_name[i] != '\0'; i++) {
+ c = long_name[i];
+ h = ((h << 5) + h) + c;
+ }
+
+ sprintf(short_name, "%04X", h);
l = add_label(&handle->label_by_long_name, &handle->label_by_short_name,
- long_name, sl);
+ long_name, short_name);
return l != NULL ? l->short_name : NULL;
}
ostr = object;
}
+ if (sstr == NULL || ostr == NULL) {
+ ret = -1;
+ break;
+ }
+
if (subject_filter == NULL ||
strcmp(sstr, subject_filter) == 0) {
ac = str_to_ac(access);
"data/rule_set_read_from_file_and_save_to_kernel-in.txt", NULL, labels);
fail_unless(rules != NULL, "Reading rules failed");
+ if (rules == NULL)
+ return;
+
rc = smack_rule_set_save_to_file(rules,
"rule_set_read_from_file_and_save_to_kernel-result.txt",
NULL);