[cifs-utils/f16] More idmapping and ACL tool fixes slated for 5.8.
Jeff Layton
jlayton at fedoraproject.org
Wed Nov 7 12:18:17 UTC 2012
commit d8d2002ac8b671bb99fb5d0f3ae64e225f407346
Author: Jeff Layton <jlayton at redhat.com>
Date: Wed Nov 7 07:18:11 2012 -0500
More idmapping and ACL tool fixes slated for 5.8.
cifs-utils-5.8-pre1.patch | 263 ++++++++++++++++++++++++++++++++++++++++-----
cifs-utils.spec | 5 +-
2 files changed, 239 insertions(+), 29 deletions(-)
---
diff --git a/cifs-utils-5.8-pre1.patch b/cifs-utils-5.8-pre1.patch
index 113345b..25f62f1 100644
--- a/cifs-utils-5.8-pre1.patch
+++ b/cifs-utils-5.8-pre1.patch
@@ -340,10 +340,18 @@ index f969b37..07df3be 100644
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile contrib/Makefile contrib/request-key.d/Makefile])
diff --git a/getcifsacl.c b/getcifsacl.c
-index 8cbdb1d..b832c50 100644
+index 8cbdb1d..c576fc0 100644
--- a/getcifsacl.c
+++ b/getcifsacl.c
-@@ -38,7 +38,7 @@
+@@ -31,6 +31,7 @@
+ #include <unistd.h>
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <stddef.h>
+ #include <errno.h>
+ #include <limits.h>
+ #include <wbclient.h>
+@@ -38,7 +39,7 @@
#include <sys/xattr.h>
#include "cifsacl.h"
@@ -352,7 +360,7 @@ index 8cbdb1d..b832c50 100644
static void
print_each_ace_mask(uint32_t mask)
-@@ -171,22 +171,37 @@ print_ace_type(uint8_t acetype, int raw)
+@@ -171,22 +172,37 @@ print_ace_type(uint8_t acetype, int raw)
}
}
@@ -395,7 +403,7 @@ index 8cbdb1d..b832c50 100644
printf("%s", domain_name);
if (strlen(domain_name))
printf("%c", '\\');
-@@ -195,29 +210,41 @@ print_sid(struct wbcDomainSid *sidptr, int raw)
+@@ -195,36 +211,55 @@ print_sid(struct wbcDomainSid *sidptr, int raw)
}
print_sid_raw:
@@ -433,8 +441,15 @@ index 8cbdb1d..b832c50 100644
print_ace(struct cifs_ace *pace, char *end_of_acl, int raw)
{
- /* validate that we do not go past end of acl */
--
-+ /* 16 == size of cifs_ace sans the cifs_sid */
++ uint16_t size;
++
++ /* make sure we can safely get to "size" */
++ if (end_of_acl < (char *)pace + offsetof(struct cifs_ace, size) + 1)
++ return;
++
++ size = le16toh(pace->size);
+
++ /* 16 == size of cifs_ace when cifs_sid has no subauths */
if (le16toh(pace->size) < 16)
return;
@@ -448,7 +463,15 @@ index 8cbdb1d..b832c50 100644
printf(":");
print_ace_type(pace->type, raw);
printf("/");
-@@ -261,14 +288,14 @@ parse_dacl(struct cifs_ctrl_acl *pdacl, char *end_of_acl, int raw)
+ print_ace_flags(pace->flags, raw);
+ printf("/");
+- print_ace_mask(pace->access_req, raw);
+-
++ print_ace_mask(le32toh(pace->access_req), raw);
+
+ return;
+ }
+@@ -261,14 +296,14 @@ parse_dacl(struct cifs_ctrl_acl *pdacl, char *end_of_acl, int raw)
}
static int
@@ -465,7 +488,7 @@ index 8cbdb1d..b832c50 100644
printf("\n");
return 0;
-@@ -280,15 +307,15 @@ parse_sec_desc(struct cifs_ntsd *pntsd, ssize_t acl_len, int raw)
+@@ -280,15 +315,15 @@ parse_sec_desc(struct cifs_ntsd *pntsd, ssize_t acl_len, int raw)
int rc;
uint32_t dacloffset;
char *end_of_acl = ((char *)pntsd) + acl_len;
@@ -484,7 +507,7 @@ index 8cbdb1d..b832c50 100644
le32toh(pntsd->gsidoffset));
dacloffset = le32toh(pntsd->dacloffset);
dacl_ptr = (struct cifs_ctrl_acl *)((char *)pntsd + dacloffset);
-@@ -333,6 +360,7 @@ main(const int argc, char *const argv[])
+@@ -333,6 +368,7 @@ main(const int argc, char *const argv[])
size_t bufsize = BUFSIZE;
char *filename, *attrval;
@@ -530,7 +553,7 @@ index 550d23d..3dd755c 100644
.RS 4
Print version number and exit\&.
diff --git a/setcifsacl.c b/setcifsacl.c
-index 29b7b93..5016264 100644
+index 29b7b93..8891844 100644
--- a/setcifsacl.c
+++ b/setcifsacl.c
@@ -39,23 +39,42 @@
@@ -609,7 +632,7 @@ index 29b7b93..5016264 100644
return;
}
-@@ -98,20 +105,13 @@ copy_sec_desc(const struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd,
+@@ -98,22 +105,15 @@ copy_sec_desc(const struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd,
static int
copy_ace(struct cifs_ace *dace, struct cifs_ace *sace)
{
@@ -631,8 +654,11 @@ index 29b7b93..5016264 100644
- dace->size = htole16(sace->size);
+ dace->size = sace->size;
- return dace->size;
+- return dace->size;
++ return le16toh(dace->size);
}
+
+ static int
@@ -126,7 +126,7 @@ compare_aces(struct cifs_ace *sace, struct cifs_ace *dace, int compflags)
return 0;
if (dace->sid.num_subauth != sace->sid.num_subauth)
@@ -678,7 +704,60 @@ index 29b7b93..5016264 100644
}
return numfaces;
-@@ -391,33 +388,40 @@ build_fetched_aces_ret:
+@@ -350,74 +347,75 @@ get_numfaces(struct cifs_ntsd *pntsd, ssize_t acl_len,
+ static struct cifs_ace **
+ build_fetched_aces(char *daclptr, int numfaces)
+ {
+- int i, j, rc = 0, acl_size;
++ int i, acl_size;
+ char *acl_base;
+ struct cifs_ace *pace, **facesptr;
+
+- facesptr = (struct cifs_ace **)malloc(numfaces *
+- sizeof(struct cifs_aces *));
++ facesptr = calloc(numfaces, sizeof(struct cifs_aces *));
+ if (!facesptr) {
+ printf("%s: Error %d allocating ACE array",
+ __func__, errno);
+- rc = errno;
++ return facesptr;
+ }
+
+ acl_base = daclptr;
+ acl_size = sizeof(struct cifs_ctrl_acl);
+ for (i = 0; i < numfaces; ++i) {
+ facesptr[i] = malloc(sizeof(struct cifs_ace));
+- if (!facesptr[i]) {
+- rc = errno;
+- goto build_fetched_aces_ret;
+- }
++ if (!facesptr[i])
++ goto build_fetched_aces_err;
+ pace = (struct cifs_ace *) (acl_base + acl_size);
+ memcpy(facesptr[i], pace, sizeof(struct cifs_ace));
+ acl_base = (char *)pace;
+ acl_size = le16toh(pace->size);
+ }
+-
+-build_fetched_aces_ret:
+- if (rc) {
+- printf("%s: Invalid fetched ace\n", __func__);
+- if (i) {
+- for (j = i; j >= 0; --j)
+- free(facesptr[j]);
+- }
+- free(facesptr);
+- }
+ return facesptr;
++
++build_fetched_aces_err:
++ printf("%s: Invalid fetched ace\n", __func__);
++ for (i = 0; i < numfaces; ++i)
++ free(facesptr[i]);
++ free(facesptr);
++ return NULL;
+ }
+
static int
verify_ace_sid(char *sidstr, struct cifs_sid *sid)
{
@@ -743,7 +822,136 @@ index 29b7b93..5016264 100644
return 0;
}
-@@ -643,92 +647,77 @@ build_cmdline_aces_ret:
+@@ -514,62 +512,61 @@ verify_ace_flags(char *flagstr, uint8_t *flagval)
+ }
+
+ static uint32_t
+-ace_mask_value(char *maskstr)
++ace_mask_value(char *mask)
+ {
+- int i, len;
+- uint32_t maskval = 0x0;
+- char *lmask;
++ uint32_t maskval = 0;
++ char cur;
+
+- if (!strcmp(maskstr, "FULL"))
++ if (!strcmp(mask, "FULL"))
+ return FULL_CONTROL;
+- else if (!strcmp(maskstr, "CHANGE"))
++ if (!strcmp(mask, "CHANGE"))
+ return CHANGE;
+- else if (!strcmp(maskstr, "D"))
+- return DELETE;
+- else if (!strcmp(maskstr, "READ"))
++ if (!strcmp(mask, "READ"))
+ return EREAD;
+- else {
+- len = strlen(maskstr);
+- lmask = maskstr;
+- for (i = 0; i < len; ++i, ++lmask) {
+- if (*lmask == 'R')
+- maskval |= EREAD;
+- else if (*lmask == 'W')
+- maskval |= EWRITE;
+- else if (*lmask == 'X')
+- maskval |= EXEC;
+- else if (*lmask == 'D')
+- maskval |= DELETE;
+- else if (*lmask == 'P')
+- maskval |= WRITE_DAC;
+- else if (*lmask == 'O')
+- maskval |= WRITE_OWNER;
+- else
+- return 0;
++
++ while((cur = *mask++)) {
++ switch(cur) {
++ case 'R':
++ maskval |= EREAD;
++ break;
++ case 'W':
++ maskval |= EWRITE;
++ break;
++ case 'X':
++ maskval |= EXEC;
++ break;
++ case 'D':
++ maskval |= DELETE;
++ break;
++ case 'P':
++ maskval |= WRITE_DAC;
++ break;
++ case 'O':
++ maskval |= WRITE_OWNER;
++ break;
++ default:
++ return 0;
+ }
+- return maskval;
+ }
+-
+- return 0;
++ return maskval;
+ }
+
+ static int
+ verify_ace_mask(char *maskstr, uint32_t *maskval)
+ {
+- char *invalflag;
++ unsigned long val;
++ char *ep;
+
+- if (strstr(maskstr, "0x") || !strcmp(maskstr, "DELDHLD")) {
+- *maskval = strtol(maskstr, &invalflag, 16);
+- if (!invalflag) {
+- printf("%s: Invalid mask: %s\n", __func__, maskstr);
+- return 1;
+- }
+- } else
+- *maskval = ace_mask_value(maskstr);
++ errno = 0;
++ val = strtoul(maskstr, &ep, 0);
++ if (errno == 0 && *ep == '\0')
++ *maskval = htole32((uint32_t)val);
++ else
++ *maskval = htole32(ace_mask_value(maskstr));
+
+ if (!*maskval) {
+- printf("%s: Invalid mask %s and value: 0x%x\n",
+- __func__, maskstr, *maskval);
++ printf("%s: Invalid mask %s (value 0x%x)\n", __func__,
++ maskstr, *maskval);
+ return 1;
+ }
+
+@@ -583,8 +580,7 @@ build_cmdline_aces(char **arrptr, int numcaces)
+ char *acesid, *acetype, *aceflag, *acemask;
+ struct cifs_ace **cacesptr;
+
+- cacesptr = (struct cifs_ace **)malloc(numcaces *
+- sizeof(struct cifs_aces *));
++ cacesptr = calloc(numcaces, sizeof(struct cifs_aces *));
+ if (!cacesptr) {
+ printf("%s: Error %d allocating ACE array", __func__, errno);
+ return NULL;
+@@ -630,105 +626,90 @@ build_cmdline_aces(char **arrptr, int numcaces)
+ goto build_cmdline_aces_ret;
+ }
+
+- cacesptr[i]->size = 1 + 1 + 2 + 4 + 1 + 1 + 6 +
+- (cacesptr[i]->sid.num_subauth * 4);
++ cacesptr[i]->size = htole16(1 + 1 + 2 + 4 + 1 + 1 + 6 +
++ cacesptr[i]->sid.num_subauth * 4);
+ }
+ return cacesptr;
+
+ build_cmdline_aces_ret:
+- for (; i >= 0; --i)
++ for (i = 0; i < numcaces; ++i)
+ free(cacesptr[i]);
+ free(cacesptr);
+ return NULL;
}
static char **
@@ -783,8 +991,6 @@ index 29b7b93..5016264 100644
- } else
- goto parse_cmdline_aces_ret;
- optarg = NULL;
-- }
-- errno = 0;
+ acestr = strtok(acelist, ","); /* everything before , */
+ if (!acestr)
+ goto parse_cmdline_aces_err;
@@ -798,7 +1004,8 @@ index 29b7b93..5016264 100644
+ ++i;
+ }
+ acelist = NULL;
-+ }
+ }
+- errno = 0;
return arrptr;
-parse_cmdline_aces_ret:
@@ -818,21 +1025,21 @@ index 29b7b93..5016264 100644
{
int i, len;
- unsigned int numcaces = 1;
-+ unsigned int num = 1;
-+ const char *current;
-
+-
- if (!optarg)
- return 0;
-+ current = aces;
-+ while((current = strchr(current, ',')))
-+ ++num;
++ unsigned int num = 1;
++ const char *current;
- len = strlen(optarg);
- for (i = 0; i < len; ++i) {
- if (*(optarg + i) == ',')
- ++numcaces;
- }
--
++ current = aces;
++ while((current = strchr(current, ',')))
++ ++num;
+
- return numcaces;
+ return num;
}
@@ -867,7 +1074,7 @@ index 29b7b93..5016264 100644
rc = ace_set(pntsd, npntsd, bufsize, cacesptr, numcaces);
break;
default:
-@@ -771,52 +760,62 @@ setcifsacl_usage(void)
+@@ -771,52 +752,62 @@ setcifsacl_usage(void)
int
main(const int argc, char *const argv[])
{
@@ -945,7 +1152,7 @@ index 29b7b93..5016264 100644
if (!arrptr)
goto setcifsacl_numcaces_ret;
-@@ -850,7 +849,7 @@ cifsacl:
+@@ -850,7 +841,7 @@ cifsacl:
}
numfaces = get_numfaces((struct cifs_ntsd *)attrval, attrlen, &daclptr);
@@ -954,7 +1161,7 @@ index 29b7b93..5016264 100644
printf("%s: Empty DACL\n", __func__);
goto setcifsacl_facenum_ret;
}
-@@ -870,7 +869,6 @@ cifsacl:
+@@ -870,7 +861,6 @@ cifsacl:
printf("%s: setxattr error: %s\n", __func__, strerror(errno));
goto setcifsacl_facenum_ret;
@@ -962,7 +1169,7 @@ index 29b7b93..5016264 100644
return 0;
setcifsacl_action_ret:
-@@ -890,8 +888,6 @@ setcifsacl_cmdlineverify_ret:
+@@ -890,8 +880,6 @@ setcifsacl_cmdlineverify_ret:
free(cacesptr);
setcifsacl_cmdlineparse_ret:
diff --git a/cifs-utils.spec b/cifs-utils.spec
index ee9afa3..7dd3aff 100644
--- a/cifs-utils.spec
+++ b/cifs-utils.spec
@@ -3,7 +3,7 @@
Name: cifs-utils
Version: 5.7
-Release: 2%{pre_release}%{?dist}
+Release: 3%{pre_release}%{?dist}
Summary: Utilities for mounting and managing CIFS mounts
Group: System Environment/Daemons
@@ -57,6 +57,9 @@ rm -rf %{buildroot}
%{_mandir}/man8/mount.cifs.8.gz
%changelog
+* Wed Nov 07 2012 Jeff Layton <jlayton at redhat.com> 5.7-3
+- update to latest patches queued for 5.8. More idmapping and ACL tool fixes.
+
* Sun Nov 04 2012 Jeff Layton <jlayton at redhat.com> 5.7-2
- update to latest patches queued for 5.8. Mostly idmapping and ACL tool fixes.
More information about the scm-commits
mailing list