[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Thu Mar 31 21:58:03 UTC 2016
The branch, master has been updated
via 10054c4 docs: Mention _NO_WINBINDD in idmap_script.8
via 74f0a24 docs: build idmap_script.8 by default
via 4f65fa9 pam_winbind: Avoid a use of sprintf
via 9d6d620 smbcquotas: print "NO LIMIT" only if returned quota value is 0.
via 0e01ed0 smbd: do not cover up VFS failures to get quota
via 0124d3e nfs-quota: do not fail on ECONNREFUSED
via ce82f66 xfs-quota: do not fail if user has no quota
via faaaae3 sys-quotas: do not fail if user has no quota
via 20a0d59 ntquotas - skip entry if the quota is zero
via 78ae852 nt-quotas: return 0 as indication of no quota
via fcf6527 nt-quotas: vfs_get_ntquota() return NTSTATUS
from d378c85 winbind: Fix a typo in a wrong comment...
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 10054c4281d73652b641921b756eaaae14964e6b
Author: Volker Lendecke <vl at samba.org>
Date: Thu Mar 31 17:10:39 2016 +0200
docs: Mention _NO_WINBINDD in idmap_script.8
Thanks to Joachim Achtzehnter <joachima at netacquire.com> for pointing out this
flaw!
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Thu Mar 31 23:57:13 CEST 2016 on sn-devel-144
commit 74f0a2435b6f26135bfb4c25d297af5b2cc436c8
Author: Volker Lendecke <vl at samba.org>
Date: Thu Mar 31 16:57:58 2016 +0200
docs: build idmap_script.8 by default
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 4f65fa9c7b60264d71c8fe8ed715fb5c63e528ba
Author: Volker Lendecke <vl at samba.org>
Date: Thu Mar 31 14:41:07 2016 +0200
pam_winbind: Avoid a use of sprintf
pam_winbind depends on talloc, which depends on libreplace, so we have asprintf
available.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 9d6d62010be2a54b6828cc4cc9c13b5657c8b4a0
Author: Uri Simchoni <uri at samba.org>
Date: Wed Mar 30 14:20:44 2016 +0300
smbcquotas: print "NO LIMIT" only if returned quota value is 0.
If the user being queried has no quota, the server returns 0 as
its quota. This is the observed smbd and Windows behavior, which
is also documented in [MS-FSA] 2.5.1.20.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=11815
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 0e01ed06a40146d145ffe439a65fb9035ab7b1cf
Author: Uri Simchoni <uri at samba.org>
Date: Wed Mar 30 14:02:31 2016 +0300
smbd: do not cover up VFS failures to get quota
Now that the VFS follows the convention that get-quota
returns error only on error condition, and success
with zero quota if there is no quota assigned,
reply with an error if failing to obtain a user's
quota.
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 0124d3e6a537374c6639025934903ca03a08691e
Author: Uri Simchoni <uri at samba.org>
Date: Wed Mar 30 13:21:58 2016 +0300
nfs-quota: do not fail on ECONNREFUSED
Trying to differentiate between "no quota" and real
error conditions - if the connection to rpc.quotad
is refused it could simply mean that the remote host
has no quota and therefore report this as success with
no quota.
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit ce82f66b9fdc611124f7284e32e44ed3df2d7295
Author: Uri Simchoni <uri at samba.org>
Date: Wed Mar 30 13:00:29 2016 +0300
xfs-quota: do not fail if user has no quota
XFS fails quotactl(Q_XGETQUOTA) with ENOENT if the user
or group has no quota assigned to it. This is not an error
condition - simply report 0 quota in this case.
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit faaaae3c57977b6041d0bac99ff696c4760fdb01
Author: Uri Simchoni <uri at samba.org>
Date: Wed Mar 30 14:05:49 2016 +0300
sys-quotas: do not fail if user has no quota
If the user/group has no quota, do not treat that as
error condition. Instead, return zero quota.
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 20a0d59d8c1d80b66a34611bffef1d43a9e1e2b4
Author: Uri Simchoni <uri at samba.org>
Date: Wed Mar 30 13:59:39 2016 +0300
ntquotas - skip entry if the quota is zero
When listing user quotas, do not list the user
if the driver returned success with zero quota -
this signals that no quota is assigned for that
user.
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 78ae852dd7b6491e131d3a26f490bbcef53aa3d6
Author: Uri Simchoni <uri at samba.org>
Date: Tue Mar 29 23:05:09 2016 +0300
nt-quotas: return 0 as indication of no quota
When getting user quota, the correct value to indicate "no quota"
is 0, not -1.
In [MS-FSCC] section 2.4.33 it is written that -1 designates no-quota.
However, careful read of that section shows that this designation is only
true when setting the quota, and this section says nothing about getting
the quota.
In [MS-FSA] section 2.1.5.20, it is written that "If SidList includes a SID
that does not map to an existing SID in the Open.File.Volume.QuotaInformation
list, the object store MUST return a FILE_QUOTA_INFORMATION structure
(as specified in [MS-FSCC] section 2.4.33) that is filled with zeros.
This is also verified experimentally and cleared with dochelp.
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit fcf6527202be9b1a913ebb93ef3ed1d01a0c26fa
Author: Uri Simchoni <uri at samba.org>
Date: Tue Mar 29 23:30:23 2016 +0300
nt-quotas: vfs_get_ntquota() return NTSTATUS
Signed-off-by: Uri Simchoni <uri at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
-----------------------------------------------------------------------
Summary of changes:
docs-xml/manpages/idmap_script.8.xml | 18 ++++++++++++++++++
docs-xml/wscript_build | 1 +
nsswitch/pam_winbind.c | 6 +++---
source3/lib/sysquotas_4A.c | 16 ++--------------
source3/lib/sysquotas_linux.c | 9 +--------
source3/lib/sysquotas_nfs.c | 16 ++++++++++++++--
source3/lib/sysquotas_xfs.c | 16 ++++++++++++++--
source3/smbd/ntquotas.c | 32 +++++++++++++++++---------------
source3/smbd/nttrans.c | 11 ++++-------
source3/smbd/proto.h | 3 ++-
source3/smbd/trans2.c | 6 ++++--
source3/utils/smbcquotas.c | 2 +-
12 files changed, 81 insertions(+), 55 deletions(-)
Changeset truncated at 500 lines:
diff --git a/docs-xml/manpages/idmap_script.8.xml b/docs-xml/manpages/idmap_script.8.xml
index a378e7b..328a16b 100644
--- a/docs-xml/manpages/idmap_script.8.xml
+++ b/docs-xml/manpages/idmap_script.8.xml
@@ -148,6 +148,24 @@
look up the mapping in a table or use some other mechanism for
mapping SIDs to UIDs and etc.
</para>
+
+ <para>
+ Please be aware that the script is called with the
+ _NO_WINBINDD environment variable set to 1. This prevents
+ recursive calls into winbind from the script both via
+ explicit calls to wbinfo and via implicit calls via
+ nss_winbind. For example a call to <command>ls -l</command>
+ could trigger such an infinite recursion.
+ </para>
+
+ <para>
+ It is safe to call <command>wbinfo -n</command> and
+ <command>wbinfo -s</command> from within an idmap script. To
+ do so, the script must unset the _NO_WINBINDD environment
+ variable right before the call to <command>wbinfo</command>
+ and set it to 1 again right after <command>wbinfo</command>
+ has returned to protect against the recursion.
+ </para>
</refsect1>
<refsect1>
diff --git a/docs-xml/wscript_build b/docs-xml/wscript_build
index 11b826b..2b3a180 100644
--- a/docs-xml/wscript_build
+++ b/docs-xml/wscript_build
@@ -15,6 +15,7 @@ manpages='''
manpages/idmap_nss.8
manpages/idmap_rfc2307.8
manpages/idmap_rid.8
+ manpages/idmap_script.8
manpages/idmap_tdb.8
manpages/idmap_tdb2.8
manpages/net.8
diff --git a/nsswitch/pam_winbind.c b/nsswitch/pam_winbind.c
index b2e1778..42c4f8e 100644
--- a/nsswitch/pam_winbind.c
+++ b/nsswitch/pam_winbind.c
@@ -191,17 +191,17 @@ static void _pam_log_int(const pam_handle_t *pamh,
{
char *format2 = NULL;
const char *service;
+ int ret;
pam_get_item(pamh, PAM_SERVICE, (const void **) &service);
- format2 = (char *)malloc(strlen(MODULE_NAME)+strlen(format)+strlen(service)+5);
- if (format2 == NULL) {
+ ret = asprintf(&format2, "%s(%s): %s", MODULE_NAME, service, format);
+ if (ret == -1) {
/* what else todo ? */
vsyslog(err, format, args);
return;
}
- sprintf(format2, "%s(%s): %s", MODULE_NAME, service, format);
vsyslog(err, format2, args);
SAFE_FREE(format2);
}
diff --git a/source3/lib/sysquotas_4A.c b/source3/lib/sysquotas_4A.c
index 244b612..674c4ee 100644
--- a/source3/lib/sysquotas_4A.c
+++ b/source3/lib/sysquotas_4A.c
@@ -104,13 +104,7 @@ int sys_get_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_TYPE qt
return ret;
}
- if ((D.dqb_curblocks==0)&&
- (D.dqb_bsoftlimit==0)&&
- (D.dqb_bhardlimit==0)) {
- /* the upper layer functions don't want empty quota records...*/
- return -1;
- }
-
+ ret = 0;
break;
#ifdef HAVE_GROUP_QUOTA
case SMB_GROUP_QUOTA_TYPE:
@@ -121,13 +115,7 @@ int sys_get_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_TYPE qt
return ret;
}
- if ((D.dqb_curblocks==0)&&
- (D.dqb_bsoftlimit==0)&&
- (D.dqb_bhardlimit==0)) {
- /* the upper layer functions don't want empty quota records...*/
- return -1;
- }
-
+ ret = 0;
break;
#endif /* HAVE_GROUP_QUOTA */
case SMB_USER_FS_QUOTA_TYPE:
diff --git a/source3/lib/sysquotas_linux.c b/source3/lib/sysquotas_linux.c
index bf3504a..5984626 100644
--- a/source3/lib/sysquotas_linux.c
+++ b/source3/lib/sysquotas_linux.c
@@ -447,14 +447,7 @@ int sys_get_vfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_TYPE qt
}
}
}
-
- if ((dp->curblocks==0)&&
- (dp->softlimit==0)&&
- (dp->hardlimit==0)) {
- /* the upper layer functions don't want empty quota records...*/
- return -1;
- }
-
+ ret = 0;
break;
case SMB_USER_FS_QUOTA_TYPE:
id.uid = getuid();
diff --git a/source3/lib/sysquotas_nfs.c b/source3/lib/sysquotas_nfs.c
index 4b37e34..fe46d3f 100644
--- a/source3/lib/sysquotas_nfs.c
+++ b/source3/lib/sysquotas_nfs.c
@@ -180,8 +180,20 @@ int sys_get_nfs_quota(const char *path, const char *bdev,
timeout);
if (clnt_stat != RPC_SUCCESS) {
- DEBUG(3, ("sys_get_nfs_quotas: clnt_call failed\n"));
- ret = -1;
+ if (errno == ECONNREFUSED) {
+ /* If we cannot connect with rpc.quotad, it may
+ * simply be because there's no quota on the remote
+ * system
+ */
+ DBG_INFO("clnt_call failed with ECONNREFUSED - "
+ "assuming no quotas on server\n");
+ ret = 0;
+ } else {
+ int save_errno = errno;
+ DBG_NOTICE("clnt_call failed - %s\n", strerror(errno));
+ errno = save_errno;
+ ret = -1;
+ }
goto out;
}
diff --git a/source3/lib/sysquotas_xfs.c b/source3/lib/sysquotas_xfs.c
index ccc7fc0..bea86d5 100644
--- a/source3/lib/sysquotas_xfs.c
+++ b/source3/lib/sysquotas_xfs.c
@@ -90,16 +90,28 @@ int sys_get_xfs_quota(const char *path, const char *bdev, enum SMB_QUOTA_TYPE qt
DEBUG(10,("sys_get_xfs_quota: path[%s] bdev[%s] SMB_USER_QUOTA_TYPE uid[%u]\n",
path, bdev, (unsigned)id.uid));
- if ((ret=quotactl(QCMD(Q_XGETQUOTA,USRQUOTA), bdev, id.uid, (caddr_t)&D)))
+ ret=quotactl(QCMD(Q_XGETQUOTA,USRQUOTA), bdev, id.uid, (caddr_t)&D);
+ /* XFS fails with ENOENT if the user has no
+ * quota. Our protocol in that case is to
+ * succeed and return 0 as quota.
+ */
+ if (ret != 0 && errno != ENOENT) {
return ret;
+ }
break;
#ifdef HAVE_GROUP_QUOTA
case SMB_GROUP_QUOTA_TYPE:
DEBUG(10,("sys_get_xfs_quota: path[%s] bdev[%s] SMB_GROUP_QUOTA_TYPE gid[%u]\n",
path, bdev, (unsigned)id.gid));
- if ((ret=quotactl(QCMD(Q_XGETQUOTA,GRPQUOTA), bdev, id.gid, (caddr_t)&D)))
+ ret=quotactl(QCMD(Q_XGETQUOTA,GRPQUOTA), bdev, id.gid, (caddr_t)&D);
+ /* XFS fails with ENOENT if the user has no
+ * quota. Our protocol in that case is to
+ * succeed and return 0 as quota.
+ */
+ if (ret != 0 && errno != ENOENT) {
return ret;
+ }
break;
#endif /* HAVE_GROUP_QUOTA */
case SMB_USER_FS_QUOTA_TYPE:
diff --git a/source3/smbd/ntquotas.c b/source3/smbd/ntquotas.c
index aa2ec3b..9b2e39a 100644
--- a/source3/smbd/ntquotas.c
+++ b/source3/smbd/ntquotas.c
@@ -53,14 +53,6 @@ static uint64_t limit_unix2nt(uint64_t in, uint64_t bsize)
ret = (uint64_t)(in*bsize);
- if (ret < in) {
- /* we overflow */
- ret = SMB_NTQUOTAS_NO_LIMIT;
- }
-
- if (in == SMB_QUOTAS_NO_LIMIT)
- ret = SMB_NTQUOTAS_NO_LIMIT;
-
return ret;
}
@@ -76,7 +68,8 @@ static uint64_t limit_blk2inodes(uint64_t in)
return ret;
}
-int vfs_get_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype, struct dom_sid *psid, SMB_NTQUOTA_STRUCT *qt)
+NTSTATUS vfs_get_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype,
+ struct dom_sid *psid, SMB_NTQUOTA_STRUCT *qt)
{
int ret;
SMB_DISK_QUOTA D;
@@ -84,8 +77,9 @@ int vfs_get_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype, struct dom_sid
ZERO_STRUCT(D);
- if (!fsp||!fsp->conn||!qt)
- return (-1);
+ if (!fsp || !fsp->conn || !qt) {
+ return NT_STATUS_INTERNAL_ERROR;
+ }
ZERO_STRUCT(*qt);
@@ -94,6 +88,7 @@ int vfs_get_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype, struct dom_sid
if (psid && !sid_to_uid(psid, &id.uid)) {
DEBUG(0,("sid_to_uid: failed, SID[%s]\n",
sid_string_dbg(psid)));
+ return NT_STATUS_NO_SUCH_USER;
}
ret = SMB_VFS_GET_QUOTA(fsp->conn, ".", qtype, id, &D);
@@ -102,7 +97,7 @@ int vfs_get_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype, struct dom_sid
qt->sid = *psid;
if (ret!=0) {
- return ret;
+ return map_nt_error_from_unix(errno);
}
qt->usedspace = (uint64_t)D.curblocks*D.bsize;
@@ -110,8 +105,7 @@ int vfs_get_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype, struct dom_sid
qt->hardlim = limit_unix2nt(D.hardlimit, D.bsize);
qt->qflags = D.qflags;
-
- return 0;
+ return NT_STATUS_OK;
}
int vfs_set_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype, struct dom_sid *psid, SMB_NTQUOTA_STRUCT *qt)
@@ -181,6 +175,7 @@ int vfs_get_user_ntquota_list(files_struct *fsp, SMB_NTQUOTA_LIST **qt_list)
SMB_NTQUOTA_STRUCT tmp_qt;
SMB_NTQUOTA_LIST *tmp_list_ent;
struct dom_sid sid;
+ NTSTATUS status;
ZERO_STRUCT(tmp_qt);
@@ -191,7 +186,14 @@ int vfs_get_user_ntquota_list(files_struct *fsp, SMB_NTQUOTA_LIST **qt_list)
uid_to_sid(&sid, usr->pw_uid);
- if (vfs_get_ntquota(fsp, SMB_USER_QUOTA_TYPE, &sid, &tmp_qt)!=0) {
+ status =
+ vfs_get_ntquota(fsp, SMB_USER_QUOTA_TYPE, &sid, &tmp_qt);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(5, ("failed getting quota for uid[%ld] - %s\n",
+ (long)usr->pw_uid, nt_errstr(status)));
+ continue;
+ }
+ if (tmp_qt.softlim == 0 && tmp_qt.hardlim == 0) {
DEBUG(5,("no quota entry for sid[%s] path[%s]\n",
sid_string_dbg(&sid),
fsp->conn->connectpath));
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index 3a2c35f..fa3f74c 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -2509,13 +2509,10 @@ static void call_nt_transact_get_user_quota(connection_struct *conn,
return;
}
- if (vfs_get_ntquota(fsp, SMB_USER_QUOTA_TYPE, &sid, &qt)!=0) {
- ZERO_STRUCT(qt);
- /*
- * we have to return zero's in all fields
- * instead of returning an error here
- * --metze
- */
+ nt_status = vfs_get_ntquota(fsp, SMB_USER_QUOTA_TYPE,
+ &sid, &qt);
+ if (!NT_STATUS_IS_OK(nt_status)) {
+ reply_nterror(req, nt_status);
}
/* Realloc the size of parameters and data we will return */
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 8e8cbc3..3612034 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -600,7 +600,8 @@ NTSTATUS notify_walk(struct notify_context *notify,
/* The following definitions come from smbd/ntquotas.c */
-int vfs_get_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype, struct dom_sid *psid, SMB_NTQUOTA_STRUCT *qt);
+NTSTATUS vfs_get_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype,
+ struct dom_sid *psid, SMB_NTQUOTA_STRUCT *qt);
int vfs_set_ntquota(files_struct *fsp, enum SMB_QUOTA_TYPE qtype, struct dom_sid *psid, SMB_NTQUOTA_STRUCT *qt);
int vfs_get_user_ntquota_list(files_struct *fsp, SMB_NTQUOTA_LIST **qt_list);
void *init_quota_handle(TALLOC_CTX *mem_ctx);
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index f351008..0e1c6d9 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -3712,9 +3712,11 @@ cBytesSector=%u, cUnitTotal=%u, cUnitAvail=%d\n", (unsigned int)bsize, (unsigned
return NT_STATUS_ACCESS_DENIED;
}
- if (vfs_get_ntquota(&fsp, SMB_USER_FS_QUOTA_TYPE, NULL, "as)!=0) {
+ status = vfs_get_ntquota(&fsp, SMB_USER_FS_QUOTA_TYPE,
+ NULL, "as);
+ if (!NT_STATUS_IS_OK(status)) {
DEBUG(0,("vfs_get_ntquota() failed for service [%s]\n",lp_servicename(talloc_tos(), SNUM(conn))));
- return map_nt_error_from_unix(errno);
+ return status;
}
data_len = 48;
diff --git a/source3/utils/smbcquotas.c b/source3/utils/smbcquotas.c
index 9e64319..e6f1dfb 100644
--- a/source3/utils/smbcquotas.c
+++ b/source3/utils/smbcquotas.c
@@ -236,7 +236,7 @@ static const char *quota_str_static(uint64_t val, bool special, bool _numeric)
{
const char *result;
- if (!_numeric&&special&&(val == SMB_NTQUOTAS_NO_LIMIT)) {
+ if (!_numeric && special && val == 0) {
return "NO LIMIT";
}
result = talloc_asprintf(talloc_tos(), "%"PRIu64, val);
--
Samba Shared Repository
More information about the samba-cvs
mailing list