[SCM] Samba Shared Repository - branch master updated
Andrew Bartlett
abartlet at samba.org
Wed Jan 9 02:56:02 MST 2013
The branch, master has been updated
via 3a7c277 s3-lib: Use new strict directory create function in create_pipe_sock().
via 1aa0503 Use the new directory_create_or_exist_strict() function.
via 6039388 util: Add a strict directory_create_or_exist function.
via 5d721de s3:smb2_negprot: set the 'remote_proto' value
via 4d1fd0b samba_dnsupdate: set KRB5_CONFIG for nsupdate command
via 8d9a77f s4:lib/messaging: terminate the irpc_servers_byname() result with server_id_set_disconnected() (bug #9540)
from 2cc6f9c libnet-vampire: reports Exops as they rather than sync on some partitions
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 3a7c2777ee0de37d758fe81d67d6836a8354825e
Author: Andreas Schneider <asn at samba.org>
Date: Wed Jan 9 09:02:54 2013 +0100
s3-lib: Use new strict directory create function in create_pipe_sock().
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
Autobuild-Date(master): Wed Jan 9 10:55:23 CET 2013 on sn-devel-104
commit 1aa0503401d41fec48d4d4e30d8bbcbd847ff807
Author: Andreas Schneider <asn at samba.org>
Date: Tue Jan 8 14:21:23 2013 +0100
Use the new directory_create_or_exist_strict() function.
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 6039388fc1f3671bb60db06211814f7edfc62285
Author: Andreas Schneider <asn at samba.org>
Date: Tue Jan 8 14:21:00 2013 +0100
util: Add a strict directory_create_or_exist function.
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 5d721de7fdc250c6cb423c553134dd687590c1a0
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Dec 13 10:44:07 2012 +0100
s3:smb2_negprot: set the 'remote_proto' value
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 4d1fd0b7daa089bd8863f0efcaf258bf30192c29
Author: Björn Baumbach <bb at sernet.de>
Date: Thu Dec 20 15:57:43 2012 +0100
samba_dnsupdate: set KRB5_CONFIG for nsupdate command
Let nslookup use krb5.conf, which is set in our KRB5_CONFIG.
Signed-off-by: Björn Baumbach <bb at sernet.de>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 8d9a77f8646cd26371dc2ec1d3ed52730ac19eb9
Author: Stefan Metzmacher <metze at samba.org>
Date: Fri Jan 4 13:27:26 2013 +0100
s4:lib/messaging: terminate the irpc_servers_byname() result with server_id_set_disconnected() (bug #9540)
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
-----------------------------------------------------------------------
Summary of changes:
lib/util/samba_util.h | 4 ++
lib/util/util.c | 49 +++++++++++++++++++++++++++++---
source3/lib/util_sock.c | 50 ++++-----------------------------
source3/rpc_server/rpc_server.c | 2 +-
source3/smbd/server.c | 2 +-
source3/smbd/smb2_negprot.c | 8 +++++
source4/lib/messaging/messaging.c | 6 ++--
source4/lib/messaging/pymessaging.c | 4 +-
source4/ntp_signd/ntp_signd.c | 2 +-
source4/scripting/bin/samba_dnsupdate | 9 +++--
source4/smbd/service_named_pipe.c | 2 +-
source4/winbind/wb_server.c | 9 ++++-
12 files changed, 83 insertions(+), 64 deletions(-)
Changeset truncated at 500 lines:
diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h
index e553ec1..27c2e6e 100644
--- a/lib/util/samba_util.h
+++ b/lib/util/samba_util.h
@@ -631,6 +631,10 @@ _PUBLIC_ bool directory_exist(const char *dname);
_PUBLIC_ bool directory_create_or_exist(const char *dname, uid_t uid,
mode_t dir_perms);
+_PUBLIC_ bool directory_create_or_exist_strict(const char *dname,
+ uid_t uid,
+ mode_t dir_perms);
+
/**
Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
else
diff --git a/lib/util/util.c b/lib/util/util.c
index b50d28a..d49e20e 100644
--- a/lib/util/util.c
+++ b/lib/util/util.c
@@ -143,12 +143,13 @@ _PUBLIC_ bool directory_exist(const char *dname)
* @retval true if the directory already existed and has the right permissions
* or was successfully created.
*/
-_PUBLIC_ bool directory_create_or_exist(const char *dname, uid_t uid,
- mode_t dir_perms)
+_PUBLIC_ bool directory_create_or_exist(const char *dname,
+ uid_t uid,
+ mode_t dir_perms)
{
int ret;
- struct stat st;
-
+ struct stat st;
+
ret = lstat(dname, &st);
if (ret == -1) {
mode_t old_umask;
@@ -179,6 +180,44 @@ _PUBLIC_ bool directory_create_or_exist(const char *dname, uid_t uid,
}
}
+ return true;
+}
+
+/**
+ * @brief Try to create a specified directory if it doesn't exist.
+ *
+ * The function creates a directory with the given uid and permissions if it
+ * doesn't exixt. If it exists it makes sure the uid and permissions are
+ * correct and it will fail if they are different.
+ *
+ * @param[in] dname The directory to create.
+ *
+ * @param[in] uid The uid the directory needs to belong too.
+ *
+ * @param[in] dir_perms The expected permissions of the directory.
+ *
+ * @return True on success, false on error.
+ */
+_PUBLIC_ bool directory_create_or_exist_strict(const char *dname,
+ uid_t uid,
+ mode_t dir_perms)
+{
+ struct stat st;
+ bool ok;
+ int rc;
+
+ ok = directory_create_or_exist(dname, uid, dir_perms);
+ if (!ok) {
+ return false;
+ }
+
+ rc = lstat(dname, &st);
+ if (rc == -1) {
+ DEBUG(0, ("lstat failed on created directory %s: %s\n",
+ dname, strerror(errno)));
+ return false;
+ }
+
/* Check ownership and permission on existing directory */
if (!S_ISDIR(st.st_mode)) {
DEBUG(0, ("directory %s isn't a directory\n",
@@ -198,7 +237,7 @@ _PUBLIC_ bool directory_create_or_exist(const char *dname, uid_t uid,
}
return true;
-}
+}
/**
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index 2063a58..e45efea 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -1236,53 +1236,18 @@ int create_pipe_sock(const char *socket_dir,
{
#ifdef HAVE_UNIXSOCKET
struct sockaddr_un sunaddr;
- struct stat st;
+ bool ok;
int sock;
- mode_t old_umask;
char *path = NULL;
- old_umask = umask(0);
-
- /* Create the socket directory or reuse the existing one */
-
- if (lstat(socket_dir, &st) == -1) {
- if (errno == ENOENT) {
- /* Create directory */
- if (mkdir(socket_dir, dir_perms) == -1) {
- DEBUG(0, ("error creating socket directory "
- "%s: %s\n", socket_dir,
- strerror(errno)));
- goto out_umask;
- }
- } else {
- DEBUG(0, ("lstat failed on socket directory %s: %s\n",
- socket_dir, strerror(errno)));
- goto out_umask;
- }
- } else {
- /* Check ownership and permission on existing directory */
- if (!S_ISDIR(st.st_mode)) {
- DEBUG(0, ("socket directory '%s' isn't a directory\n",
- socket_dir));
- goto out_umask;
- }
- if (st.st_uid != sec_initial_uid()) {
- DEBUG(0, ("invalid ownership on directory "
- "'%s'\n", socket_dir));
- umask(old_umask);
- goto out_umask;
- }
- if ((st.st_mode & 0777) != dir_perms) {
- DEBUG(0, ("invalid permissions on directory "
- "'%s': has 0%o should be 0%o\n", socket_dir,
- (st.st_mode & 0777), dir_perms));
- umask(old_umask);
- goto out_umask;
- }
+ ok = directory_create_or_exist_strict(socket_dir,
+ sec_initial_uid(),
+ dir_perms);
+ if (!ok) {
+ return -1;
}
/* Create the socket file */
-
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock == -1) {
@@ -1308,7 +1273,6 @@ int create_pipe_sock(const char *socket_dir,
SAFE_FREE(path);
- umask(old_umask);
return sock;
out_close:
@@ -1316,8 +1280,6 @@ out_close:
if (sock != -1)
close(sock);
-out_umask:
- umask(old_umask);
return -1;
#else
diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c
index 689e923..de54ddc 100644
--- a/source3/rpc_server/rpc_server.c
+++ b/source3/rpc_server/rpc_server.c
@@ -133,7 +133,7 @@ int create_named_pipe_socket(const char *pipe_name)
goto out;
}
- if (!directory_create_or_exist(np_dir, geteuid(), 0700)) {
+ if (!directory_create_or_exist_strict(np_dir, geteuid(), 0700)) {
DEBUG(0, ("Failed to create pipe directory %s - %s\n",
np_dir, strerror(errno)));
goto out;
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 1cd9288..00472db 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -1468,7 +1468,7 @@ extern void build_options(bool screen);
return -1;
}
- if (!directory_create_or_exist(np_dir, geteuid(), 0700)) {
+ if (!directory_create_or_exist_strict(np_dir, geteuid(), 0700)) {
DEBUG(0, ("Failed to create pipe directory %s - %s\n",
np_dir, strerror(errno)));
return -1;
diff --git a/source3/smbd/smb2_negprot.c b/source3/smbd/smb2_negprot.c
index 6adc581..963a557 100644
--- a/source3/smbd/smb2_negprot.c
+++ b/source3/smbd/smb2_negprot.c
@@ -25,6 +25,8 @@
#include "../lib/tsocket/tsocket.h"
#include "../librpc/ndr/libndr.h"
+extern fstring remote_proto;
+
/*
* this is the entry point if SMB2 is selected via
* the SMB negprot and the given dialect.
@@ -234,6 +236,12 @@ NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req)
set_remote_arch(RA_VISTA);
}
+ fstr_sprintf(remote_proto, "SMB%X_%02X",
+ (dialect >> 8) & 0xFF, dialect & 0xFF);
+
+ reload_services(req->sconn, conn_snum_used, true);
+ DEBUG(3,("Selected protocol %s\n", remote_proto));
+
/* negprot_spnego() returns a the server guid in the first 16 bytes */
negprot_spnego_blob = negprot_spnego(req, req->sconn);
if (negprot_spnego_blob.data == NULL) {
diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c
index 2df6f41..c37c91e 100644
--- a/source4/lib/messaging/messaging.c
+++ b/source4/lib/messaging/messaging.c
@@ -604,7 +604,7 @@ struct imessaging_context *imessaging_init(TALLOC_CTX *mem_ctx,
msg->base_path = lpcfg_imessaging_path(msg, lp_ctx);
- ok = directory_create_or_exist(msg->base_path, geteuid(), 0700);
+ ok = directory_create_or_exist_strict(msg->base_path, geteuid(), 0700);
if (!ok) {
talloc_free(msg);
return NULL;
@@ -982,7 +982,7 @@ struct server_id *irpc_servers_byname(struct imessaging_context *msg_ctx,
for (i=0;i<count;i++) {
ret[i] = ((struct server_id *)rec.dptr)[i];
}
- ret[i] = cluster_id(0, 0);
+ server_id_set_disconnected(&ret[i]);
free(rec.dptr);
tdb_unlock_bystring(t->tdb, name);
talloc_free(t);
@@ -1419,7 +1419,7 @@ struct dcerpc_binding_handle *irpc_binding_handle_by_name(TALLOC_CTX *mem_ctx,
errno = EADDRNOTAVAIL;
return NULL;
}
- if (sids[0].pid == 0) {
+ if (server_id_is_disconnected(&sids[0])) {
talloc_free(sids);
errno = EADDRNOTAVAIL;
return NULL;
diff --git a/source4/lib/messaging/pymessaging.c b/source4/lib/messaging/pymessaging.c
index fca46e6..cb79d72 100644
--- a/source4/lib/messaging/pymessaging.c
+++ b/source4/lib/messaging/pymessaging.c
@@ -247,7 +247,7 @@ static PyObject *py_irpc_servers_byname(PyObject *self, PyObject *args, PyObject
return NULL;
}
- for (i = 0; ids[i].pid != 0; i++) {
+ for (i = 0; !server_id_is_disconnected(&ids[i]); i++) {
/* Do nothing */
}
@@ -257,7 +257,7 @@ static PyObject *py_irpc_servers_byname(PyObject *self, PyObject *args, PyObject
PyErr_NoMemory();
return NULL;
}
- for (i = 0; ids[i].pid; i++) {
+ for (i = 0; !server_id_is_disconnected(&ids[i]); i++) {
PyObject *py_server_id;
struct server_id *p_server_id = talloc(NULL, struct server_id);
if (!p_server_id) {
diff --git a/source4/ntp_signd/ntp_signd.c b/source4/ntp_signd/ntp_signd.c
index 0c3899f..d1d8483 100644
--- a/source4/ntp_signd/ntp_signd.c
+++ b/source4/ntp_signd/ntp_signd.c
@@ -498,7 +498,7 @@ static void ntp_signd_task_init(struct task_server *task)
const char *address;
- if (!directory_create_or_exist(lpcfg_ntp_signd_socket_directory(task->lp_ctx), geteuid(), 0750)) {
+ if (!directory_create_or_exist_strict(lpcfg_ntp_signd_socket_directory(task->lp_ctx), geteuid(), 0750)) {
char *error = talloc_asprintf(task, "Cannot create NTP signd pipe directory: %s",
lpcfg_ntp_signd_socket_directory(task->lp_ctx));
task_server_terminate(task,
diff --git a/source4/scripting/bin/samba_dnsupdate b/source4/scripting/bin/samba_dnsupdate
index a700118..a5cece1 100755
--- a/source4/scripting/bin/samba_dnsupdate
+++ b/source4/scripting/bin/samba_dnsupdate
@@ -278,7 +278,7 @@ def get_subst_vars(samdb):
def call_nsupdate(d):
"""call nsupdate for an entry."""
- global ccachename, nsupdate_cmd
+ global ccachename, nsupdate_cmd, krb5conf
if opts.verbose:
print "Calling nsupdate for %s" % d
@@ -333,10 +333,11 @@ def call_nsupdate(d):
try:
cmd = nsupdate_cmd[:]
cmd.append(tmpfile)
+ env = {}
+ if krb5conf:
+ env["KRB5_CONFIG"] = krb5conf
if ccachename:
- env = {"KRB5CCNAME": ccachename}
- else:
- env = {}
+ env["KRB5CCNAME"] = ccachename
ret = subprocess.call(cmd, shell=False, env=env)
if ret != 0:
if opts.fail_immediately:
diff --git a/source4/smbd/service_named_pipe.c b/source4/smbd/service_named_pipe.c
index b000083..6aa984d 100644
--- a/source4/smbd/service_named_pipe.c
+++ b/source4/smbd/service_named_pipe.c
@@ -212,7 +212,7 @@ NTSTATUS tstream_setup_named_pipe(TALLOC_CTX *mem_ctx,
goto fail;
}
- if (!directory_create_or_exist(dirname, geteuid(), 0700)) {
+ if (!directory_create_or_exist_strict(dirname, geteuid(), 0700)) {
status = map_nt_error_from_unix_common(errno);
DEBUG(0,(__location__ ": Failed to create stream pipe directory '%s' - %s\n",
dirname, nt_errstr(status)));
diff --git a/source4/winbind/wb_server.c b/source4/winbind/wb_server.c
index a904470..f036749 100644
--- a/source4/winbind/wb_server.c
+++ b/source4/winbind/wb_server.c
@@ -199,6 +199,7 @@ static void winbind_task_init(struct task_server *task)
struct wbsrv_listen_socket *listen_socket;
char *errstring;
struct dom_sid *primary_sid;
+ bool ok;
task_server_set_title(task, "task[winbind]");
@@ -213,14 +214,18 @@ static void winbind_task_init(struct task_server *task)
}
/* Make sure the directory for the Samba3 socket exists, and is of the correct permissions */
- if (!directory_create_or_exist(lpcfg_winbindd_socket_directory(task->lp_ctx), geteuid(), 0755)) {
+ ok = directory_create_or_exist_strict(lpcfg_winbindd_socket_directory(task->lp_ctx),
+ geteuid(), 0755);
+ if (!ok) {
task_server_terminate(task,
"Cannot create winbindd pipe directory", true);
return;
}
/* Make sure the directory for the Samba3 socket exists, and is of the correct permissions */
- if (!directory_create_or_exist(lpcfg_winbindd_privileged_socket_directory(task->lp_ctx), geteuid(), 0750)) {
+ ok = directory_create_or_exist_strict(lpcfg_winbindd_privileged_socket_directory(task->lp_ctx),
+ geteuid(), 0750);
+ if (!ok) {
task_server_terminate(task,
"Cannot create winbindd privileged pipe directory", true);
return;
--
Samba Shared Repository
More information about the samba-cvs
mailing list