]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
lib/adouble: drop ad_data reallocate logic
authorRalph Boehme <slow@samba.org>
Fri, 25 Oct 2019 13:21:32 +0000 (15:21 +0200)
committerRalph Boehme <slow@samba.org>
Wed, 30 Oct 2019 13:23:42 +0000 (13:23 +0000)
Simply set the buffer size to AD_XATTR_MAX_HDR_SIZE. When reading the
AppleDouble file, read up to AD_XATTR_MAX_HDR_SIZE from the file.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14171

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
source3/lib/adouble.c

index ff3ba0dc48ae5e0d9a5d69c87a93032d40d297fe..49ab8865d6a08e8a8bc004e5a7f46dcfb9af3680 100644 (file)
@@ -2151,8 +2151,7 @@ static ssize_t ad_read_rsrc_adouble(vfs_handle_struct *handle,
                                    struct adouble *ad,
                                    const struct smb_filename *smb_fname)
 {
-       char *p_ad = NULL;
-       size_t size;
+       size_t to_read;
        ssize_t len;
        int ret;
        bool ok;
@@ -2164,32 +2163,17 @@ static ssize_t ad_read_rsrc_adouble(vfs_handle_struct *handle,
                return -1;
        }
 
-       /*
-        * AppleDouble file header content and size, two cases:
-        *
-        * - without xattrs it is exactly AD_DATASZ_DOT_UND (82) bytes large
-        * - with embedded xattrs it can be larger, up to AD_XATTR_MAX_HDR_SIZE
-        *
-        * Read as much as we can up to AD_XATTR_MAX_HDR_SIZE.
-        */
-       size = ad->ad_fsp->fsp_name->st.st_ex_size;
-       if (size > talloc_array_length(ad->ad_data)) {
-               if (size > AD_XATTR_MAX_HDR_SIZE) {
-                       size = AD_XATTR_MAX_HDR_SIZE;
-               }
-               p_ad = talloc_realloc(ad, ad->ad_data, char, size);
-               if (p_ad == NULL) {
-                       return -1;
-               }
-               ad->ad_data = p_ad;
+       to_read = ad->ad_fsp->fsp_name->st.st_ex_size;
+       if (to_read > AD_XATTR_MAX_HDR_SIZE) {
+               to_read = AD_XATTR_MAX_HDR_SIZE;
        }
 
        len = SMB_VFS_NEXT_PREAD(handle,
                                 ad->ad_fsp,
                                 ad->ad_data,
-                                talloc_array_length(ad->ad_data),
+                                to_read,
                                 0);
-       if (len != talloc_array_length(ad->ad_data)) {
+       if (len != to_read)  {
                DBG_NOTICE("%s %s: bad size: %zd\n",
                           smb_fname->base_name, strerror(errno), len);
                return -1;
@@ -2287,7 +2271,23 @@ static struct adouble *ad_alloc(TALLOC_CTX *ctx,
                adsize = AD_DATASZ_XATTR;
                break;
        case ADOUBLE_RSRC:
-               adsize = AD_DATASZ_DOT_UND;
+               /*
+                * AppleDouble ._ file case, optimize for fewer (but larger)
+                * IOs. Two cases:
+                *
+                * - without xattrs size of the header is exactly
+                *   AD_DATASZ_DOT_UND (82) bytes
+                *
+                * - with embedded xattrs it can be larger, up to
+                *   AD_XATTR_MAX_HDR_SIZE
+                *
+                * Larger headers are not supported, but this is a reasonable
+                * limit that is also employed by the macOS client.
+                *
+                * We used the largest possible size to be able to read the full
+                * header with one IO.
+                */
+               adsize = AD_XATTR_MAX_HDR_SIZE;
                break;
        default:
                return NULL;