}
/*
- * Copy the flag name of flagnum to outstr.
+ * Copy the flag name of flagnum to outstr. On error, outstr points to a null
+ * pointer.
*/
krb5_error_code
krb5_flagnum_to_string(int flagnum, char **outstr)
const char *s = NULL;
*outstr = NULL;
- if ((unsigned int)flagnum < NOUTFLAGS) {
+ if ((unsigned int)flagnum < NOUTFLAGS)
s = outflags[flagnum];
- }
- if (s == NULL)
+ if (s == NULL) {
/* Assume that krb5_flags are 32 bits long. */
- asprintf(outstr, "0x%08lx", 1UL<<flagnum);
- else
+ if (asprintf(outstr, "0x%08lx", 1UL << flagnum) == -1)
+ *outstr = NULL;
+ } else {
*outstr = strdup(s);
+ }
if (*outstr == NULL)
return ENOMEM;
return 0;
}
a = a_new;
retval = krb5_flagnum_to_string(i, &a[amax++]);
+ a[amax] = NULL;
if (retval)
goto cleanup;
- a[amax] = NULL;
}
*outarray = a;
return 0;
cleanup:
for (ap = a; ap != NULL && *ap != NULL; ap++) {
- free(ap);
+ free(*ap);
}
free(a);
return retval;
fail('Failed to keep flag ' + outname + ' clear')
+# Set all flags simultaneously, even the ones that aren't defined yet.
+def lamptest():
+ pat = re.compile('^Attributes: ' +
+ ' '.join(flags2namelist(0xffffffff)) +
+ '$', re.MULTILINE)
+ realm.run([kadminl, 'ank', '-pw', 'password', '+0xffffffff', 'test'])
+ out = realm.run([kadminl, 'getprinc', 'test'])
+ if not pat.search(out):
+ fail('Failed to simultaenously set all flags')
+ realm.run([kadminl, 'delprinc', 'test'])
+
+
for ftuple in kadmin_ftuples:
one_kadmin_flag(ftuple)
one_aclcheck(ftuple, True)
one_aclcheck(ftuple, False)
+lamptest()
success('KDB principal flags')