* We mangle the attribute names now, since '/' in attribute names seemed
to be problematic. * Changed our xattr attribute namespace to "user.haiku." to prevent xattrs from other programs (e.g. Beagle) to end up on the image. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22167 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
bf96bbafd8
commit
011e7a3d71
@ -36,8 +36,8 @@ using std::map;
|
|||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
// the namespace all attributes live in
|
// the namespace all attributes live in
|
||||||
static const char* kAttributeNamespace = "user.";
|
static const char* kAttributeNamespace = "user.haiku.";
|
||||||
static const int kAttributeNamespaceLen = 5;
|
static const int kAttributeNamespaceLen = 11;
|
||||||
|
|
||||||
// the maximum length of an attribute listing we support
|
// the maximum length of an attribute listing we support
|
||||||
static const int kMaxAttributeListingLength = 10240;
|
static const int kMaxAttributeListingLength = 10240;
|
||||||
@ -46,6 +46,65 @@ static const int kMaxAttributeListingLength = 10240;
|
|||||||
static const int kMaxAttributeLength = 10240 * 4;
|
static const int kMaxAttributeLength = 10240 * 4;
|
||||||
|
|
||||||
|
|
||||||
|
// mangle_attribute_name
|
||||||
|
static string
|
||||||
|
mangle_attribute_name(const char* name)
|
||||||
|
{
|
||||||
|
// prepend our xattr namespace and translate:
|
||||||
|
// '/' -> "%\"
|
||||||
|
// '%' -> "%%"
|
||||||
|
|
||||||
|
string mangledName = kAttributeNamespace;
|
||||||
|
for (int i = 0; name[i] != '\0'; i++) {
|
||||||
|
char c = name[i];
|
||||||
|
switch (c) {
|
||||||
|
case '/':
|
||||||
|
mangledName += "%\\";
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
mangledName += "%%";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mangledName += c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mangledName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// demangle_attribute_name
|
||||||
|
static bool
|
||||||
|
demangle_attribute_name(const char* name, string& demangledName)
|
||||||
|
{
|
||||||
|
// chop of our xattr namespace and translate:
|
||||||
|
// "%\" -> '/'
|
||||||
|
// "%%" -> '%'
|
||||||
|
|
||||||
|
if (strncmp(name, kAttributeNamespace, kAttributeNamespaceLen) != 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
name += kAttributeNamespaceLen;
|
||||||
|
|
||||||
|
demangledName = "";
|
||||||
|
|
||||||
|
for (int i = 0; name[i] != '\0'; i++) {
|
||||||
|
char c = name[i];
|
||||||
|
if (c == '%') {
|
||||||
|
c = name[++i];
|
||||||
|
if (c == '%')
|
||||||
|
demangledName += c;
|
||||||
|
else if (c == '\\')
|
||||||
|
demangledName += '/';
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
} else
|
||||||
|
demangledName += c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@ -158,10 +217,11 @@ public:
|
|||||||
fListingIndex += nameLen + 1;
|
fListingIndex += nameLen + 1;
|
||||||
|
|
||||||
// check the attribute namespace
|
// check the attribute namespace
|
||||||
if (strncmp(name, kAttributeNamespace, kAttributeNamespaceLen) != 0)
|
string demangledName;
|
||||||
|
if (!demangle_attribute_name(name, demangledName))
|
||||||
continue;
|
continue;
|
||||||
name += kAttributeNamespaceLen;
|
name = demangledName.c_str();
|
||||||
nameLen -= kAttributeNamespaceLen;
|
nameLen = demangledName.length();
|
||||||
|
|
||||||
if (nameLen == 0) {
|
if (nameLen == 0) {
|
||||||
// Uh, weird attribute.
|
// Uh, weird attribute.
|
||||||
@ -393,9 +453,8 @@ fs_read_attr(int fd, const char *_attribute, uint32 type, off_t pos,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepend the attribute namespace
|
// mangle the attribute name
|
||||||
string attribute = kAttributeNamespace;
|
string attribute = mangle_attribute_name(_attribute);
|
||||||
attribute += _attribute;
|
|
||||||
|
|
||||||
// read the attribute
|
// read the attribute
|
||||||
char attributeBuffer[sizeof(AttributeHeader) + kMaxAttributeLength];
|
char attributeBuffer[sizeof(AttributeHeader) + kMaxAttributeLength];
|
||||||
@ -455,9 +514,8 @@ fs_write_attr(int fd, const char *_attribute, uint32 type, off_t pos,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepend the attribute namespace
|
// mangle the attribute name
|
||||||
string attribute = kAttributeNamespace;
|
string attribute = mangle_attribute_name(_attribute);
|
||||||
attribute += _attribute;
|
|
||||||
|
|
||||||
// prepare an attribute buffer
|
// prepare an attribute buffer
|
||||||
char attributeBuffer[sizeof(AttributeHeader) + kMaxAttributeLength];
|
char attributeBuffer[sizeof(AttributeHeader) + kMaxAttributeLength];
|
||||||
@ -500,9 +558,8 @@ fs_remove_attr(int fd, const char *_attribute)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepend the attribute namespace
|
// mangle the attribute name
|
||||||
string attribute = kAttributeNamespace;
|
string attribute = mangle_attribute_name(_attribute);
|
||||||
attribute += _attribute;
|
|
||||||
|
|
||||||
// remove attribute
|
// remove attribute
|
||||||
int result;
|
int result;
|
||||||
@ -538,9 +595,8 @@ fs_stat_attr(int fd, const char *_attribute, struct attr_info *attrInfo)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepend the attribute namespace
|
// mangle the attribute name
|
||||||
string attribute = kAttributeNamespace;
|
string attribute = mangle_attribute_name(_attribute);
|
||||||
attribute += _attribute;
|
|
||||||
|
|
||||||
// read the attribute
|
// read the attribute
|
||||||
char attributeBuffer[sizeof(AttributeHeader) + kMaxAttributeLength];
|
char attributeBuffer[sizeof(AttributeHeader) + kMaxAttributeLength];
|
||||||
|
Loading…
Reference in New Issue
Block a user