The branch, master has been updated
       via  ee087f8 torture4: Fix systems with a 32-bit "long"
       via  b7b508c ctdb-daemon: Use statically allocated arrays for helper 
paths
       via  89b08c0 ctdb-common: New function ctdb_set_helper()
      from  c6cb2d6 Update libwbclient version to 0.12

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit ee087f8d6d98e033e5d1f86096a11cd46a5d543e
Author: Volker Lendecke <[email protected]>
Date:   Tue Mar 10 11:52:36 2015 +0100

    torture4: Fix systems with a 32-bit "long"
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Stefan (metze) Metzmacher <[email protected]>
    
    Autobuild-User(master): Volker Lendecke <[email protected]>
    Autobuild-Date(master): Tue Mar 10 18:05:13 CET 2015 on sn-devel-104

commit b7b508c76553448dcbf33d8779f4285d8948df64
Author: Martin Schwenke <[email protected]>
Date:   Fri Mar 6 14:05:23 2015 +1100

    ctdb-daemon: Use statically allocated arrays for helper paths
    
    The use of talloc with a static variable is somewhat confusing.
    Statically allocate an array and use ctdb_set_helper() instead.
    
    Signed-off-by: Martin Schwenke <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>

commit 89b08c0f0ba951ed385ffb6190a98465717f8b25
Author: Martin Schwenke <[email protected]>
Date:   Sat Mar 7 07:22:32 2015 +1100

    ctdb-common: New function ctdb_set_helper()
    
    Signed-off-by: Martin Schwenke <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 ctdb/common/ctdb_util.c      | 60 ++++++++++++++++++++++++++++++++++++++++++++
 ctdb/include/ctdb_private.h  |  2 ++
 ctdb/server/ctdb_lock.c      | 37 ++++++++++-----------------
 ctdb/server/eventscript.c    | 15 +++++------
 source4/torture/smb2/ioctl.c | 11 ++++----
 5 files changed, 87 insertions(+), 38 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/common/ctdb_util.c b/ctdb/common/ctdb_util.c
index 137e0a8..bd68c55 100644
--- a/ctdb/common/ctdb_util.c
+++ b/ctdb/common/ctdb_util.c
@@ -64,6 +64,66 @@ void ctdb_die(struct ctdb_context *ctdb, const char *msg)
        exit(1);
 }
 
+/* Set the path of a helper program from envvar, falling back to
+ * dir/file if envvar unset. type is a string to print in log
+ * messages.  helper is assumed to point to a statically allocated
+ * array of size bytes, initialised to "".  If file is NULL don't fall
+ * back if envvar is unset.  If dir is NULL and envvar is unset (but
+ * file is not NULL) then this is an error.  Returns true if helper is
+ * set, either previously or this time. */
+bool ctdb_set_helper(const char *type, char *helper, size_t size,
+                    const char *envvar,
+                    const char *dir, const char *file)
+{
+       const char *t;
+       struct stat st;
+
+       if (helper[0] != '\0') {
+               /* Already set */
+               return true;
+       }
+
+       t = getenv(envvar);
+       if (t != NULL) {
+               if (strlen(t) >= size) {
+                       DEBUG(DEBUG_ERR,
+                             ("Unable to set %s - path too long\n", type));
+                       return false;
+               }
+
+               strncpy(helper, t, size);
+       } else if (file == NULL) {
+               return false;
+       } else if (dir == NULL) {
+                       DEBUG(DEBUG_ERR,
+                             ("Unable to set %s - dir is NULL\n", type));
+               return false;
+       } else {
+               if (snprintf(helper, size, "%s/%s", dir, file) >= size) {
+                       DEBUG(DEBUG_ERR,
+                             ("Unable to set %s - path too long\n", type));
+                       return false;
+               }
+       }
+
+       if (stat(helper, &st) != 0) {
+               DEBUG(DEBUG_ERR,
+                     ("Unable to set %s \"%s\" - %s\n",
+                      type, helper, strerror(errno)));
+               return false;
+       }
+       if (!(st.st_mode & S_IXUSR)) {
+               DEBUG(DEBUG_ERR,
+                     ("Unable to set %s \"%s\" - not executable\n",
+                      type, helper));
+               return false;
+       }
+
+       DEBUG(DEBUG_NOTICE,
+             ("Set %s to \"%s\"\n", type, helper));
+       return true;
+}
+
 /* Invoke an external program to do some sort of tracing on the CTDB
  * process.  This might block for a little while.  The external
  * program is specified by the environment variable
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index 7005fd8..ed4d612 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -722,6 +722,8 @@ struct ctdb_fetch_handle {
 void ctdb_set_error(struct ctdb_context *ctdb, const char *fmt, ...) 
PRINTF_ATTRIBUTE(2,3);
 void ctdb_fatal(struct ctdb_context *ctdb, const char *msg);
 void ctdb_die(struct ctdb_context *ctdb, const char *msg);
+bool ctdb_set_helper(const char *type, char *helper, size_t size,
+                    const char *envvar, const char *dir, const char *file);
 void ctdb_external_trace(void);
 bool ctdb_same_address(struct ctdb_address *a1, struct ctdb_address *a2);
 int ctdb_parse_address(struct ctdb_context *ctdb,
diff --git a/ctdb/server/ctdb_lock.c b/ctdb/server/ctdb_lock.c
index c5a2b98..f592834 100644
--- a/ctdb/server/ctdb_lock.c
+++ b/ctdb/server/ctdb_lock.c
@@ -482,7 +482,7 @@ static void ctdb_lock_timeout_handler(struct tevent_context 
*ev,
                                    struct timeval current_time,
                                    void *private_data)
 {
-       static const char * debug_locks = NULL;
+       static char debug_locks[PATH_MAX+1] = "";
        struct lock_context *lock_ctx;
        struct ctdb_context *ctdb;
        pid_t pid;
@@ -510,16 +510,10 @@ static void ctdb_lock_timeout_handler(struct 
tevent_context *ev,
                       elapsed_time));
        }
 
-       /* Fire a child process to find the blocking process. */
-       if (debug_locks == NULL) {
-               debug_locks = getenv("CTDB_DEBUG_LOCKS");
-               if (debug_locks == NULL) {
-                       debug_locks = talloc_asprintf(ctdb,
-                                                     "%s/debug_locks.sh",
-                                                     getenv("CTDB_BASE"));
-               }
-       }
-       if (debug_locks != NULL) {
+       if (ctdb_set_helper("lock debugging helper",
+                           debug_locks, sizeof(debug_locks),
+                           "CTDB_DEBUG_LOCKS",
+                           getenv("CTDB_BASE"), "debug_locks.sh")) {
                pid = vfork();
                if (pid == 0) {
                        execl(debug_locks, debug_locks, NULL);
@@ -529,7 +523,7 @@ static void ctdb_lock_timeout_handler(struct tevent_context 
*ev,
        } else {
                DEBUG(DEBUG_WARNING,
                      (__location__
-                      " Unable to setup lock debugging - no memory?\n"));
+                      " Unable to setup lock debugging\n"));
        }
 
        /* Back-off logging if lock is not obtained for a long time */
@@ -754,20 +748,15 @@ static void ctdb_lock_schedule(struct ctdb_context *ctdb)
        struct lock_context *lock_ctx;
        int ret, argc;
        TALLOC_CTX *tmp_ctx;
-       const char *helper = CTDB_HELPER_BINDIR "/ctdb_lock_helper";
-       static const char *prog = NULL;
+       static char prog[PATH_MAX+1] = "";
        const char **args;
 
-       if (prog == NULL) {
-               const char *t;
-
-               t = getenv("CTDB_LOCK_HELPER");
-               if (t != NULL) {
-                       prog = talloc_strdup(ctdb, t);
-               } else {
-                       prog = talloc_strdup(ctdb, helper);
-               }
-               CTDB_NO_MEMORY_VOID(ctdb, prog);
+       if (!ctdb_set_helper("lock helper",
+                            prog, sizeof(prog),
+                            "CTDB_LOCK_HELPER",
+                            CTDB_HELPER_BINDIR, "ctdb_lock_helper")) {
+               ctdb_die(ctdb, __location__
+                        " Unable to set lock helper\n");
        }
 
        /* Find a lock context with requests */
diff --git a/ctdb/server/eventscript.c b/ctdb/server/eventscript.c
index eaa6a20..d776121 100644
--- a/ctdb/server/eventscript.c
+++ b/ctdb/server/eventscript.c
@@ -261,7 +261,7 @@ failed:
 static void ctdb_event_script_handler(struct event_context *ev, struct 
fd_event *fde,
                                      uint16_t flags, void *p);
 
-static const char *helper_prog = NULL;
+static char helper_prog[PATH_MAX+1] = "";
 
 static int fork_child_for_script(struct ctdb_context *ctdb,
                                 struct ctdb_event_script_state *state)
@@ -271,15 +271,12 @@ static int fork_child_for_script(struct ctdb_context 
*ctdb,
        struct ctdb_script_wire *current = get_current_script(state);
        int argc;
        const char **argv;
-       static const char *helper = CTDB_HELPER_BINDIR "/ctdb_event_helper";
 
-       if (helper_prog == NULL) {
-               const char *t = getenv("CTDB_EVENT_HELPER");
-               if (t != NULL) {
-                       helper_prog = t;
-               } else {
-                       helper_prog = helper;
-               }
+       if (!ctdb_set_helper("event helper", helper_prog, sizeof(helper_prog),
+                            "CTDB_EVENT_HELPER",
+                            CTDB_HELPER_BINDIR, "ctdb_event_helper")) {
+               ctdb_die(ctdb, __location__
+                        " Unable to set event helper\n");
        }
 
        current->start = timeval_current();
diff --git a/source4/torture/smb2/ioctl.c b/source4/torture/smb2/ioctl.c
index 43f98be..78bbdd9 100644
--- a/source4/torture/smb2/ioctl.c
+++ b/source4/torture/smb2/ioctl.c
@@ -3435,9 +3435,10 @@ static bool test_ioctl_sparse_hole_dealloc(struct 
torture_context *torture,
                         * deallocation on this FS...
                         */
                        dealloc_chunk_len = hlen;
-                       torture_comment(torture, "hole punch %lu@0 resulted in "
-                                       "deallocation of %lu@0\n", hlen,
-                                       far_rsp[0].file_off);
+                       torture_comment(torture, "hole punch %ju@0 resulted in "
+                                       "deallocation of %ju@0\n",
+                                       (uintmax_t)hlen,
+                                       (uintmax_t)far_rsp[0].file_off);
                        torture_assert_u64_equal(torture,
                                                 file_size - far_rsp[0].len,
                                                 far_rsp[0].file_off,
@@ -3509,7 +3510,7 @@ static bool test_ioctl_sparse_hole_dealloc(struct 
torture_context *torture,
                                 "unexpected response len");
        if (far_rsp[0].file_off == dealloc_chunk_len) {
                torture_comment(torture, "holes merged for deallocation of "
-                               "%lu chunk\n", dealloc_chunk_len);
+                               "%ju chunk\n", (uintmax_t)dealloc_chunk_len);
                torture_assert_u64_equal(torture,
                                         file_size - far_rsp[0].len,
                                         far_rsp[0].file_off,
@@ -4630,7 +4631,7 @@ static bool test_ioctl_sparse_qar_overflow(struct 
torture_context *torture,
 
        /* off + length wraps around to 511 */
        far_buf.file_off = 512;
-       far_buf.len = (uint64_t)0xffffffffffffffff;
+       far_buf.len = 0xffffffffffffffffLL;
        ndr_ret = ndr_push_struct_blob(&ioctl.smb2.in.out, tmp_ctx,
                                       &far_buf,
                        (ndr_push_flags_fn_t)ndr_push_file_alloced_range_buf);


-- 
Samba Shared Repository

Reply via email to