The branch, v4-2-stable has been updated
       via  ba74960 VERSION: Disable git snapshots for the 4.2.8 release.
       via  4464e65 WHATSNEW: Add release notes for Samba 4.2.8.
       via  be4f52b s4:torture: add SMB2 test for directory creation initial 
allocation size
       via  e33472d s3:smbd: Ignore initial allocation size for directory 
creation
       via  279246d smbcacls: fix uninitialized variable
       via  d63f0b11 s3:smbd/oplock obey kernel oplock setting when releasing 
oplocks
       via  c1f06fe s3:smbd: fix a corner case of the symlink verification
       via  6b1c418 s3: libsmb: Correctly initialize the list head when keeping 
a list of primary followed by DFS connections.
       via  76213b0 vfs_streams_xattr: fix and simplify streams_xattr_get_name()
       via  73dac61 vfs_fruit: hide the Netatalk metadata xattr in streaminfo
       via  9bedefb vfs_fruit: add and use define for the Netatalk metadata 
xattr
       via  6d7e711 s4:torture:vfs_fruit: add test test_read_afpinfo
       via  985d331 s4:torture:vfs_fruit: add tests for AFP_Resource 
delete-on-close and eof
       via  3892a74 vfs_fruit: ignore delete on the AFP_Resource stream
       via  a48eb89 s4:torture:vfs_fruit: update AFP_AfpInfo IO tests
       via  c99c910 vfs_fruit: fix offset and len handling for AFP_AfpInfo 
stream
       via  d8511c0 s4:torture:vfs_fruit: test nulling out AFP_AfpInfo stream
       via  293363b vfs_fruit: writing all 0 to AFP_AfpInfo stream
       via  95699b3 s4:torture:vfs_fruit: add tests for AFP_AfpInfo 
delete-on-close and eof
       via  642b62b vfs_fruit: handling of ftruncate() on AFP_AfpInfo stream
       via  a4e0639 s4:torture:vfs_fruit: file without AFP_AfpInfo
       via  d26b979 vfs_fruit: stat AFP_AfpInfo must fail when it doesn't exist
       via  aa95842 vfs_fruit: fix some debug messages
       via  8a25a0a s3:lib/errmap_unix: map EOVERFLOW to 
NT_STATUS_ALLOTTED_SPACE_EXCEEDED
       via  b32587e s4:torture:vfs_fruit: fix flakey test_write_atalk_rfork_io 
with OS X
       via  7b2f35b s4:torture:vfs_fruit: fix test_rename_dir_openfile() to 
work with OS X
       via  b8512d4 s4:torture:vfs_fruit: fix test_aapl() to work with OS X
       via  08f61fa s4:torture:vfs_fruit: skip test_stream_names() without 
"localdir"
       via  4d7b2ab s4:torture:vfs_fruit: skip test_adouble_conversion() 
without "localdir"
       via  6a9f21c s4:torture:vfs_fruit: skip test test_read_atalk_metadata() 
without "localdir" and rename it
       via  6dba57e s4:torture:vfs_fruit: add explicit cleanup of testfiles
       via  432e9a1 s4:torture:vfs_fruit: add --option=torture:osx for 
enable_aapl()
       via  3bf1846 s4:torture:vfs_fruit: enhance check_stream
       via  b883c09 s4:torture:vfs_fruit: use AFPINFO_STREAM_NAME
       via  62a455a s4:torture:vfs_fruit: tweak check_stream_list()
       via  4eeb6db s4:torture:vfs_fruit: rename tree1 -> tree
       via  468c551 s4:torture:vfs_fruit: remove unused tree2
       via  2028bac docs: Fix typos in man vfs_gpfs.
       via  fd92549 smbd: make "hide dot files" option work with "store dos 
attributes = yes"
       via  6d1ee8b lib/async_req: do not install async_connect_send_test.
       via  3f05db5 lib/param: add a fixed unified 
lpcfg_string_{free,set,set_upper}() infrastructure
       via  417eca7 s4:torture:vfs_fruit: add a test for POSIX rename
       via  8b3e19b vfs_fruit: enable POSIX directory rename semantics
       via  3a1a67e vfs_fruit: add a flag that tracks whether use of AAPL was 
negotiated
       via  b5a081b s3:smbd: file_struct: seperate POSIX directory rename cap 
from POSIX open
       via  c91214f s3:smbd: convert file_struct.posix_open to a bitmap with 
flags
       via  b73894c VERSION: Bump version up to 4.2.8...
       via  f51d78c Merge tag 'samba-4.2.7' into v4-2-test
       via  b8077d8 Fix bug #11394 - Crash: Bad talloc magic value - access 
after free
      from  add4fe9 VERSION: Disable git snapshots for the 4.2.7 release.

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-2-stable


- Log -----------------------------------------------------------------
-----------------------------------------------------------------------

Summary of changes:
 VERSION                             |    2 +-
 WHATSNEW.txt                        |   76 +-
 docs-xml/manpages/vfs_gpfs.8.xml    |    6 +-
 lib/async_req/wscript_build         |    3 +-
 lib/dbwrap/dbwrap_rbt.c             |  208 +++---
 lib/param/loadparm.c                |   56 +-
 source3/include/vfs.h               |   12 +-
 source3/lib/errmap_unix.c           |    3 +
 source3/libsmb/libsmb_server.c      |    4 +-
 source3/locking/locking.c           |    3 +-
 source3/modules/vfs_acl_common.c    |    4 +-
 source3/modules/vfs_fruit.c         |  185 +++--
 source3/modules/vfs_streams_xattr.c |   39 +-
 source3/param/loadparm.c            |  212 +++---
 source3/selftest/tests.py           |    4 +-
 source3/smbd/close.c                |    6 +-
 source3/smbd/dosmode.c              |    2 +-
 source3/smbd/fileio.c               |    8 +-
 source3/smbd/open.c                 |   20 +-
 source3/smbd/oplock.c               |    3 +-
 source3/smbd/reply.c                |    2 +-
 source3/smbd/smb2_close.c           |    2 +-
 source3/smbd/vfs.c                  |   82 ++-
 source3/torture/torture.c           |   39 +
 source3/utils/smbcacls.c            |    2 +-
 source4/torture/smb2/create.c       |   64 ++
 source4/torture/vfs/fruit.c         | 1359 ++++++++++++++++++++++++++++++-----
 27 files changed, 1864 insertions(+), 542 deletions(-)


Changeset truncated at 500 lines:

diff --git a/VERSION b/VERSION
index ee42829..7b35079 100644
--- a/VERSION
+++ b/VERSION
@@ -25,7 +25,7 @@
 ########################################################
 SAMBA_VERSION_MAJOR=4
 SAMBA_VERSION_MINOR=2
-SAMBA_VERSION_RELEASE=7
+SAMBA_VERSION_RELEASE=8
 
 ########################################################
 # If a official release has a serious bug              #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 055f03f..ae15c36 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,4 +1,76 @@
                    =============================
+                   Release Notes for Samba 4.2.8
+                          February 2, 2016
+                   =============================
+
+
+This is the latest stable release of Samba 4.2.
+
+
+Changes since 4.2.7:
+--------------------
+
+o  Michael Adam <[email protected]>
+   * BUG 11647: s3:smbd: Fix a corner case of the symlink verification.
+
+
+o  Jeremy Allison <[email protected]>
+   * BUG 11624: s3: libsmb: Correctly initialize the list head when keeping a
+     list of primary followed by DFS connections.
+   * BUG 11625: Reduce the memory footprint of empty string options.
+
+
+o  Christian Ambach <[email protected]>
+   * BUG 11400: s3:smbd/oplock: Obey kernel oplock setting when releasing
+     oplocks.
+
+
+o  Ralph Boehme <[email protected]>
+   * BUG 11065: vfs_fruit: Fix renaming directories with open files.
+   * BUG 11347: Fix MacOS finder error 36 when copying folder to Samba.
+   * BUG 11466: Fix copying files with vfs_fruit when using vfs_streams_xattr
+     without stream prefix and type suffix.
+   * BUG 11645: smbd: make "hide dot files" option work with "store dos
+     attributes = yes".
+   * BUG 11684: s3:smbd: Ignore initial allocation size for directory creation.
+
+
+o  Günther Deschner <[email protected]>
+   * BUG 11639: lib/async_req: Do not install async_connect_send_test.
+
+
+o  Karolin Seeger <[email protected]>
+   * BUG 11641: docs: Fix typos in man vfs_gpfs.
+
+
+o  Uri Simchoni <[email protected]>
+   * BUG 11682: smbcacls: Fix uninitialized variable.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical IRC channel on irc.freenode.net.
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored.  All bug reports should
+be filed under the "Samba 4.1 and newer" product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
+
+                   =============================
                    Release Notes for Samba 4.2.7
                          December 16, 2015
                    =============================
@@ -142,8 +214,8 @@ database (https://bugzilla.samba.org/).
 ======================================================================
 
 
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
+
 
                    =============================
                    Release Notes for Samba 4.2.6
diff --git a/docs-xml/manpages/vfs_gpfs.8.xml b/docs-xml/manpages/vfs_gpfs.8.xml
index 21865c4..9bd06e1 100644
--- a/docs-xml/manpages/vfs_gpfs.8.xml
+++ b/docs-xml/manpages/vfs_gpfs.8.xml
@@ -42,14 +42,14 @@
        </itemizedlist>
        </para>
 
-       <para><command>NOTE:</command>This module follows the posix-acl 
behaviour
+       <para><command>NOTE:</command> This module follows the posix-acl 
behaviour
        and hence allows permission stealing via chown. Samba might allow at a 
later
        point in time, to restrict the chown via this module as such 
restrictions
        are the responsibility of the underlying filesystem than of Samba.
        </para>
 
        <para>This module makes use of the smb.conf parameter
-       <smbconfoption name="acl map full control">acl map full 
control</smbconfoption>
+       <smbconfoption name="acl map full control"></smbconfoption>.
        When set to yes (the default), this parameter will add in the 
FILE_DELETE_CHILD
        bit on a returned ACE entry for a file (not a directory) that already
        contains all file permissions except for FILE_DELETE and 
FILE_DELETE_CHILD.
@@ -469,7 +469,7 @@
        </para>
        <para>
        At build time, only the header file <command>gpfs_gpl.h</command>
-       is required , which is a symlink to <command>gpfs.h</command> in
+       is required, which is a symlink to <command>gpfs.h</command> in
        gpfs versions newer than 3.2.1 PTF8.
        </para>
 </refsect1>
diff --git a/lib/async_req/wscript_build b/lib/async_req/wscript_build
index 2a338b0..4104f79 100644
--- a/lib/async_req/wscript_build
+++ b/lib/async_req/wscript_build
@@ -9,5 +9,6 @@ bld.SAMBA_SUBSYSTEM('LIBASYNC_REQ',
 
 bld.SAMBA_BINARY('async_connect_send_test',
                  source='async_connect_send_test.c',
-                 deps='LIBASYNC_REQ'
+                 deps='LIBASYNC_REQ',
+                 install=False
 )
diff --git a/lib/dbwrap/dbwrap_rbt.c b/lib/dbwrap/dbwrap_rbt.c
index 3f97086..a9cc641 100644
--- a/lib/dbwrap/dbwrap_rbt.c
+++ b/lib/dbwrap/dbwrap_rbt.c
@@ -22,11 +22,15 @@
 #include "dbwrap/dbwrap_private.h"
 #include "dbwrap/dbwrap_rbt.h"
 #include "../lib/util/rbtree.h"
+#include "../lib/util/dlinklist.h"
 
 #define DBWRAP_RBT_ALIGN(_size_) (((_size_)+15)&~15)
 
 struct db_rbt_ctx {
        struct rb_root tree;
+       struct db_rbt_node *nodes;
+       size_t traverse_read;
+       struct db_rbt_node **traverse_nextp;
 };
 
 struct db_rbt_rec {
@@ -38,13 +42,7 @@ struct db_rbt_rec {
 struct db_rbt_node {
        struct rb_node rb_node;
        size_t keysize, valuesize;
-
-       /*
-        * key and value are appended implicitly, "data" is only here as a
-        * target for offsetof()
-        */
-
-       char data[1];
+       struct db_rbt_node *prev, *next;
 };
 
 /*
@@ -83,12 +81,43 @@ static int db_rbt_compare(TDB_DATA a, TDB_DATA b)
 static void db_rbt_parse_node(struct db_rbt_node *node,
                              TDB_DATA *key, TDB_DATA *value)
 {
-       key->dptr = ((uint8_t *)node) + offsetof(struct db_rbt_node, data);
+       size_t key_offset, value_offset;
+
+       key_offset = DBWRAP_RBT_ALIGN(sizeof(struct db_rbt_node));
+       key->dptr = ((uint8_t *)node) + key_offset;
        key->dsize = node->keysize;
-       value->dptr = key->dptr + node->keysize;
+
+       value_offset = DBWRAP_RBT_ALIGN(node->keysize);
+       value->dptr = key->dptr + value_offset;
        value->dsize = node->valuesize;
 }
 
+static ssize_t db_rbt_reclen(size_t keylen, size_t valuelen)
+{
+       size_t len, tmp;
+
+       len = DBWRAP_RBT_ALIGN(sizeof(struct db_rbt_node));
+
+       tmp = DBWRAP_RBT_ALIGN(keylen);
+       if (tmp < keylen) {
+               goto overflow;
+       }
+
+       len += tmp;
+       if (len < tmp) {
+               goto overflow;
+       }
+
+       len += valuelen;
+       if (len < valuelen) {
+               goto overflow;
+       }
+
+       return len;
+overflow:
+       return -1;
+}
+
 static NTSTATUS db_rbt_store(struct db_record *rec, TDB_DATA data, int flag)
 {
        struct db_rbt_ctx *db_ctx = talloc_get_type_abort(
@@ -97,10 +126,16 @@ static NTSTATUS db_rbt_store(struct db_record *rec, 
TDB_DATA data, int flag)
        struct db_rbt_node *node;
 
        struct rb_node ** p;
-       struct rb_node * parent;
+       struct rb_node *parent = NULL;
+       struct db_rbt_node *parent_node = NULL;
 
+       ssize_t reclen;
        TDB_DATA this_key, this_val;
 
+       if (db_ctx->traverse_read > 0) {
+               return NT_STATUS_MEDIA_WRITE_PROTECTED;
+       }
+
        if (rec_priv->node != NULL) {
 
                /*
@@ -123,21 +158,30 @@ static NTSTATUS db_rbt_store(struct db_record *rec, 
TDB_DATA data, int flag)
                }
        }
 
-       node = (struct db_rbt_node *)talloc_size(db_ctx,
-               offsetof(struct db_rbt_node, data) + rec->key.dsize
-               + data.dsize);
+       reclen = db_rbt_reclen(rec->key.dsize, data.dsize);
+       if (reclen == -1) {
+               return NT_STATUS_INSUFFICIENT_RESOURCES;
+       }
 
+       node = talloc_zero_size(db_ctx, reclen);
        if (node == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
 
        if (rec_priv->node != NULL) {
+               if (db_ctx->traverse_nextp != NULL) {
+                       if (*db_ctx->traverse_nextp == rec_priv->node) {
+                               *db_ctx->traverse_nextp = node;
+                       }
+               }
+
                /*
                 * We need to delete the key from the tree and start fresh,
                 * there's not enough space in the existing record
                 */
 
                rb_erase(&rec_priv->node->rb_node, &db_ctx->tree);
+               DLIST_REMOVE(db_ctx->nodes, rec_priv->node);
 
                /*
                 * Keep the existing node around for a while: If the record
@@ -145,8 +189,6 @@ static NTSTATUS db_rbt_store(struct db_record *rec, 
TDB_DATA data, int flag)
                 */
        }
 
-       ZERO_STRUCT(node->rb_node);
-
        node->keysize = rec->key.dsize;
        node->valuesize = data.dsize;
 
@@ -166,10 +208,11 @@ static NTSTATUS db_rbt_store(struct db_record *rec, 
TDB_DATA data, int flag)
                TDB_DATA search_key, search_val;
                int res;
 
-               parent = (*p);
-
                r = db_rbt2node(*p);
 
+               parent = (*p);
+               parent_node = r;
+
                db_rbt_parse_node(r, &search_key, &search_val);
 
                res = db_rbt_compare(this_key, search_key);
@@ -186,6 +229,7 @@ static NTSTATUS db_rbt_store(struct db_record *rec, 
TDB_DATA data, int flag)
        }
 
        rb_link_node(&node->rb_node, parent, p);
+       DLIST_ADD_AFTER(db_ctx->nodes, node, parent_node);
        rb_insert_color(&node->rb_node, &db_ctx->tree);
 
        return NT_STATUS_OK;
@@ -197,26 +241,27 @@ static NTSTATUS db_rbt_delete(struct db_record *rec)
                rec->db->private_data, struct db_rbt_ctx);
        struct db_rbt_rec *rec_priv = (struct db_rbt_rec *)rec->private_data;
 
+       if (db_ctx->traverse_read > 0) {
+               return NT_STATUS_MEDIA_WRITE_PROTECTED;
+       }
+
        if (rec_priv->node == NULL) {
                return NT_STATUS_OK;
        }
 
+       if (db_ctx->traverse_nextp != NULL) {
+               if (*db_ctx->traverse_nextp == rec_priv->node) {
+                       *db_ctx->traverse_nextp = rec_priv->node->next;
+               }
+       }
+
        rb_erase(&rec_priv->node->rb_node, &db_ctx->tree);
+       DLIST_REMOVE(db_ctx->nodes, rec_priv->node);
        TALLOC_FREE(rec_priv->node);
 
        return NT_STATUS_OK;
 }
 
-static NTSTATUS db_rbt_store_deny(struct db_record *rec, TDB_DATA data, int 
flag)
-{
-       return NT_STATUS_MEDIA_WRITE_PROTECTED;
-}
-
-static NTSTATUS db_rbt_delete_deny(struct db_record *rec)
-{
-       return NT_STATUS_MEDIA_WRITE_PROTECTED;
-}
-
 struct db_rbt_search_result {
        TDB_DATA key;
        TDB_DATA val;
@@ -358,75 +403,65 @@ static NTSTATUS db_rbt_parse_record(struct db_context 
*db, TDB_DATA key,
 }
 
 static int db_rbt_traverse_internal(struct db_context *db,
-                                   struct rb_node *n,
                                    int (*f)(struct db_record *db,
                                             void *private_data),
                                    void *private_data, uint32_t* count,
                                    bool rw)
 {
-       struct rb_node *rb_right;
-       struct rb_node *rb_left;
-       struct db_record rec;
-       struct db_rbt_rec rec_priv;
+       struct db_rbt_ctx *ctx = talloc_get_type_abort(
+               db->private_data, struct db_rbt_ctx);
+       struct db_rbt_node *cur = NULL;
+       struct db_rbt_node *next = NULL;
        int ret;
 
-       if (n == NULL) {
-               return 0;
-       }
-
-       rb_left = n->rb_left;
-       rb_right = n->rb_right;
-
-       ret = db_rbt_traverse_internal(db, rb_left, f, private_data, count, rw);
-       if (ret != 0) {
-               return ret;
-       }
+       for (cur = ctx->nodes; cur != NULL; cur = next) {
+               struct db_record rec;
+               struct db_rbt_rec rec_priv;
 
-       rec_priv.node = db_rbt2node(n);
-       /* n might be altered by the callback function */
-       n = NULL;
+               rec_priv.node = cur;
+               next = rec_priv.node->next;
 
-       ZERO_STRUCT(rec);
-       rec.db = db;
-       rec.private_data = &rec_priv;
-       if (rw) {
+               ZERO_STRUCT(rec);
+               rec.db = db;
+               rec.private_data = &rec_priv;
                rec.store = db_rbt_store;
                rec.delete_rec = db_rbt_delete;
-       } else {
-               rec.store = db_rbt_store_deny;
-               rec.delete_rec = db_rbt_delete_deny;
-       }
-       db_rbt_parse_node(rec_priv.node, &rec.key, &rec.value);
-
-       ret = f(&rec, private_data);
-       (*count) ++;
-       if (ret != 0) {
-               return ret;
-       }
+               db_rbt_parse_node(rec_priv.node, &rec.key, &rec.value);
 
-       if (rec_priv.node != NULL) {
-               /*
-                * If the current record is still there
-                * we should take the current rb_right.
-                */
-               rb_right = rec_priv.node->rb_node.rb_right;
+               if (rw) {
+                       ctx->traverse_nextp = &next;
+               }
+               ret = f(&rec, private_data);
+               (*count) ++;
+               if (rw) {
+                       ctx->traverse_nextp = NULL;
+               }
+               if (ret != 0) {
+                       return ret;
+               }
+               if (rec_priv.node != NULL) {
+                       next = rec_priv.node->next;
+               }
        }
 
-       return db_rbt_traverse_internal(db, rb_right, f, private_data, count, 
rw);
+       return 0;
 }
 
-static int db_rbt_traverse(struct db_context *db,
-                          int (*f)(struct db_record *db,
-                                   void *private_data),
-                          void *private_data)
+static int db_rbt_traverse_read(struct db_context *db,
+                               int (*f)(struct db_record *db,
+                                        void *private_data),
+                               void *private_data)
 {
        struct db_rbt_ctx *ctx = talloc_get_type_abort(
                db->private_data, struct db_rbt_ctx);
        uint32_t count = 0;
+       int ret;
 
-       int ret = db_rbt_traverse_internal(db, ctx->tree.rb_node,
-                                          f, private_data, &count,
-                                          true /* rw */);
+       ctx->traverse_read++;
+       ret = db_rbt_traverse_internal(db,
+                                      f, private_data, &count,
+                                      false /* rw */);
+       ctx->traverse_read--;
        if (ret != 0) {
                return -1;
        }
@@ -436,18 +471,27 @@ static int db_rbt_traverse(struct db_context *db,
        return count;
 }
 
-static int db_rbt_traverse_read(struct db_context *db,
-                               int (*f)(struct db_record *db,
-                                        void *private_data),
-                               void *private_data)
+static int db_rbt_traverse(struct db_context *db,
+                          int (*f)(struct db_record *db,
+                                   void *private_data),
+                          void *private_data)
 {
        struct db_rbt_ctx *ctx = talloc_get_type_abort(
                db->private_data, struct db_rbt_ctx);
        uint32_t count = 0;
+       int ret;
+
+       if (ctx->traverse_nextp != NULL) {
+               return -1;
+       };
+
+       if (ctx->traverse_read > 0) {
+               return db_rbt_traverse_read(db, f, private_data);
+       }
 
-       int ret = db_rbt_traverse_internal(db, ctx->tree.rb_node,
-                                          f, private_data, &count,
-                                          false /* rw */);
+       ret = db_rbt_traverse_internal(db,
+                                      f, private_data, &count,
+                                      true /* rw */);
        if (ret != 0) {
                return -1;
        }
diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index ae60cbf..2cc145d 100644


-- 
Samba Shared Repository

Reply via email to