1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-02 00:22:11 +03:00

Fix smbc_listxattr() and friends (bug #5189)

When the capability of using full names for DOS attributes was added, a bug
was introduced which caused the wrong number of bytes to be returned.  This
patch to smbc_listxattr_ctx() fixes the problem.

Thanks to Jack Schmidt for this patch.

Derrell
This commit is contained in:
Derrell Lipman
2008-01-13 17:10:06 -05:00
parent 2f43284244
commit 913c335d21
3 changed files with 34 additions and 6 deletions

View File

@ -7,6 +7,7 @@
enum acl_mode enum acl_mode
{ {
SMB_ACL_LIST,
SMB_ACL_GET, SMB_ACL_GET,
SMB_ACL_SET, SMB_ACL_SET,
SMB_ACL_DELETE, SMB_ACL_DELETE,
@ -24,7 +25,7 @@ int main(int argc, const char *argv[])
int debug = 0; int debug = 0;
int numeric = 0; int numeric = 0;
int full_time_names = 0; int full_time_names = 0;
enum acl_mode mode = SMB_ACL_GET; enum acl_mode mode = SMB_ACL_LIST;
static char *the_acl = NULL; static char *the_acl = NULL;
int ret; int ret;
char *p; char *p;
@ -149,6 +150,30 @@ int main(int argc, const char *argv[])
switch(mode) switch(mode)
{ {
case SMB_ACL_LIST:
ret = smbc_listxattr(path, value, sizeof(value)-2);
if (ret < 0)
{
printf("Could not get attribute list for [%s] %d: %s\n",
path, errno, strerror(errno));
return 1;
}
/*
* The list of attributes has a series of null-terminated strings.
* The list of strings terminates with an extra null byte, thus two in
* a row. Ensure that our buffer, which is conceivably shorter than
* the list of attributes, actually ends with two null bytes in a row.
*/
value[sizeof(value) - 2] = '\0';
value[sizeof(value) - 1] = '\0';
printf("Supported attributes:\n");
for (p = value; *p; p += strlen(p) + 1)
{
printf("\t%s\n", p);
}
break;
case SMB_ACL_GET: case SMB_ACL_GET:
if (the_acl == NULL) if (the_acl == NULL)
{ {

View File

@ -1961,7 +1961,7 @@ int smbc_fremovexattr(int fd,
* extended attributes * extended attributes
* *
* @note This function always returns all attribute names supported * @note This function always returns all attribute names supported
* by NT file systems, regardless of wether the referenced * by NT file systems, regardless of whether the referenced
* file system supports extended attributes (e.g. a Windows * file system supports extended attributes (e.g. a Windows
* 2000 machine supports extended attributes if NTFS is used, * 2000 machine supports extended attributes if NTFS is used,
* but not if FAT is used, and Windows 98 doesn't support * but not if FAT is used, and Windows 98 doesn't support

View File

@ -6241,6 +6241,7 @@ smbc_listxattr_ctx(SMBCCTX *context,
* the complete set of attribute names, always, rather than only those * the complete set of attribute names, always, rather than only those
* attribute names which actually exist for a file. Hmmm... * attribute names which actually exist for a file. Hmmm...
*/ */
size_t retsize;
const char supported_old[] = const char supported_old[] =
"system.*\0" "system.*\0"
"system.*+\0" "system.*+\0"
@ -6284,22 +6285,24 @@ smbc_listxattr_ctx(SMBCCTX *context,
if (context->internal->_full_time_names) { if (context->internal->_full_time_names) {
supported = supported_new; supported = supported_new;
retsize = sizeof(supported_new);
} else { } else {
supported = supported_old; supported = supported_old;
retsize = sizeof(supported_old);
} }
if (size == 0) { if (size == 0) {
return sizeof(supported); return retsize;
} }
if (sizeof(supported) > size) { if (retsize > size) {
errno = ERANGE; errno = ERANGE;
return -1; return -1;
} }
/* this can't be strcpy() because there are embedded null characters */ /* this can't be strcpy() because there are embedded null characters */
memcpy(list, supported, sizeof(supported)); memcpy(list, supported, retsize);
return sizeof(supported); return retsize;
} }