* fork being emptied and put in shortform format.
*/
+static int
+attr_namecheck(
+ uint8_t *name,
+ int length)
+{
+ return namecheck((char *)name, length, false);
+}
+
/*
* This routine just checks what security needs are for attribute values
* only called when root flag is set, otherwise these names could exist in
}
}
- /* namecheck checks for / and null terminated for file names.
- * attributes names currently follow the same rules.
- */
- if (namecheck((char *)¤tentry->nameval[0],
- currententry->namelen)) {
+ /* namecheck checks for null chars in attr names. */
+ if (attr_namecheck(currententry->nameval,
+ currententry->namelen)) {
do_warn(
_("entry contains illegal character in shortform attribute name\n"));
junkit = 1;
xfs_attr_leaf_name_local_t *local;
local = xfs_attr3_leaf_name_local(leaf, i);
- if (local->namelen == 0 || namecheck((char *)&local->nameval[0],
+ if (local->namelen == 0 || attr_namecheck(local->nameval,
local->namelen)) {
do_warn(
_("attribute entry %d in attr block %u, inode %" PRIu64 " has bad name (namelen = %d)\n"),
remotep = xfs_attr3_leaf_name_remote(leaf, i);
- if (remotep->namelen == 0 || namecheck((char *)&remotep->name[0],
+ if (remotep->namelen == 0 || attr_namecheck(remotep->name,
remotep->namelen) ||
be32_to_cpu(entry->hashval) !=
libxfs_da_hashname((unsigned char *)&remotep->name[0],
#include "da_util.h"
/*
- * takes a name and length (name need not be null-terminated)
- * and returns 1 if the name contains a '/' or a \0, returns 0
- * otherwise
+ * Takes a name and length (name need not be null-terminated) and whether
+ * we are checking a dir (as opposed to an attr).
+ * Returns 1 if the name contains a NUL or if a directory entry contains a '/'.
+ * Returns 0 if the name checks out.
*/
int
-namecheck(char *name, int length)
+namecheck(
+ char *name,
+ int length,
+ bool isadir)
{
- char *c;
- int i;
+ char *c;
+ int i;
ASSERT(length < MAXNAMELEN);
for (c = name, i = 0; i < length; i++, c++) {
- if (*c == '/' || *c == '\0')
+ if (isadir && *c == '/')
+ return 0;
+ if (*c == '\0')
return 1;
}
l->ino = ino;
}
+static int
+dir_namecheck(
+ uint8_t *name,
+ int length)
+{
+ return namecheck((char *)name, length, true);
+}
+
int
dir2_is_badino(
xfs_ino_t ino)
* the length value is stored in a byte
* so it can't be too big, it can only wrap
*/
- if (namecheck((char *)&sfep->name[0], namelen)) {
+ if (dir_namecheck(sfep->name, namelen)) {
/*
* junk entry
*/
* during phase 4.
*/
junkit = dep->name[0] == '/';
- nm_illegal = namecheck((char *)dep->name, dep->namelen);
+ nm_illegal = dir_namecheck(dep->name, dep->namelen);
if (ino_discovery && nm_illegal) {
do_warn(
_("entry at block %u offset %" PRIdPTR " in directory inode %" PRIu64 " has illegal name \"%*.*s\": "),