LCOV - code coverage report
Current view: top level - source4/torture/vfs - fruit.c (source / functions) Hit Total Coverage
Test: coverage report for master 2b515b7d Lines: 2696 3115 86.5 %
Date: 2024-02-28 12:06:22 Functions: 72 72 100.0 %

          Line data    Source code
       1             : /*
       2             :    Unix SMB/CIFS implementation.
       3             : 
       4             :    vfs_fruit tests
       5             : 
       6             :    Copyright (C) Ralph Boehme 2014
       7             : 
       8             :    This program is free software; you can redistribute it and/or modify
       9             :    it under the terms of the GNU General Public License as published by
      10             :    the Free Software Foundation; either version 3 of the License, or
      11             :    (at your option) any later version.
      12             : 
      13             :    This program is distributed in the hope that it will be useful,
      14             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      15             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16             :    GNU General Public License for more details.
      17             : 
      18             :    You should have received a copy of the GNU General Public License
      19             :    along with this program.  If not, see <http://www.gnu.org/licenses/>.
      20             : */
      21             : 
      22             : #include "includes.h"
      23             : #include "system/filesys.h"
      24             : #include "libcli/libcli.h"
      25             : #include "libcli/smb2/smb2.h"
      26             : #include "libcli/smb2/smb2_calls.h"
      27             : #include "libcli/smb/smb2_create_ctx.h"
      28             : #include "lib/cmdline/cmdline.h"
      29             : #include "param/param.h"
      30             : #include "libcli/resolve/resolve.h"
      31             : #include "MacExtensions.h"
      32             : #include "lib/util/tsort.h"
      33             : 
      34             : #include "torture/torture.h"
      35             : #include "torture/util.h"
      36             : #include "torture/smb2/proto.h"
      37             : #include "torture/vfs/proto.h"
      38             : #include "librpc/gen_ndr/ndr_ioctl.h"
      39             : #include "libcli/security/dom_sid.h"
      40             : #include "../librpc/gen_ndr/ndr_security.h"
      41             : #include "libcli/security/secace.h"
      42             : #include "libcli/security/security_descriptor.h"
      43             : 
      44             : #define BASEDIR "vfs_fruit_dir"
      45             : #define FNAME_CC_SRC "testfsctl.dat"
      46             : #define FNAME_CC_DST "testfsctl2.dat"
      47             : 
      48             : #define CHECK_STATUS(status, correct) do { \
      49             :         if (!NT_STATUS_EQUAL(status, correct)) { \
      50             :                 torture_result(tctx, TORTURE_FAIL, \
      51             :                     "(%s) Incorrect status %s - should be %s\n", \
      52             :                     __location__, nt_errstr(status), nt_errstr(correct)); \
      53             :                 ret = false; \
      54             :                 goto done; \
      55             :         }} while (0)
      56             : 
      57             : #define CHECK_VALUE(v, correct) do { \
      58             :         if ((v) != (correct)) { \
      59             :                 torture_result(tctx, TORTURE_FAIL, \
      60             :                                "(%s) Incorrect value %s=%u - should be %u\n", \
      61             :                                __location__, #v, (unsigned)v, (unsigned)correct); \
      62             :                 ret = false; \
      63             :                 goto done; \
      64             :         }} while (0)
      65             : 
      66             : static bool check_stream_list(struct smb2_tree *tree,
      67             :                               struct torture_context *tctx,
      68             :                               const char *fname,
      69             :                               int num_exp,
      70             :                               const char **exp,
      71             :                               bool is_dir);
      72             : 
      73        1170 : static int qsort_string(char * const *s1, char * const *s2)
      74             : {
      75        1170 :         return strcmp(*s1, *s2);
      76             : }
      77             : 
      78        1184 : static int qsort_stream(const struct stream_struct * s1, const struct stream_struct *s2)
      79             : {
      80        1184 :         return strcmp(s1->stream_name.s, s2->stream_name.s);
      81             : }
      82             : 
      83             : /*
      84             :  * REVIEW:
      85             :  * This is hokey, but what else can we do?
      86             :  */
      87             : #if defined(HAVE_ATTROPEN) || defined(FREEBSD)
      88             : #define AFPINFO_EA_NETATALK "org.netatalk.Metadata"
      89             : #define AFPRESOURCE_EA_NETATALK "org.netatalk.ResourceFork"
      90             : #else
      91             : #define AFPINFO_EA_NETATALK "user.org.netatalk.Metadata"
      92             : #define AFPRESOURCE_EA_NETATALK "user.org.netatalk.ResourceFork"
      93             : #endif
      94             : 
      95             : /*
      96             : The metadata xattr char buf below contains the following attributes:
      97             : 
      98             : -------------------------------------------------------------------------------
      99             : Entry ID   : 00000008 : File Dates Info
     100             : Offset     : 00000162 : 354
     101             : Length     : 00000010 : 16
     102             : 
     103             : -DATE------:          : (GMT)                    : (Local)
     104             : create     : 1B442169 : Mon Jun 30 13:23:53 2014 : Mon Jun 30 15:23:53 2014
     105             : modify     : 1B442169 : Mon Jun 30 13:23:53 2014 : Mon Jun 30 15:23:53 2014
     106             : backup     : 80000000 : Unknown or Initial
     107             : access     : 1B442169 : Mon Jun 30 13:23:53 2014 : Mon Jun 30 15:23:53 2014
     108             : 
     109             : -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     110             : 00000000   : 1B 44 21 69 1B 44 21 69 80 00 00 00 1B 44 21 69 : .D!i.D!i.....D!i
     111             : 
     112             : -------------------------------------------------------------------------------
     113             : Entry ID   : 00000009 : Finder Info
     114             : Offset     : 0000007A : 122
     115             : Length     : 00000020 : 32
     116             : 
     117             : -FInfo-----:
     118             : Type       : 42415252 : BARR
     119             : Creator    : 464F4F4F : FOOO
     120             : isAlias    : 0
     121             : Invisible  : 1
     122             : hasBundle  : 0
     123             : nameLocked : 0
     124             : Stationery : 0
     125             : CustomIcon : 0
     126             : Reserved   : 0
     127             : Inited     : 0
     128             : NoINITS    : 0
     129             : Shared     : 0
     130             : SwitchLaunc: 0
     131             : Hidden Ext : 0
     132             : color      : 000      : none
     133             : isOnDesk   : 0
     134             : Location v : 0000     : 0
     135             : Location h : 0000     : 0
     136             : Fldr       : 0000     : ..
     137             : 
     138             : -FXInfo----:
     139             : Rsvd|IconID: 0000     : 0
     140             : Rsvd       : 0000     : ..
     141             : Rsvd       : 0000     : ..
     142             : Rsvd       : 0000     : ..
     143             : AreInvalid : 0
     144             : unknown bit: 0
     145             : unknown bit: 0
     146             : unknown bit: 0
     147             : unknown bit: 0
     148             : unknown bit: 0
     149             : unknown bit: 0
     150             : CustomBadge: 0
     151             : ObjctIsBusy: 0
     152             : unknown bit: 0
     153             : unknown bit: 0
     154             : unknown bit: 0
     155             : unknown bit: 0
     156             : RoutingInfo: 0
     157             : unknown bit: 0
     158             : unknown bit: 0
     159             : Rsvd|commnt: 0000     : 0
     160             : PutAway    : 00000000 : 0
     161             : 
     162             : -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     163             : 00000000   : 42 41 52 52 46 4F 4F 4F 40 00 00 00 00 00 00 00 : BARRFOOO@.......
     164             : 00000010   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     165             : 
     166             : -------------------------------------------------------------------------------
     167             : Entry ID   : 0000000E : AFP File Info
     168             : Offset     : 00000172 : 370
     169             : Length     : 00000004 : 4
     170             : 
     171             : -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     172             : 00000000   : 00 00 01 A1                                     : ....
     173             :  */
     174             : 
     175             : char metadata_xattr[] = {
     176             :         0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00,
     177             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     178             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     179             :         0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
     180             :         0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     181             :         0x00, 0x08, 0x00, 0x00, 0x01, 0x62, 0x00, 0x00,
     182             :         0x00, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
     183             :         0x00, 0x7a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
     184             :         0x00, 0x0e, 0x00, 0x00, 0x01, 0x72, 0x00, 0x00,
     185             :         0x00, 0x04, 0x80, 0x44, 0x45, 0x56, 0x00, 0x00,
     186             :         0x01, 0x76, 0x00, 0x00, 0x00, 0x08, 0x80, 0x49,
     187             :         0x4e, 0x4f, 0x00, 0x00, 0x01, 0x7e, 0x00, 0x00,
     188             :         0x00, 0x08, 0x80, 0x53, 0x59, 0x4e, 0x00, 0x00,
     189             :         0x01, 0x86, 0x00, 0x00, 0x00, 0x08, 0x80, 0x53,
     190             :         0x56, 0x7e, 0x00, 0x00, 0x01, 0x8e, 0x00, 0x00,
     191             :         0x00, 0x04, 0x42, 0x41, 0x52, 0x52, 0x46, 0x4f,
     192             :         0x4f, 0x4f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
     193             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     194             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     195             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     196             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     197             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     198             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     199             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     200             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     201             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     202             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     203             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     204             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     205             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     206             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     207             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     208             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     209             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     210             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     211             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     212             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     213             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     214             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     215             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     216             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     217             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     218             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     219             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     220             :         0x00, 0x00, 0x1b, 0x44, 0x21, 0x69, 0x1b, 0x44,
     221             :         0x21, 0x69, 0x80, 0x00, 0x00, 0x00, 0x1b, 0x44,
     222             :         0x21, 0x69, 0x00, 0x00, 0x01, 0xa1, 0x00, 0xfd,
     223             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x20,
     224             :         0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xe3,
     225             :         0x86, 0x53, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x01,
     226             :         0x00, 0x00
     227             : };
     228             : 
     229             : /*
     230             : The buf below contains the following AppleDouble encoded data:
     231             : 
     232             : -------------------------------------------------------------------------------
     233             : MagicNumber: 00051607                                        : AppleDouble
     234             : Version    : 00020000                                        : Version 2
     235             : Filler     : 4D 61 63 20 4F 53 20 58 20 20 20 20 20 20 20 20 : Mac OS X
     236             : Num. of ent: 0002                                            : 2
     237             : 
     238             : -------------------------------------------------------------------------------
     239             : Entry ID   : 00000009 : Finder Info
     240             : Offset     : 00000032 : 50
     241             : Length     : 00000EB0 : 3760
     242             : 
     243             : -FInfo-----:
     244             : Type       : 54455354 : TEST
     245             : Creator    : 534C4F57 : SLOW
     246             : isAlias    : 0
     247             : Invisible  : 0
     248             : hasBundle  : 0
     249             : nameLocked : 0
     250             : Stationery : 0
     251             : CustomIcon : 0
     252             : Reserved   : 0
     253             : Inited     : 0
     254             : NoINITS    : 0
     255             : Shared     : 0
     256             : SwitchLaunc: 0
     257             : Hidden Ext : 0
     258             : color      : 100      : blue
     259             : isOnDesk   : 0
     260             : Location v : 0000     : 0
     261             : Location h : 0000     : 0
     262             : Fldr       : 0000     : ..
     263             : 
     264             : -FXInfo----:
     265             : Rsvd|IconID: 0000     : 0
     266             : Rsvd       : 0000     : ..
     267             : Rsvd       : 0000     : ..
     268             : Rsvd       : 0000     : ..
     269             : AreInvalid : 0
     270             : unknown bit: 0
     271             : unknown bit: 0
     272             : unknown bit: 0
     273             : unknown bit: 0
     274             : unknown bit: 0
     275             : unknown bit: 0
     276             : CustomBadge: 0
     277             : ObjctIsBusy: 0
     278             : unknown bit: 0
     279             : unknown bit: 0
     280             : unknown bit: 0
     281             : unknown bit: 0
     282             : RoutingInfo: 0
     283             : unknown bit: 0
     284             : unknown bit: 0
     285             : Rsvd|commnt: 0000     : 0
     286             : PutAway    : 00000000 : 0
     287             : 
     288             : -EA--------:
     289             : pad        : 0000     : ..
     290             : magic      : 41545452 : ATTR
     291             : debug_tag  : 53D4580C : 1406425100
     292             : total_size : 00000EE2 : 3810
     293             : data_start : 000000BC : 188
     294             : data_length: 0000005E : 94
     295             : reserved[0]: 00000000 : ....
     296             : reserved[1]: 00000000 : ....
     297             : reserved[2]: 00000000 : ....
     298             : flags      : 0000     : ..
     299             : num_attrs  : 0002     : 2
     300             : -EA ENTRY--:
     301             : offset     : 000000BC : 188
     302             : length     : 0000005B : 91
     303             : flags      : 0000     : ..
     304             : namelen    : 24       : 36
     305             : -EA NAME---:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     306             : 00000000   : 63 6F 6D 2E 61 70 70 6C 65 2E 6D 65 74 61 64 61 : com.apple.metada
     307             : 00000010   : 74 61 3A 5F 6B 4D 44 49 74 65 6D 55 73 65 72 54 : ta:_kMDItemUserT
     308             : 00000020   : 61 67 73 00                                     : ags.
     309             : -EA VALUE--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     310             : 00000000   : 62 70 6C 69 73 74 30 30 A5 01 02 03 04 05 54 74 : bplist00......Tt
     311             : 00000010   : 65 73 74 66 00 47 00 72 00 FC 00 6E 00 0A 00 32 : estf.G.r...n...2
     312             : 00000020   : 56 4C 69 6C 61 0A 33 56 47 65 6C 62 0A 35 56 42 : VLila.3VGelb.5VB
     313             : 00000030   : 6C 61 75 0A 34 08 0E 13 20 27 2E 00 00 00 00 00 : lau.4... '......
     314             : 00000040   : 00 01 01 00 00 00 00 00 00 00 06 00 00 00 00 00 : ................
     315             : 00000050   : 00 00 00 00 00 00 00 00 00 00 35                : ..........5
     316             : -EA ENTRY--:
     317             : offset     : 00000117 : 279
     318             : length     : 00000003 : 3
     319             : flags      : 0000     : ..
     320             : namelen    : 08       : 8
     321             : -EA NAME---:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     322             : 00000000   : 66 6F 6F 3A 62 61 72 00                         : foo:bar.
     323             : -EA VALUE--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     324             : 00000000   : 62 61 7A                                        : baz
     325             : 
     326             : -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     327             : 00000000   : 54 45 53 54 53 4C 4F 57 00 08 00 00 00 00 00 00 : TESTSLOW........
     328             : 00000010   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     329             : 00000020   : 00 00 41 54 54 52 53 D4 58 0C 00 00 0E E2 00 00 : ..ATTRS.X.......
     330             : 00000030   : 00 BC 00 00 00 5E 00 00 00 00 00 00 00 00 00 00 : .....^..........
     331             : 00000040   : 00 00 00 00 00 02 00 00 00 BC 00 00 00 5B 00 00 : .............[..
     332             : 00000050   : 24 63 6F 6D 2E 61 70 70 6C 65 2E 6D 65 74 61 64 : $com.apple.metad
     333             : 00000060   : 61 74 61 3A 5F 6B 4D 44 49 74 65 6D 55 73 65 72 : ata:_kMDItemUser
     334             : 00000070   : 54 61 67 73 00 00 00 00 01 17 00 00 00 03 00 00 : Tags............
     335             : 00000080   : 08 66 6F 6F 3A 62 61 72 00 66 62 70 6C 69 73 74 : .foo:bar.fbplist
     336             : 00000090   : 30 30 A5 01 02 03 04 05 54 74 65 73 74 66 00 47 : 00......Ttestf.G
     337             : 000000A0   : 00 72 00 FC 00 6E 00 0A 00 32 56 4C 69 6C 61 0A : .r...n...2VLila.
     338             : 000000B0   : 33 56 47 65 6C 62 0A 35 56 42 6C 61 75 0A 34 08 : 3VGelb.5VBlau.4.
     339             : 000000C0   : 0E 13 20 27 2E 00 00 00 00 00 00 01 01 00 00 00 : .. '............
     340             : 000000D0   : 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 : ................
     341             : 000000E0   : 00 00 00 00 35 62 61 7A 00 00 00 00 00 00 00 00 : ....5baz........
     342             : 000000F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     343             : ... all zeroes ...
     344             : 00000EA0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     345             : 
     346             : -------------------------------------------------------------------------------
     347             : Entry ID   : 00000002 : Resource Fork
     348             : Offset     : 00000EE2 : 3810
     349             : Length     : 0000011E : 286
     350             : 
     351             : -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     352             : 00000000   : 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1E : ................
     353             : 00000010   : 54 68 69 73 20 72 65 73 6F 75 72 63 65 20 66 6F : This resource fo
     354             : 00000020   : 72 6B 20 69 6E 74 65 6E 74 69 6F 6E 61 6C 6C 79 : rk intentionally
     355             : 00000030   : 20 6C 65 66 74 20 62 6C 61 6E 6B 20 20 20 00 00 :  left blank   ..
     356             : 00000040   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     357             : 00000050   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     358             : 00000060   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     359             : 00000070   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     360             : 00000080   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     361             : 00000090   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     362             : 000000A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     363             : 000000B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     364             : 000000C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     365             : 000000D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     366             : 000000E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     367             : 000000F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     368             : 00000100   : 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1E : ................
     369             : 00000110   : 00 00 00 00 00 00 00 00 00 1C 00 1E FF FF       : ..............
     370             : 
     371             : It was created with:
     372             : $ hexdump -ve '"\t" 7/1 "0x%02x, " 1/1 " 0x%02x," "\n"'
     373             : */
     374             : static char osx_adouble_w_xattr[] = {
     375             :         0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00,
     376             :         0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58,
     377             :         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
     378             :         0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
     379             :         0x00, 0x32, 0x00, 0x00, 0x0e, 0xb0, 0x00, 0x00,
     380             :         0x00, 0x02, 0x00, 0x00, 0x0e, 0xe2, 0x00, 0x00,
     381             :         0x01, 0x1e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x4c,
     382             :         0x4f, 0x57, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
     383             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     384             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     385             :         0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x54, 0x52,
     386             :         0x53, 0xd4, 0x58, 0x0c, 0x00, 0x00, 0x0e, 0xe2,
     387             :         0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x5e,
     388             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     389             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
     390             :         0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x5b,
     391             :         0x00, 0x00, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x61,
     392             :         0x70, 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x65, 0x74,
     393             :         0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x5f, 0x6b,
     394             :         0x4d, 0x44, 0x49, 0x74, 0x65, 0x6d, 0x55, 0x73,
     395             :         0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x00, 0x00,
     396             :         0x00, 0x00, 0x01, 0x17, 0x00, 0x00, 0x00, 0x03,
     397             :         0x00, 0x00, 0x08, 0x66, 0x6f, 0x6f, 0x3a, 0x62,
     398             :         0x61, 0x72, 0x00, 0x66, 0x62, 0x70, 0x6c, 0x69,
     399             :         0x73, 0x74, 0x30, 0x30, 0xa5, 0x01, 0x02, 0x03,
     400             :         0x04, 0x05, 0x54, 0x74, 0x65, 0x73, 0x74, 0x66,
     401             :         0x00, 0x47, 0x00, 0x72, 0x00, 0xfc, 0x00, 0x6e,
     402             :         0x00, 0x0a, 0x00, 0x32, 0x56, 0x4c, 0x69, 0x6c,
     403             :         0x61, 0x0a, 0x33, 0x56, 0x47, 0x65, 0x6c, 0x62,
     404             :         0x0a, 0x35, 0x56, 0x42, 0x6c, 0x61, 0x75, 0x0a,
     405             :         0x34, 0x08, 0x0e, 0x13, 0x20, 0x27, 0x2e, 0x00,
     406             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
     407             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
     408             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     409             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x62,
     410             :         0x61, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     411             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     412             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     413             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     414             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     415             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     416             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     417             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     418             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     419             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     420             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     421             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     422             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     423             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     424             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     425             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     426             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     427             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     428             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     429             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     430             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     431             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     432             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     433             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     434             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     435             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     436             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     437             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     438             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     439             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     440             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     441             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     442             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     443             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     444             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     445             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     446             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     447             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     448             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     449             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     450             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     451             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     452             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     453             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     454             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     455             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     456             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     457             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     458             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     459             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     460             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     461             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     462             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     463             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     464             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     465             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     466             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     467             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     468             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     469             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     470             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     471             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     472             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     473             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     474             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     475             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     476             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     477             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     478             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     479             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     480             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     481             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     482             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     483             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     484             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     485             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     486             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     487             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     488             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     489             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     490             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     491             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     492             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     493             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     494             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     495             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     496             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     497             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     498             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     499             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     500             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     501             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     502             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     503             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     504             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     505             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     506             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     507             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     508             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     509             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     510             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     511             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     512             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     513             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     514             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     515             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     516             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     517             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     518             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     519             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     520             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     521             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     522             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     523             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     524             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     525             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     526             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     527             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     528             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     529             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     530             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     531             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     532             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     533             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     534             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     535             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     536             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     537             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     538             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     539             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     540             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     541             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     542             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     543             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     544             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     545             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     546             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     547             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     548             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     549             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     550             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     551             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     552             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     553             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     554             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     555             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     556             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     557             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     558             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     559             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     560             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     561             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     562             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     563             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     564             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     565             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     566             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     567             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     568             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     569             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     570             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     571             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     572             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     573             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     574             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     575             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     576             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     577             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     578             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     579             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     580             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     581             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     582             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     583             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     584             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     585             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     586             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     587             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     588             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     589             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     590             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     591             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     592             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     593             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     594             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     595             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     596             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     597             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     598             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     599             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     600             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     601             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     602             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     603             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     604             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     605             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     606             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     607             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     608             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     609             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     610             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     611             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     612             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     613             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     614             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     615             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     616             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     617             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     618             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     619             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     620             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     621             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     622             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     623             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     624             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     625             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     626             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     627             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     628             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     629             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     630             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     631             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     632             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     633             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     634             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     635             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     636             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     637             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     638             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     639             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     640             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     641             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     642             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     643             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     644             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     645             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     646             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     647             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     648             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     649             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     650             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     651             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     652             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     653             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     654             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     655             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     656             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     657             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     658             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     659             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     660             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     661             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     662             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     663             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     664             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     665             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     666             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     667             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     668             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     669             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     670             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     671             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     672             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     673             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     674             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     675             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     676             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     677             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     678             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     679             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     680             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     681             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     682             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     683             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     684             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     685             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     686             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     687             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     688             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     689             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     690             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     691             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     692             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     693             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     694             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     695             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     696             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     697             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     698             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     699             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     700             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     701             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     702             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     703             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     704             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     705             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     706             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     707             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     708             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     709             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     710             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     711             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     712             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     713             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     714             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     715             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     716             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     717             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     718             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     719             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     720             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     721             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     722             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     723             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     724             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     725             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     726             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     727             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     728             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     729             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     730             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     731             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     732             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     733             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     734             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     735             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     736             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     737             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     738             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     739             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     740             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     741             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     742             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     743             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     744             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     745             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     746             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     747             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     748             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     749             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     750             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     751             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     752             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     753             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     754             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     755             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     756             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     757             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     758             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     759             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     760             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     761             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     762             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     763             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     764             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     765             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     766             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     767             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     768             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     769             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     770             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     771             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     772             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     773             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     774             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     775             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     776             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     777             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     778             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     779             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     780             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     781             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     782             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     783             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     784             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     785             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     786             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     787             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     788             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     789             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     790             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     791             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     792             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     793             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     794             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     795             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     796             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     797             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     798             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     799             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     800             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     801             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     802             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     803             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     804             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     805             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     806             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     807             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     808             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     809             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     810             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     811             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     812             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     813             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     814             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     815             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     816             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     817             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     818             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     819             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     820             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     821             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     822             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     823             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     824             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     825             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     826             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     827             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     828             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     829             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     830             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     831             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     832             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     833             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     834             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     835             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     836             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     837             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     838             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     839             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     840             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     841             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     842             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     843             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     844             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     845             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     846             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     847             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     848             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     849             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     850             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     851             :         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
     852             :         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     853             :         0x00, 0x1e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x72,
     854             :         0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20,
     855             :         0x66, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x74,
     856             :         0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
     857             :         0x6c, 0x79, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20,
     858             :         0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x20, 0x20,
     859             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     860             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     861             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     862             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     863             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     864             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     865             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     866             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     867             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     868             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     869             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     870             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     871             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     872             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     873             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     874             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     875             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     876             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     877             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     878             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     879             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     880             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     881             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     882             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     883             :         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
     884             :         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     885             :         0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     886             :         0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0xff, 0xff
     887             : };
     888             : 
     889             : /*
     890             :  * The buf below contains the following AppleDouble encoded data:
     891             :  *
     892             :  * -------------------------------------------------------------------------------
     893             :  * MagicNumber: 00051607                                        : AppleDouble
     894             :  * Version    : 00020000                                        : Version 2
     895             :  * Filler     : 4D 61 63 20 4F 53 20 58 20 20 20 20 20 20 20 20 : Mac OS X
     896             :  * Num. of ent: 0002                                            : 2
     897             :  *
     898             :  * -------------------------------------------------------------------------------
     899             :  * Entry ID   : 00000002 : Resource Fork
     900             :  * Offset     : 00000052 : 82
     901             :  * Length     : 0000011E : 286
     902             :  *
     903             :  * -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     904             :  * 00000000   : 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1E : ................
     905             :  * 00000010   : F0 F1 F2 F3 F5 F5 F6 F7 F8 F9 FA FB FC FD FE FF : ................
     906             :  * 00000020   : 72 6B 20 69 6E 74 65 6E 74 69 6F 6E 61 6C 6C 79 : rk intentionally
     907             :  * 00000030   : 20 6C 65 66 74 20 62 6C 61 6E 6B 20 20 20 00 00 :  left blank   ..
     908             :  * 00000040   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     909             :  * 00000050   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     910             :  * 00000060   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     911             :  * 00000070   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     912             :  * 00000080   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     913             :  * 00000090   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     914             :  * 000000A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     915             :  * 000000B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     916             :  * 000000C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     917             :  * 000000D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     918             :  * 000000E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     919             :  * 000000F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     920             :  * 00000100   : 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1E : ................
     921             :  * 00000110   : 00 00 00 00 00 00 00 00 00 1C 00 1E FF FF       : ..............
     922             :  *
     923             :  * Entry ID   : 00000009 : Finder Info
     924             :  * Offset     : 00000032 : 50
     925             :  * Length     : 00000020 : 32
     926             :  *
     927             :  * -NOTE------: cannot detect whether FInfo or DInfo. assume FInfo.
     928             :  *
     929             :  * -FInfo-----:
     930             :  * Type       : 57415645 : WAVE
     931             :  * Creator    : 5054756C : PTul
     932             :  * isAlias    : 0
     933             :  * Invisible  : 0
     934             :  * hasBundle  : 0
     935             :  * nameLocked : 0
     936             :  * Stationery : 0
     937             :  * CustomIcon : 0
     938             :  * Reserved   : 0
     939             :  * Inited     : 0
     940             :  * NoINITS    : 0
     941             :  * Shared     : 0
     942             :  * SwitchLaunc: 0
     943             :  * Hidden Ext : 0
     944             :  * color      : 000      : none
     945             :  * isOnDesk   : 0
     946             :  * Location v : 0000     : 0
     947             :  * Location h : 0000     : 0
     948             :  * Fldr       : 0000     : ..
     949             :  *
     950             :  * -FXInfo----:
     951             :  * Rsvd|IconID: 0000     : 0
     952             :  * Rsvd       : 0000     : ..
     953             :  * Rsvd       : 0000     : ..
     954             :  * Rsvd       : 0000     : ..
     955             :  * AreInvalid : 0
     956             :  * unknown bit: 0
     957             :  * unknown bit: 0
     958             :  * unknown bit: 0
     959             :  * unknown bit: 0
     960             :  * unknown bit: 0
     961             :  * unknown bit: 0
     962             :  * CustomBadge: 0
     963             :  * ObjctIsBusy: 0
     964             :  * unknown bit: 0
     965             :  * unknown bit: 0
     966             :  * unknown bit: 0
     967             :  * unknown bit: 0
     968             :  * RoutingInfo: 0
     969             :  * unknown bit: 0
     970             :  * unknown bit: 0
     971             :  * Rsvd|commnt: 0000     : 0
     972             :  * PutAway    : 00000000 : 0
     973             :  *
     974             :  * -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
     975             :  * 00000000   : 57 41 56 45 50 54 75 6C 00 00 00 00 00 00 00 00 : WAVEPTul........
     976             :  * 00000010   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
     977             :  *  *
     978             :  * It was created with:
     979             :  * $ hexdump -ve '"\t" 7/1 "0x%02x, " 1/1 " 0x%02x," "\n"'
     980             :  */
     981             : static char osx_adouble_without_xattr[] = {
     982             :         0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00,
     983             :         0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58,
     984             :         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
     985             :         0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
     986             :         0x00, 0x52, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x00,
     987             :         0x00, 0x09, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00,
     988             :         0x00, 0x20, 0x57, 0x41, 0x56, 0x45, 0x50, 0x54,
     989             :         0x75, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     990             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     991             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     992             :         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
     993             :         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
     994             :         0x00, 0x1e, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
     995             :         0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd,
     996             :         0xfe, 0xff, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x74,
     997             :         0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
     998             :         0x6c, 0x79, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20,
     999             :         0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x20, 0x20,
    1000             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1001             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1002             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1003             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1004             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1005             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1006             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1007             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1008             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1009             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1010             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1011             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1012             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1013             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1014             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1015             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1016             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1017             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1018             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1019             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1020             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1021             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1022             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1023             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1024             :         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    1025             :         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1026             :         0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1027             :         0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0xff, 0xff
    1028             : };
    1029             : 
    1030             : /*
    1031             : The buf below contains the following AppleDouble encoded data:
    1032             : 
    1033             : -------------------------------------------------------------------------------
    1034             : MagicNumber: 00051607                                        : AppleDouble
    1035             : Version    : 00020000                                        : Version 2
    1036             : Filler     : 4D 61 63 20 4F 53 20 58 20 20 20 20 20 20 20 20 : Mac OS X
    1037             : Num. of ent: 0002                                            : 2
    1038             : 
    1039             : -------------------------------------------------------------------------------
    1040             : Entry ID   : 00000009 : Finder Info
    1041             : Offset     : 00000032 : 50
    1042             : Length     : 00000EB0 : 3760
    1043             : 
    1044             : -FInfo-----:
    1045             : Type       : 54455354 : TEST
    1046             : Creator    : 534C4F57 : SLOW
    1047             : isAlias    : 0
    1048             : Invisible  : 0
    1049             : hasBundle  : 0
    1050             : nameLocked : 0
    1051             : Stationery : 0
    1052             : CustomIcon : 0
    1053             : Reserved   : 0
    1054             : Inited     : 0
    1055             : NoINITS    : 0
    1056             : Shared     : 0
    1057             : SwitchLaunc: 0
    1058             : Hidden Ext : 0
    1059             : color      : 100      : blue
    1060             : isOnDesk   : 0
    1061             : Location v : 0000     : 0
    1062             : Location h : 0000     : 0
    1063             : Fldr       : 0000     : ..
    1064             : 
    1065             : -FXInfo----:
    1066             : Rsvd|IconID: 0000     : 0
    1067             : Rsvd       : 0000     : ..
    1068             : Rsvd       : 0000     : ..
    1069             : Rsvd       : 0000     : ..
    1070             : AreInvalid : 0
    1071             : unknown bit: 0
    1072             : unknown bit: 0
    1073             : unknown bit: 0
    1074             : unknown bit: 0
    1075             : unknown bit: 0
    1076             : unknown bit: 0
    1077             : CustomBadge: 0
    1078             : ObjctIsBusy: 0
    1079             : unknown bit: 0
    1080             : unknown bit: 0
    1081             : unknown bit: 0
    1082             : unknown bit: 0
    1083             : RoutingInfo: 0
    1084             : unknown bit: 0
    1085             : unknown bit: 0
    1086             : Rsvd|commnt: 0000     : 0
    1087             : PutAway    : 00000000 : 0
    1088             : 
    1089             : -EA--------:
    1090             : pad        : 0000     : ..
    1091             : magic      : 41545452 : ATTR
    1092             : debug_tag  : 53D4580C : 1406425100
    1093             : total_size : 00000EE2 : 3810
    1094             : data_start : 000000BC : 188
    1095             : data_length: 0000005E : 94
    1096             : reserved[0]: 00000000 : ....
    1097             : reserved[1]: 00000000 : ....
    1098             : reserved[2]: 00000000 : ....
    1099             : flags      : 0000     : ..
    1100             : num_attrs  : 0002     : 2
    1101             : -EA ENTRY--:
    1102             : offset     : 000000BC : 188
    1103             : length     : 0000005B : 91
    1104             : flags      : 0000     : ..
    1105             : namelen    : 24       : 36
    1106             : -EA NAME---:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    1107             : 00000000   : 63 6F 6D 2E 61 70 70 6C 65 2E 6D 65 74 61 64 61 : com.apple.metada
    1108             : 00000010   : 74 61 3A 5F 6B 4D 44 49 74 65 6D 55 73 65 72 54 : ta:_kMDItemUserT
    1109             : 00000020   : 61 67 73 00                                     : ags.
    1110             : -EA VALUE--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    1111             : 00000000   : 62 70 6C 69 73 74 30 30 A5 01 02 03 04 05 54 74 : bplist00......Tt
    1112             : 00000010   : 65 73 74 66 00 47 00 72 00 FC 00 6E 00 0A 00 32 : estf.G.r...n...2
    1113             : 00000020   : 56 4C 69 6C 61 0A 33 56 47 65 6C 62 0A 35 56 42 : VLila.3VGelb.5VB
    1114             : 00000030   : 6C 61 75 0A 34 08 0E 13 20 27 2E 00 00 00 00 00 : lau.4... '......
    1115             : 00000040   : 00 01 01 00 00 00 00 00 00 00 06 00 00 00 00 00 : ................
    1116             : 00000050   : 00 00 00 00 00 00 00 00 00 00 35                : ..........5
    1117             : -EA ENTRY--:
    1118             : offset     : 00000117 : 279
    1119             : length     : 00000003 : 3
    1120             : flags      : 0000     : ..
    1121             : namelen    : 08       : 8
    1122             : -EA NAME---:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    1123             : 00000000   : 66 6F 6F 3A 62 61 72 00                         : foo:bar.
    1124             : -EA VALUE--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    1125             : 00000000   : 62 61 7A                                        : baz
    1126             : 
    1127             : -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    1128             : 00000000   : 54 45 53 54 53 4C 4F 57 00 08 00 00 00 00 00 00 : TESTSLOW........
    1129             : 00000010   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1130             : 00000020   : 00 00 41 54 54 52 53 D4 58 0C 00 00 0E E2 00 00 : ..ATTRS.X.......
    1131             : 00000030   : 00 BC 00 00 00 5E 00 00 00 00 00 00 00 00 00 00 : .....^..........
    1132             : 00000040   : 00 00 00 00 00 02 00 00 00 BC 00 00 00 5B 00 00 : .............[..
    1133             : 00000050   : 24 63 6F 6D 2E 61 70 70 6C 65 2E 6D 65 74 61 64 : $com.apple.metad
    1134             : 00000060   : 61 74 61 3A 5F 6B 4D 44 49 74 65 6D 55 73 65 72 : ata:_kMDItemUser
    1135             : 00000070   : 54 61 67 73 00 00 00 00 01 17 00 00 00 03 00 00 : Tags............
    1136             : 00000080   : 08 66 6F 6F 3A 62 61 72 00 66 62 70 6C 69 73 74 : .foo:bar.fbplist
    1137             : 00000090   : 30 30 A5 01 02 03 04 05 54 74 65 73 74 66 00 47 : 00......Ttestf.G
    1138             : 000000A0   : 00 72 00 FC 00 6E 00 0A 00 32 56 4C 69 6C 61 0A : .r...n...2VLila.
    1139             : 000000B0   : 33 56 47 65 6C 62 0A 35 56 42 6C 61 75 0A 34 08 : 3VGelb.5VBlau.4.
    1140             : 000000C0   : 0E 13 20 27 2E 00 00 00 00 00 00 01 01 00 00 00 : .. '............
    1141             : 000000D0   : 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 : ................
    1142             : 000000E0   : 00 00 00 00 35 62 61 7A 00 00 00 00 00 00 00 00 : ....5baz........
    1143             : 000000F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1144             : ... all zeroes ...
    1145             : 00000EA0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1146             : 
    1147             : -------------------------------------------------------------------------------
    1148             : Entry ID   : 00000002 : Resource Fork
    1149             : Offset     : 00000EE2 : 3810
    1150             : Length     : 0000011E : 286
    1151             : 
    1152             : -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    1153             : 00000000   : 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1E : ................
    1154             : 00000010   : F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF : This resource fo
    1155             : 00000020   : 72 6B 20 69 6E 74 65 6E 74 69 6F 6E 61 6C 6C 79 : rk intentionally
    1156             : 00000030   : 20 6C 65 66 74 20 62 6C 61 6E 6B 20 20 20 00 00 :  left blank   ..
    1157             : 00000040   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1158             : 00000050   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1159             : 00000060   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1160             : 00000070   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1161             : 00000080   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1162             : 00000090   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1163             : 000000A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1164             : 000000B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1165             : 000000C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1166             : 000000D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1167             : 000000E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1168             : 000000F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    1169             : 00000100   : 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1E : ................
    1170             : 00000110   : 00 00 00 00 00 00 00 00 00 1C 00 1E FF FF       : ..............
    1171             : 
    1172             : It was created with:
    1173             : $ hexdump -ve '"\t" 7/1 "0x%02x, " 1/1 " 0x%02x," "\n"'
    1174             : */
    1175             : static char osx_adouble_non_empty_rfork_w_xattr[] = {
    1176             :         0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00,
    1177             :         0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58,
    1178             :         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
    1179             :         0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
    1180             :         0x00, 0x32, 0x00, 0x00, 0x0e, 0xb0, 0x00, 0x00,
    1181             :         0x00, 0x02, 0x00, 0x00, 0x0e, 0xe2, 0x00, 0x00,
    1182             :         0x01, 0x1e, 0x54, 0x45, 0x53, 0x54, 0x53, 0x4c,
    1183             :         0x4f, 0x57, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
    1184             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1185             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1186             :         0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x54, 0x52,
    1187             :         0x53, 0xd4, 0x58, 0x0c, 0x00, 0x00, 0x0e, 0xe2,
    1188             :         0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x5e,
    1189             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1190             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
    1191             :         0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x5b,
    1192             :         0x00, 0x00, 0x24, 0x63, 0x6f, 0x6d, 0x2e, 0x61,
    1193             :         0x70, 0x70, 0x6c, 0x65, 0x2e, 0x6d, 0x65, 0x74,
    1194             :         0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x5f, 0x6b,
    1195             :         0x4d, 0x44, 0x49, 0x74, 0x65, 0x6d, 0x55, 0x73,
    1196             :         0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x00, 0x00,
    1197             :         0x00, 0x00, 0x01, 0x17, 0x00, 0x00, 0x00, 0x03,
    1198             :         0x00, 0x00, 0x08, 0x66, 0x6f, 0x6f, 0x3a, 0x62,
    1199             :         0x61, 0x72, 0x00, 0x66, 0x62, 0x70, 0x6c, 0x69,
    1200             :         0x73, 0x74, 0x30, 0x30, 0xa5, 0x01, 0x02, 0x03,
    1201             :         0x04, 0x05, 0x54, 0x74, 0x65, 0x73, 0x74, 0x66,
    1202             :         0x00, 0x47, 0x00, 0x72, 0x00, 0xfc, 0x00, 0x6e,
    1203             :         0x00, 0x0a, 0x00, 0x32, 0x56, 0x4c, 0x69, 0x6c,
    1204             :         0x61, 0x0a, 0x33, 0x56, 0x47, 0x65, 0x6c, 0x62,
    1205             :         0x0a, 0x35, 0x56, 0x42, 0x6c, 0x61, 0x75, 0x0a,
    1206             :         0x34, 0x08, 0x0e, 0x13, 0x20, 0x27, 0x2e, 0x00,
    1207             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
    1208             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
    1209             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1210             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x62,
    1211             :         0x61, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1212             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1213             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1214             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1215             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1216             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1217             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1218             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1219             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1220             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1221             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1222             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1223             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1224             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1225             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1226             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1227             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1228             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1229             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1230             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1231             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1232             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1233             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1234             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1235             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1236             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1237             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1238             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1239             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1240             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1241             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1242             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1243             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1244             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1245             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1246             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1247             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1248             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1249             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1250             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1251             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1252             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1253             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1254             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1255             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1256             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1257             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1258             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1259             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1260             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1261             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1262             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1263             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1264             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1265             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1266             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1267             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1268             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1269             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1270             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1271             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1272             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1273             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1274             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1275             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1276             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1277             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1278             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1279             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1280             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1281             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1282             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1283             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1284             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1285             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1286             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1287             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1288             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1289             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1290             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1291             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1292             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1293             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1294             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1295             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1296             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1297             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1298             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1299             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1300             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1301             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1302             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1303             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1304             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1305             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1306             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1307             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1308             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1309             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1310             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1311             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1312             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1313             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1314             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1315             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1316             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1317             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1318             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1319             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1320             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1321             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1322             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1323             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1324             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1325             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1326             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1327             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1328             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1329             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1330             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1331             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1332             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1333             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1334             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1335             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1336             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1337             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1338             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1339             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1340             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1341             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1342             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1343             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1344             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1345             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1346             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1347             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1348             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1349             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1350             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1351             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1352             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1353             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1354             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1355             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1356             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1357             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1358             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1359             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1360             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1361             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1362             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1363             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1364             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1365             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1366             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1367             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1368             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1369             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1370             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1371             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1372             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1373             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1374             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1375             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1376             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1377             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1378             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1379             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1380             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1381             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1382             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1383             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1384             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1385             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1386             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1387             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1388             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1389             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1390             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1391             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1392             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1393             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1394             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1395             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1396             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1397             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1398             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1399             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1400             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1401             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1402             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1403             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1404             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1405             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1406             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1407             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1408             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1409             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1410             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1411             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1412             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1413             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1414             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1415             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1416             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1417             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1418             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1419             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1420             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1421             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1422             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1423             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1424             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1425             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1426             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1427             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1428             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1429             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1430             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1431             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1432             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1433             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1434             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1435             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1436             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1437             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1438             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1439             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1440             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1441             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1442             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1443             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1444             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1445             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1446             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1447             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1448             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1449             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1450             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1451             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1452             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1453             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1454             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1455             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1456             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1457             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1458             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1459             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1460             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1461             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1462             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1463             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1464             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1465             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1466             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1467             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1468             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1469             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1470             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1471             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1472             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1473             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1474             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1475             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1476             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1477             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1478             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1479             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1480             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1481             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1482             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1483             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1484             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1485             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1486             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1487             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1488             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1489             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1490             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1491             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1492             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1493             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1494             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1495             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1496             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1497             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1498             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1499             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1500             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1501             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1502             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1503             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1504             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1505             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1506             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1507             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1508             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1509             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1510             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1511             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1512             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1513             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1514             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1515             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1516             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1517             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1518             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1519             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1520             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1521             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1522             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1523             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1524             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1525             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1526             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1527             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1528             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1529             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1530             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1531             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1532             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1533             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1534             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1535             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1536             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1537             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1538             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1539             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1540             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1541             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1542             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1543             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1544             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1545             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1546             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1547             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1548             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1549             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1550             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1551             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1552             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1553             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1554             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1555             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1556             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1557             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1558             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1559             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1560             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1561             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1562             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1563             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1564             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1565             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1566             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1567             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1568             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1569             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1570             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1571             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1572             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1573             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1574             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1575             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1576             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1577             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1578             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1579             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1580             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1581             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1582             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1583             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1584             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1585             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1586             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1587             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1588             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1589             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1590             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1591             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1592             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1593             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1594             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1595             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1596             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1597             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1598             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1599             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1600             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1601             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1602             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1603             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1604             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1605             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1606             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1607             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1608             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1609             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1610             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1611             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1612             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1613             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1614             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1615             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1616             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1617             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1618             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1619             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1620             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1621             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1622             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1623             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1624             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1625             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1626             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1627             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1628             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1629             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1630             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1631             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1632             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1633             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1634             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1635             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1636             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1637             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1638             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1639             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1640             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1641             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1642             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1643             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1644             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1645             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1646             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1647             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1648             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1649             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1650             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1651             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1652             :         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    1653             :         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1654             :         0x00, 0x1e, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
    1655             :         0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd,
    1656             :         0xfe, 0xff, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x74,
    1657             :         0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
    1658             :         0x6c, 0x79, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20,
    1659             :         0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x20, 0x20,
    1660             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1661             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1662             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1663             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1664             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1665             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1666             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1667             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1668             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1669             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1670             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1671             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1672             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1673             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1674             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1675             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1676             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1677             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1678             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1679             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1680             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1681             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1682             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1683             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1684             :         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    1685             :         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1686             :         0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1687             :         0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0xff, 0xff
    1688             : };
    1689             : 
    1690             : /**
    1691             :  * talloc and intialize an AfpInfo
    1692             :  **/
    1693         108 : static AfpInfo *torture_afpinfo_new(TALLOC_CTX *mem_ctx)
    1694             : {
    1695           0 :         AfpInfo *info;
    1696             : 
    1697         108 :         info = talloc_zero(mem_ctx, AfpInfo);
    1698         108 :         if (info == NULL) {
    1699           0 :                 return NULL;
    1700             :         }
    1701             : 
    1702         108 :         info->afpi_Signature = AFP_Signature;
    1703         108 :         info->afpi_Version = AFP_Version;
    1704         108 :         info->afpi_BackupTime = AFP_BackupTime;
    1705             : 
    1706         108 :         return info;
    1707             : }
    1708             : 
    1709             : /**
    1710             :  * Pack AfpInfo into a talloced buffer
    1711             :  **/
    1712         124 : static char *torture_afpinfo_pack(TALLOC_CTX *mem_ctx,
    1713             :                                   AfpInfo *info)
    1714             : {
    1715           0 :         char *buf;
    1716             : 
    1717         124 :         buf = talloc_zero_array(mem_ctx, char, AFP_INFO_SIZE);
    1718         124 :         if (buf == NULL) {
    1719           0 :                 return NULL;
    1720             :         }
    1721             : 
    1722         124 :         RSIVAL(buf, 0, info->afpi_Signature);
    1723         124 :         RSIVAL(buf, 4, info->afpi_Version);
    1724         124 :         RSIVAL(buf, 12, info->afpi_BackupTime);
    1725         124 :         memcpy(buf + 16, info->afpi_FinderInfo, sizeof(info->afpi_FinderInfo));
    1726             : 
    1727         124 :         return buf;
    1728             : }
    1729             : 
    1730             : /**
    1731             :  * Unpack AfpInfo
    1732             :  **/
    1733             : #if 0
    1734             : static void torture_afpinfo_unpack(AfpInfo *info, char *data)
    1735             : {
    1736             :         info->afpi_Signature = RIVAL(data, 0);
    1737             :         info->afpi_Version = RIVAL(data, 4);
    1738             :         info->afpi_BackupTime = RIVAL(data, 12);
    1739             :         memcpy(info->afpi_FinderInfo, (const char *)data + 16,
    1740             :                sizeof(info->afpi_FinderInfo));
    1741             : }
    1742             : #endif
    1743             : 
    1744          92 : static bool torture_write_afpinfo(struct smb2_tree *tree,
    1745             :                                   struct torture_context *tctx,
    1746             :                                   TALLOC_CTX *mem_ctx,
    1747             :                                   const char *fname,
    1748             :                                   AfpInfo *info)
    1749             : {
    1750           0 :         struct smb2_handle handle;
    1751           0 :         struct smb2_create io;
    1752           0 :         NTSTATUS status;
    1753           0 :         const char *full_name;
    1754           0 :         char *infobuf;
    1755          92 :         bool ret = true;
    1756             : 
    1757          92 :         full_name = talloc_asprintf(mem_ctx, "%s%s", fname, AFPINFO_STREAM_NAME);
    1758          92 :         if (full_name == NULL) {
    1759           0 :             torture_comment(tctx, "talloc_asprintf error\n");
    1760           0 :             return false;
    1761             :         }
    1762          92 :         ZERO_STRUCT(io);
    1763          92 :         io.in.desired_access = SEC_FILE_WRITE_DATA;
    1764          92 :         io.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    1765          92 :         io.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF;
    1766          92 :         io.in.create_options = 0;
    1767          92 :         io.in.fname = full_name;
    1768             : 
    1769          92 :         status = smb2_create(tree, mem_ctx, &io);
    1770          92 :         CHECK_STATUS(status, NT_STATUS_OK);
    1771             : 
    1772          92 :         handle = io.out.file.handle;
    1773             : 
    1774          92 :         infobuf = torture_afpinfo_pack(mem_ctx, info);
    1775          92 :         if (infobuf == NULL) {
    1776           0 :                 return false;
    1777             :         }
    1778             : 
    1779          92 :         status = smb2_util_write(tree, handle, infobuf, 0, AFP_INFO_SIZE);
    1780          92 :         CHECK_STATUS(status, NT_STATUS_OK);
    1781             : 
    1782          92 :         smb2_util_close(tree, handle);
    1783             : 
    1784          92 : done:
    1785          92 :         return ret;
    1786             : }
    1787             : 
    1788             : /**
    1789             :  * Read 'count' bytes at 'offset' from stream 'fname:sname' and
    1790             :  * compare against buffer 'value'
    1791             :  **/
    1792         546 : static bool check_stream(struct smb2_tree *tree,
    1793             :                          const char *location,
    1794             :                          struct torture_context *tctx,
    1795             :                          TALLOC_CTX *mem_ctx,
    1796             :                          const char *fname,
    1797             :                          const char *sname,
    1798             :                          off_t read_offset,
    1799             :                          size_t read_count,
    1800             :                          off_t comp_offset,
    1801             :                          size_t comp_count,
    1802             :                          const char *value)
    1803             : {
    1804           0 :         struct smb2_handle handle;
    1805           0 :         struct smb2_create create;
    1806           0 :         struct smb2_read r;
    1807           0 :         NTSTATUS status;
    1808           0 :         char *full_name;
    1809         546 :         bool ret = true;
    1810             : 
    1811         546 :         full_name = talloc_asprintf(mem_ctx, "%s%s", fname, sname);
    1812         546 :         if (full_name == NULL) {
    1813           0 :             torture_comment(tctx, "talloc_asprintf error\n");
    1814           0 :             return false;
    1815             :         }
    1816         546 :         ZERO_STRUCT(create);
    1817         546 :         create.in.desired_access = SEC_FILE_READ_DATA;
    1818         546 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    1819         546 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    1820         546 :         create.in.fname = full_name;
    1821             : 
    1822         546 :         torture_comment(tctx, "Open stream %s\n", full_name);
    1823             : 
    1824         546 :         status = smb2_create(tree, mem_ctx, &create);
    1825         546 :         if (!NT_STATUS_IS_OK(status)) {
    1826           2 :                 if (value == NULL) {
    1827           0 :                         TALLOC_FREE(full_name);
    1828           0 :                         return true;
    1829             :                 }
    1830           2 :                 torture_comment(tctx, "Unable to open stream %s: %s\n",
    1831             :                         full_name, nt_errstr(status));
    1832           2 :                 TALLOC_FREE(full_name);
    1833           2 :                 return false;
    1834             :         }
    1835             : 
    1836         544 :         handle = create.out.file.handle;
    1837         544 :         if (value == NULL) {
    1838           0 :                 TALLOC_FREE(full_name);
    1839           0 :                 smb2_util_close(tree, handle);
    1840           0 :                 return true;
    1841             :         }
    1842             : 
    1843         544 :         ZERO_STRUCT(r);
    1844         544 :         r.in.file.handle = handle;
    1845         544 :         r.in.length      = read_count;
    1846         544 :         r.in.offset      = read_offset;
    1847             : 
    1848         544 :         status = smb2_read(tree, tree, &r);
    1849             : 
    1850         544 :         torture_assert_ntstatus_ok_goto(
    1851             :                 tctx, status, ret, done,
    1852             :                 talloc_asprintf(tctx, "(%s) Failed to read %lu bytes from stream '%s'\n",
    1853             :                                 location, (long)strlen(value), full_name));
    1854             : 
    1855         544 :         torture_assert_goto(tctx, r.out.data.length == read_count, ret, done,
    1856             :                             talloc_asprintf(tctx, "smb2_read returned %jd bytes, expected %jd\n",
    1857             :                                             (intmax_t)r.out.data.length, (intmax_t)read_count));
    1858             : 
    1859         544 :         torture_assert_goto(
    1860             :                 tctx, memcmp(r.out.data.data + comp_offset, value, comp_count) == 0,
    1861             :                 ret, done,
    1862             :                 talloc_asprintf(tctx, "(%s) Bad data in stream\n", location));
    1863             : 
    1864         544 : done:
    1865         544 :         TALLOC_FREE(full_name);
    1866         544 :         smb2_util_close(tree, handle);
    1867         544 :         return ret;
    1868             : }
    1869             : 
    1870             : /**
    1871             :  * Read 'count' bytes at 'offset' from stream 'fname:sname' and
    1872             :  * compare against buffer 'value'
    1873             :  **/
    1874          40 : static ssize_t read_stream(struct smb2_tree *tree,
    1875             :                            const char *location,
    1876             :                            struct torture_context *tctx,
    1877             :                            TALLOC_CTX *mem_ctx,
    1878             :                            const char *fname,
    1879             :                            const char *sname,
    1880             :                            off_t read_offset,
    1881             :                            size_t read_count)
    1882             : {
    1883           0 :         struct smb2_handle handle;
    1884           0 :         struct smb2_create create;
    1885           0 :         struct smb2_read r;
    1886           0 :         NTSTATUS status;
    1887           0 :         const char *full_name;
    1888          40 :         bool ret = true;
    1889             : 
    1890          40 :         full_name = talloc_asprintf(mem_ctx, "%s%s", fname, sname);
    1891          40 :         if (full_name == NULL) {
    1892           0 :             torture_comment(tctx, "talloc_asprintf error\n");
    1893           0 :             return -1;
    1894             :         }
    1895          40 :         ZERO_STRUCT(create);
    1896          40 :         create.in.desired_access = SEC_FILE_READ_DATA;
    1897          40 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    1898          40 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    1899          40 :         create.in.fname = full_name;
    1900             : 
    1901          40 :         torture_comment(tctx, "Open stream %s\n", full_name);
    1902             : 
    1903          40 :         status = smb2_create(tree, mem_ctx, &create);
    1904          40 :         if (!NT_STATUS_IS_OK(status)) {
    1905           0 :                 torture_comment(tctx, "Unable to open stream %s: %s\n",
    1906             :                                 full_name, nt_errstr(status));
    1907           0 :                 return -1;
    1908             :         }
    1909             : 
    1910          40 :         handle = create.out.file.handle;
    1911             : 
    1912          40 :         ZERO_STRUCT(r);
    1913          40 :         r.in.file.handle = handle;
    1914          40 :         r.in.length      = read_count;
    1915          40 :         r.in.offset      = read_offset;
    1916             : 
    1917          40 :         status = smb2_read(tree, tree, &r);
    1918          40 :         if (!NT_STATUS_IS_OK(status)) {
    1919          10 :                 CHECK_STATUS(status, NT_STATUS_END_OF_FILE);
    1920             :         }
    1921             : 
    1922          40 :         smb2_util_close(tree, handle);
    1923             : 
    1924          40 : done:
    1925          40 :         if (ret == false) {
    1926           0 :                 return -1;
    1927             :         }
    1928          40 :         return r.out.data.length;
    1929             : }
    1930             : 
    1931             : /**
    1932             :  * Read 'count' bytes at 'offset' from stream 'fname:sname' and
    1933             :  * compare against buffer 'value'
    1934             :  **/
    1935         162 : static bool write_stream(struct smb2_tree *tree,
    1936             :                          const char *location,
    1937             :                          struct torture_context *tctx,
    1938             :                          TALLOC_CTX *mem_ctx,
    1939             :                          const char *fname,
    1940             :                          const char *sname,
    1941             :                          off_t offset,
    1942             :                          size_t size,
    1943             :                          const char *value)
    1944             : {
    1945           0 :         struct smb2_handle handle;
    1946           0 :         struct smb2_create create;
    1947           0 :         NTSTATUS status;
    1948           0 :         const char *full_name;
    1949             : 
    1950         162 :         full_name = talloc_asprintf(mem_ctx, "%s%s", fname, sname ? sname : "");
    1951         162 :         if (full_name == NULL) {
    1952           0 :             torture_comment(tctx, "talloc_asprintf error\n");
    1953           0 :             return false;
    1954             :         }
    1955         162 :         ZERO_STRUCT(create);
    1956         162 :         create.in.desired_access = SEC_FILE_WRITE_DATA;
    1957         162 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    1958         162 :         create.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
    1959         162 :         create.in.fname = full_name;
    1960             : 
    1961         162 :         status = smb2_create(tree, mem_ctx, &create);
    1962         162 :         if (!NT_STATUS_IS_OK(status)) {
    1963           0 :                 if (value == NULL) {
    1964           0 :                         return true;
    1965             :                 } else {
    1966           0 :                         torture_comment(tctx, "Unable to open stream %s: %s\n",
    1967             :                             full_name, nt_errstr(status));
    1968           0 :                         return false;
    1969             :                 }
    1970             :         }
    1971             : 
    1972         162 :         handle = create.out.file.handle;
    1973         162 :         if (value == NULL) {
    1974           0 :                 return true;
    1975             :         }
    1976             : 
    1977         162 :         status = smb2_util_write(tree, handle, value, offset, size);
    1978             : 
    1979         162 :         if (!NT_STATUS_IS_OK(status)) {
    1980           0 :                 torture_comment(tctx, "(%s) Failed to write %lu bytes to "
    1981             :                     "stream '%s'\n", location, (long)size, full_name);
    1982           0 :                 return false;
    1983             :         }
    1984             : 
    1985         162 :         smb2_util_close(tree, handle);
    1986         162 :         return true;
    1987             : }
    1988             : 
    1989           4 : static bool torture_setup_local_xattr(struct torture_context *tctx,
    1990             :                                       const char *path_option,
    1991             :                                       const char *name,
    1992             :                                       const char *xattr,
    1993             :                                       const char *metadata,
    1994             :                                       size_t size)
    1995             : {
    1996           4 :         int ret = true;
    1997           0 :         int result;
    1998           0 :         const char *spath;
    1999           0 :         char *path;
    2000             : 
    2001           4 :         spath = torture_setting_string(tctx, path_option, NULL);
    2002           4 :         if (spath == NULL) {
    2003           0 :                 printf("No sharepath for option %s\n", path_option);
    2004           0 :                 return false;
    2005             :         }
    2006             : 
    2007           4 :         path = talloc_asprintf(tctx, "%s/%s", spath, name);
    2008             : 
    2009           4 :         result = setxattr(path, xattr, metadata, size, 0);
    2010           4 :         if (result != 0) {
    2011           0 :                 ret = false;
    2012             :         }
    2013             : 
    2014           4 :         TALLOC_FREE(path);
    2015             : 
    2016           4 :         return ret;
    2017             : }
    2018             : 
    2019             : /**
    2020             :  * Create a file or directory
    2021             :  **/
    2022         324 : static bool torture_setup_file(TALLOC_CTX *mem_ctx, struct smb2_tree *tree,
    2023             :                                const char *name, bool dir)
    2024             : {
    2025           0 :         struct smb2_create io;
    2026           0 :         NTSTATUS status;
    2027             : 
    2028         324 :         smb2_util_unlink(tree, name);
    2029         324 :         ZERO_STRUCT(io);
    2030         324 :         io.in.desired_access = SEC_FLAG_MAXIMUM_ALLOWED;
    2031         324 :         io.in.file_attributes   = FILE_ATTRIBUTE_NORMAL;
    2032         324 :         io.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF;
    2033         324 :         io.in.share_access =
    2034             :                 NTCREATEX_SHARE_ACCESS_DELETE|
    2035             :                 NTCREATEX_SHARE_ACCESS_READ|
    2036             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2037         324 :         io.in.create_options = 0;
    2038         324 :         io.in.fname = name;
    2039         324 :         if (dir) {
    2040           0 :                 io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
    2041           0 :                 io.in.share_access &= ~NTCREATEX_SHARE_ACCESS_DELETE;
    2042           0 :                 io.in.file_attributes   = FILE_ATTRIBUTE_DIRECTORY;
    2043           0 :                 io.in.create_disposition = NTCREATEX_DISP_CREATE;
    2044             :         }
    2045             : 
    2046         324 :         status = smb2_create(tree, mem_ctx, &io);
    2047         324 :         if (!NT_STATUS_IS_OK(status)) {
    2048           0 :                 return false;
    2049             :         }
    2050             : 
    2051         324 :         status = smb2_util_close(tree, io.out.file.handle);
    2052         324 :         if (!NT_STATUS_IS_OK(status)) {
    2053           0 :                 return false;
    2054             :         }
    2055             : 
    2056         324 :         return true;
    2057             : }
    2058             : 
    2059         112 : static bool enable_aapl(struct torture_context *tctx,
    2060             :                         struct smb2_tree *tree)
    2061             : {
    2062         112 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2063           0 :         NTSTATUS status;
    2064         112 :         bool ret = true;
    2065           0 :         struct smb2_create io;
    2066           0 :         DATA_BLOB data;
    2067         112 :         struct smb2_create_blob *aapl = NULL;
    2068           0 :         uint32_t aapl_server_caps;
    2069         112 :         uint32_t expected_scaps = (SMB2_CRTCTX_AAPL_UNIX_BASED |
    2070             :                                    SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR |
    2071             :                                    SMB2_CRTCTX_AAPL_SUPPORTS_NFS_ACE |
    2072             :                                    SMB2_CRTCTX_AAPL_SUPPORTS_OSX_COPYFILE);
    2073         112 :         bool is_osx_server = torture_setting_bool(tctx, "osx", false);
    2074             : 
    2075         112 :         ZERO_STRUCT(io);
    2076         112 :         io.in.desired_access     = SEC_FLAG_MAXIMUM_ALLOWED;
    2077         112 :         io.in.file_attributes    = FILE_ATTRIBUTE_DIRECTORY;
    2078         112 :         io.in.create_disposition = NTCREATEX_DISP_OPEN;
    2079         112 :         io.in.share_access = (NTCREATEX_SHARE_ACCESS_DELETE |
    2080             :                               NTCREATEX_SHARE_ACCESS_READ |
    2081             :                               NTCREATEX_SHARE_ACCESS_WRITE);
    2082         112 :         io.in.fname = "";
    2083             : 
    2084             :         /*
    2085             :          * Issuing an SMB2/CREATE with a suitably formed AAPL context,
    2086             :          * controls behaviour of Apple's SMB2 extensions for the whole
    2087             :          * session!
    2088             :          */
    2089             : 
    2090         112 :         data = data_blob_talloc(mem_ctx, NULL, 3 * sizeof(uint64_t));
    2091         112 :         SBVAL(data.data, 0, SMB2_CRTCTX_AAPL_SERVER_QUERY);
    2092         112 :         SBVAL(data.data, 8, (SMB2_CRTCTX_AAPL_SERVER_CAPS |
    2093             :                              SMB2_CRTCTX_AAPL_VOLUME_CAPS |
    2094             :                              SMB2_CRTCTX_AAPL_MODEL_INFO));
    2095         112 :         SBVAL(data.data, 16, (SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR |
    2096             :                               SMB2_CRTCTX_AAPL_UNIX_BASED |
    2097             :                               SMB2_CRTCTX_AAPL_SUPPORTS_NFS_ACE));
    2098             : 
    2099         112 :         status = smb2_create_blob_add(tctx, &io.in.blobs, "AAPL", data);
    2100         112 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create_blob_add");
    2101             : 
    2102         112 :         status = smb2_create(tree, tctx, &io);
    2103         112 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
    2104             : 
    2105         112 :         status = smb2_util_close(tree, io.out.file.handle);
    2106         112 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_util_close");
    2107             : 
    2108             :         /*
    2109             :          * Now check returned AAPL context
    2110             :          */
    2111         112 :         torture_comment(tctx, "Comparing returned AAPL capabilities\n");
    2112             : 
    2113         112 :         aapl = smb2_create_blob_find(&io.out.blobs,
    2114             :                                      SMB2_CREATE_TAG_AAPL);
    2115         112 :         torture_assert_goto(tctx, aapl != NULL, ret, done, "missing AAPL context");
    2116             : 
    2117         112 :         if (!is_osx_server) {
    2118           0 :                 size_t expected_aapl_ctx_size;
    2119             : 
    2120         112 :                 expected_aapl_ctx_size = strlen("MacSamba") * 2 + 40;
    2121             : 
    2122         112 :                 torture_assert_goto(
    2123             :                         tctx, aapl->data.length == expected_aapl_ctx_size,
    2124             :                         ret, done, "bad AAPL size");
    2125             :         }
    2126             : 
    2127         112 :         aapl_server_caps = BVAL(aapl->data.data, 16);
    2128         112 :         torture_assert_goto(tctx, aapl_server_caps == expected_scaps,
    2129             :                             ret, done, "bad AAPL caps");
    2130             : 
    2131         112 : done:
    2132         112 :         talloc_free(mem_ctx);
    2133         112 :         return ret;
    2134             : }
    2135             : 
    2136           2 : static bool test_read_netatalk_metadata(struct torture_context *tctx,
    2137             :                                         struct smb2_tree *tree)
    2138             : {
    2139           2 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2140           2 :         const char *fname = BASEDIR "\\torture_read_metadata";
    2141           0 :         NTSTATUS status;
    2142           0 :         struct smb2_handle testdirh;
    2143           2 :         bool ret = true;
    2144           0 :         ssize_t len;
    2145           2 :         const char *localdir = NULL;
    2146             : 
    2147           2 :         torture_comment(tctx, "Checking metadata access\n");
    2148             : 
    2149           2 :         localdir = torture_setting_string(tctx, "localdir", NULL);
    2150           2 :         if (localdir == NULL) {
    2151           0 :                 torture_skip(tctx, "Need localdir for test");
    2152             :         }
    2153             : 
    2154           2 :         smb2_util_unlink(tree, fname);
    2155             : 
    2156           2 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2157           2 :         CHECK_STATUS(status, NT_STATUS_OK);
    2158           2 :         smb2_util_close(tree, testdirh);
    2159             : 
    2160           2 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    2161           2 :         if (ret == false) {
    2162           0 :                 goto done;
    2163             :         }
    2164             : 
    2165           2 :         ret = torture_setup_local_xattr(tctx, "localdir",
    2166             :                                         BASEDIR "/torture_read_metadata",
    2167             :                                         AFPINFO_EA_NETATALK,
    2168             :                                         metadata_xattr, sizeof(metadata_xattr));
    2169           2 :         if (ret == false) {
    2170           0 :                 goto done;
    2171             :         }
    2172             : 
    2173           2 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    2174             :                            0, 60, 0, 4, "AFP");
    2175           2 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    2176             : 
    2177           2 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    2178             :                            0, 60, 16, 8, "BARRFOOO");
    2179           2 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    2180             : 
    2181           2 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    2182             :                            16, 8, 0, 3, "AFP");
    2183           2 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    2184             : 
    2185             :         /* Check reading offset and read size > sizeof(AFPINFO_STREAM) */
    2186             : 
    2187           2 :         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
    2188             :                           AFPINFO_STREAM, 0, 61);
    2189           2 :         CHECK_VALUE(len, 60);
    2190             : 
    2191           2 :         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
    2192             :                           AFPINFO_STREAM, 59, 2);
    2193           2 :         CHECK_VALUE(len, 2);
    2194             : 
    2195           2 :         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
    2196             :                           AFPINFO_STREAM, 60, 1);
    2197           2 :         CHECK_VALUE(len, 1);
    2198             : 
    2199           2 :         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
    2200             :                           AFPINFO_STREAM, 61, 1);
    2201           2 :         CHECK_VALUE(len, 0);
    2202             : 
    2203           2 : done:
    2204           2 :         smb2_deltree(tree, BASEDIR);
    2205           2 :         talloc_free(mem_ctx);
    2206           2 :         return ret;
    2207             : }
    2208             : 
    2209           8 : static bool test_read_afpinfo(struct torture_context *tctx,
    2210             :                               struct smb2_tree *tree)
    2211             : {
    2212           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2213           8 :         const char *fname = BASEDIR "\\torture_read_metadata";
    2214           0 :         NTSTATUS status;
    2215           0 :         struct smb2_handle testdirh;
    2216           8 :         bool ret = true;
    2217           0 :         ssize_t len;
    2218           0 :         AfpInfo *info;
    2219           8 :         const char *type_creator = "SMB,OLE!";
    2220             : 
    2221           8 :         torture_comment(tctx, "Checking metadata access\n");
    2222             : 
    2223           8 :         smb2_util_unlink(tree, fname);
    2224             : 
    2225           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2226           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir failed");
    2227           8 :         smb2_util_close(tree, testdirh);
    2228             : 
    2229           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    2230           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file failed");
    2231             : 
    2232           8 :         info = torture_afpinfo_new(mem_ctx);
    2233           8 :         torture_assert_goto(tctx, info != NULL, ret, done, "torture_afpinfo_new failed");
    2234             : 
    2235           8 :         memcpy(info->afpi_FinderInfo, type_creator, 8);
    2236           8 :         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
    2237           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_write_afpinfo failed");
    2238             : 
    2239           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    2240             :                            0, 60, 0, 4, "AFP");
    2241           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    2242             : 
    2243           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    2244             :                            0, 60, 16, 8, type_creator);
    2245           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    2246             : 
    2247             :         /*
    2248             :          * OS X ignores offset <= 60 and treats the as
    2249             :          * offset=0. Reading from offsets > 60 returns EOF=0.
    2250             :          */
    2251             : 
    2252           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    2253             :                            16, 8, 0, 8, "AFP\0\0\0\001\0");
    2254           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    2255             : 
    2256           8 :         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
    2257             :                           AFPINFO_STREAM, 0, 61);
    2258           8 :         torture_assert_goto(tctx, len == 60, ret, done, "read_stream failed");
    2259             : 
    2260           8 :         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
    2261             :                           AFPINFO_STREAM, 59, 2);
    2262           8 :         torture_assert_goto(tctx, len == 2, ret, done, "read_stream failed");
    2263             : 
    2264           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    2265             :                            59, 2, 0, 2, "AF");
    2266           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    2267             : 
    2268           8 :         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
    2269             :                           AFPINFO_STREAM, 60, 1);
    2270           8 :         torture_assert_goto(tctx, len == 1, ret, done, "read_stream failed");
    2271             : 
    2272           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    2273             :                            60, 1, 0, 1, "A");
    2274           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    2275             : 
    2276           8 :         len = read_stream(tree, __location__, tctx, mem_ctx, fname,
    2277             :                           AFPINFO_STREAM, 61, 1);
    2278           8 :         torture_assert_goto(tctx, len == 0, ret, done, "read_stream failed");
    2279             : 
    2280           8 : done:
    2281           8 :         smb2_util_unlink(tree, fname);
    2282           8 :         smb2_deltree(tree, BASEDIR);
    2283           8 :         talloc_free(mem_ctx);
    2284           8 :         return ret;
    2285             : }
    2286             : 
    2287           8 : static bool test_write_atalk_metadata(struct torture_context *tctx,
    2288             :                                       struct smb2_tree *tree)
    2289             : {
    2290           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2291           8 :         const char *fname = BASEDIR "\\torture_write_metadata";
    2292           8 :         const char *type_creator = "SMB,OLE!";
    2293           0 :         NTSTATUS status;
    2294           0 :         struct smb2_handle testdirh;
    2295           8 :         bool ret = true;
    2296           0 :         AfpInfo *info;
    2297             : 
    2298           8 :         smb2_deltree(tree, BASEDIR);
    2299           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2300           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2301           8 :         smb2_util_close(tree, testdirh);
    2302             : 
    2303           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    2304           8 :         if (ret == false) {
    2305           0 :                 goto done;
    2306             :         }
    2307             : 
    2308           8 :         info = torture_afpinfo_new(mem_ctx);
    2309           8 :         if (info == NULL) {
    2310           0 :                 goto done;
    2311             :         }
    2312             : 
    2313           8 :         memcpy(info->afpi_FinderInfo, type_creator, 8);
    2314           8 :         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
    2315           8 :         ret &= check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    2316             :                             0, 60, 16, 8, type_creator);
    2317             : 
    2318           8 : done:
    2319           8 :         smb2_util_unlink(tree, fname);
    2320           8 :         smb2_deltree(tree, BASEDIR);
    2321           8 :         talloc_free(mem_ctx);
    2322           8 :         return ret;
    2323             : }
    2324             : 
    2325           8 : static bool test_write_atalk_rfork_io(struct torture_context *tctx,
    2326             :                                       struct smb2_tree *tree)
    2327             : {
    2328           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2329           8 :         const char *fname = BASEDIR "\\torture_write_rfork_io";
    2330           8 :         const char *rfork = BASEDIR "\\torture_write_rfork_io" AFPRESOURCE_STREAM_NAME;
    2331           8 :         const char *rfork_content = "1234567890";
    2332           0 :         NTSTATUS status;
    2333           0 :         struct smb2_handle testdirh;
    2334           8 :         bool ret = true;
    2335             : 
    2336           0 :         union smb_open io;
    2337           0 :         struct smb2_handle filehandle;
    2338           0 :         union smb_fileinfo finfo;
    2339           0 :         union smb_setfileinfo sinfo;
    2340             : 
    2341           8 :         smb2_util_unlink(tree, fname);
    2342             : 
    2343           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2344           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2345           8 :         smb2_util_close(tree, testdirh);
    2346             : 
    2347           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    2348           8 :         if (ret == false) {
    2349           0 :                 goto done;
    2350             :         }
    2351             : 
    2352           8 :         torture_comment(tctx, "(%s) writing to resource fork\n",
    2353             :             __location__);
    2354             : 
    2355           8 :         ret &= write_stream(tree, __location__, tctx, mem_ctx,
    2356             :                             fname, AFPRESOURCE_STREAM_NAME,
    2357             :                             10, 10, rfork_content);
    2358             : 
    2359           8 :         ret &= check_stream(tree, __location__, tctx, mem_ctx,
    2360             :                             fname, AFPRESOURCE_STREAM_NAME,
    2361             :                             0, 20, 10, 10, rfork_content);
    2362             : 
    2363             :         /* Check size after write */
    2364             : 
    2365           8 :         ZERO_STRUCT(io);
    2366           8 :         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
    2367           8 :         io.smb2.in.desired_access = SEC_FILE_READ_ATTRIBUTE |
    2368             :                 SEC_FILE_WRITE_ATTRIBUTE;
    2369           8 :         io.smb2.in.fname = rfork;
    2370           8 :         status = smb2_create(tree, mem_ctx, &(io.smb2));
    2371           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2372           8 :         filehandle = io.smb2.out.file.handle;
    2373             : 
    2374           8 :         torture_comment(tctx, "(%s) check resource fork size after write\n",
    2375             :             __location__);
    2376             : 
    2377           8 :         ZERO_STRUCT(finfo);
    2378           8 :         finfo.generic.level = RAW_FILEINFO_ALL_INFORMATION;
    2379           8 :         finfo.generic.in.file.handle = filehandle;
    2380           8 :         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
    2381           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2382           8 :         if (finfo.all_info.out.size != 20) {
    2383           0 :                 torture_result(tctx, TORTURE_FAIL,
    2384             :                                "(%s) Incorrect resource fork size\n",
    2385             :                                __location__);
    2386           0 :                 ret = false;
    2387           0 :                 smb2_util_close(tree, filehandle);
    2388           0 :                 goto done;
    2389             :         }
    2390           8 :         smb2_util_close(tree, filehandle);
    2391             : 
    2392             :         /* Write at large offset */
    2393             : 
    2394           8 :         torture_comment(tctx, "(%s) writing to resource fork at large offset\n",
    2395             :                         __location__);
    2396             : 
    2397           8 :         ret &= write_stream(tree, __location__, tctx, mem_ctx,
    2398             :                             fname, AFPRESOURCE_STREAM_NAME,
    2399             :                             (off_t)64*1024*1024, 10, rfork_content);
    2400             : 
    2401             :         /* Check size after write */
    2402             : 
    2403           8 :         ZERO_STRUCT(io);
    2404           8 :         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
    2405           8 :         io.smb2.in.desired_access = SEC_FILE_READ_ATTRIBUTE |
    2406             :                 SEC_FILE_WRITE_ATTRIBUTE;
    2407           8 :         io.smb2.in.fname = rfork;
    2408           8 :         status = smb2_create(tree, mem_ctx, &(io.smb2));
    2409           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2410           8 :         filehandle = io.smb2.out.file.handle;
    2411             : 
    2412           8 :         torture_comment(tctx, "(%s) check resource fork size after write\n",
    2413             :             __location__);
    2414             : 
    2415           8 :         ZERO_STRUCT(finfo);
    2416           8 :         finfo.generic.level = RAW_FILEINFO_ALL_INFORMATION;
    2417           8 :         finfo.generic.in.file.handle = filehandle;
    2418           8 :         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
    2419           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2420           8 :         if (finfo.all_info.out.size != 64*1024*1024 + 10) {
    2421           0 :                 torture_result(tctx, TORTURE_FAIL,
    2422             :                                "(%s) Incorrect resource fork size\n",
    2423             :                                __location__);
    2424           0 :                 ret = false;
    2425           0 :                 smb2_util_close(tree, filehandle);
    2426           0 :                 goto done;
    2427             :         }
    2428           8 :         smb2_util_close(tree, filehandle);
    2429             : 
    2430           8 :         ret &= check_stream(tree, __location__, tctx, mem_ctx,
    2431             :                             fname, AFPRESOURCE_STREAM_NAME,
    2432             :                             (off_t)64*1024*1024, 10, 0, 10, rfork_content);
    2433             : 
    2434             :         /* Truncate back to size of 1 byte */
    2435             : 
    2436           8 :         torture_comment(tctx, "(%s) truncate resource fork and check size\n",
    2437             :                         __location__);
    2438             : 
    2439           8 :         ZERO_STRUCT(io);
    2440           8 :         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
    2441           8 :         io.smb2.in.desired_access = SEC_FILE_ALL;
    2442           8 :         io.smb2.in.fname = rfork;
    2443           8 :         status = smb2_create(tree, mem_ctx, &(io.smb2));
    2444           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2445           8 :         filehandle = io.smb2.out.file.handle;
    2446             : 
    2447           8 :         ZERO_STRUCT(sinfo);
    2448           8 :         sinfo.end_of_file_info.level =
    2449             :                 RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    2450           8 :         sinfo.end_of_file_info.in.file.handle = filehandle;
    2451           8 :         sinfo.end_of_file_info.in.size = 1;
    2452           8 :         status = smb2_setinfo_file(tree, &sinfo);
    2453           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2454             : 
    2455           8 :         smb2_util_close(tree, filehandle);
    2456             : 
    2457             :         /* Now check size */
    2458           8 :         ZERO_STRUCT(io);
    2459           8 :         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
    2460           8 :         io.smb2.in.desired_access = SEC_FILE_READ_ATTRIBUTE |
    2461             :                 SEC_FILE_WRITE_ATTRIBUTE;
    2462           8 :         io.smb2.in.fname = rfork;
    2463           8 :         status = smb2_create(tree, mem_ctx, &(io.smb2));
    2464           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2465           8 :         filehandle = io.smb2.out.file.handle;
    2466             : 
    2467           8 :         ZERO_STRUCT(finfo);
    2468           8 :         finfo.generic.level = RAW_FILEINFO_ALL_INFORMATION;
    2469           8 :         finfo.generic.in.file.handle = filehandle;
    2470           8 :         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
    2471           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2472           8 :         if (finfo.all_info.out.size != 1) {
    2473           0 :                 torture_result(tctx, TORTURE_FAIL,
    2474             :                                "(%s) Incorrect resource fork size\n",
    2475             :                                __location__);
    2476           0 :                 ret = false;
    2477           0 :                 smb2_util_close(tree, filehandle);
    2478           0 :                 goto done;
    2479             :         }
    2480           8 :         smb2_util_close(tree, filehandle);
    2481             : 
    2482           8 : done:
    2483           8 :         smb2_util_unlink(tree, fname);
    2484           8 :         smb2_deltree(tree, BASEDIR);
    2485           8 :         talloc_free(mem_ctx);
    2486           8 :         return ret;
    2487             : }
    2488             : 
    2489           8 : static bool test_rfork_truncate(struct torture_context *tctx,
    2490             :                                 struct smb2_tree *tree)
    2491             : {
    2492           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2493           8 :         const char *fname = BASEDIR "\\torture_rfork_truncate";
    2494           8 :         const char *rfork = BASEDIR "\\torture_rfork_truncate" AFPRESOURCE_STREAM;
    2495           8 :         const char *rfork_content = "1234567890";
    2496           0 :         NTSTATUS status;
    2497           0 :         struct smb2_handle testdirh;
    2498           8 :         bool ret = true;
    2499           0 :         struct smb2_create create;
    2500           0 :         struct smb2_handle fh1, fh2, fh3;
    2501           0 :         union smb_setfileinfo sinfo;
    2502             : 
    2503           8 :         ret = enable_aapl(tctx, tree);
    2504           8 :         torture_assert_goto(tctx, ret == true, ret, done, "enable_aapl failed");
    2505             : 
    2506           8 :         smb2_util_unlink(tree, fname);
    2507             : 
    2508           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2509           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
    2510           8 :         smb2_util_close(tree, testdirh);
    2511             : 
    2512           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    2513           8 :         if (ret == false) {
    2514           0 :                 goto done;
    2515             :         }
    2516             : 
    2517           8 :         ret &= write_stream(tree, __location__, tctx, mem_ctx,
    2518             :                             fname, AFPRESOURCE_STREAM,
    2519             :                             10, 10, rfork_content);
    2520             : 
    2521             :         /* Truncate back to size 0, further access MUST return ENOENT */
    2522             : 
    2523           8 :         torture_comment(tctx, "(%s) truncate resource fork to size 0\n",
    2524             :                         __location__);
    2525             : 
    2526           8 :         ZERO_STRUCT(create);
    2527           8 :         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
    2528           8 :         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
    2529           8 :         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
    2530           8 :         create.in.fname               = fname;
    2531           8 :         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
    2532             :                 NTCREATEX_SHARE_ACCESS_READ |
    2533             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2534           8 :         status = smb2_create(tree, mem_ctx, &create);
    2535           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
    2536           8 :         fh1 = create.out.file.handle;
    2537             : 
    2538           8 :         ZERO_STRUCT(create);
    2539           8 :         create.in.create_disposition  = NTCREATEX_DISP_OPEN_IF;
    2540           8 :         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
    2541           8 :         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
    2542           8 :         create.in.fname               = rfork;
    2543           8 :         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
    2544             :                 NTCREATEX_SHARE_ACCESS_READ |
    2545             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2546           8 :         status = smb2_create(tree, mem_ctx, &create);
    2547           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
    2548           8 :         fh2 = create.out.file.handle;
    2549             : 
    2550           8 :         ZERO_STRUCT(sinfo);
    2551           8 :         sinfo.end_of_file_info.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    2552           8 :         sinfo.end_of_file_info.in.file.handle = fh2;
    2553           8 :         sinfo.end_of_file_info.in.size = 0;
    2554           8 :         status = smb2_setinfo_file(tree, &sinfo);
    2555           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_setinfo_file");
    2556             : 
    2557             :         /*
    2558             :          * Now check size, we should get OBJECT_NAME_NOT_FOUND (!)
    2559             :          */
    2560           8 :         ZERO_STRUCT(create);
    2561           8 :         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
    2562           8 :         create.in.desired_access      = SEC_FILE_ALL;
    2563           8 :         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
    2564           8 :         create.in.fname               = rfork;
    2565           8 :         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
    2566             :                 NTCREATEX_SHARE_ACCESS_READ |
    2567             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2568           8 :         status = smb2_create(tree, mem_ctx, &create);
    2569           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done, "smb2_create");
    2570             : 
    2571             :         /*
    2572             :          * Do another open on the rfork and write to the new handle. A
    2573             :          * naive server might unlink the AppleDouble resource fork
    2574             :          * file when its truncated to 0 bytes above, so in case both
    2575             :          * open handles share the same underlying fd, the unlink would
    2576             :          * cause the below write to be lost.
    2577             :          */
    2578           8 :         ZERO_STRUCT(create);
    2579           8 :         create.in.create_disposition  = NTCREATEX_DISP_OPEN_IF;
    2580           8 :         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
    2581           8 :         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
    2582           8 :         create.in.fname               = rfork;
    2583           8 :         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
    2584             :                 NTCREATEX_SHARE_ACCESS_READ |
    2585             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2586           8 :         status = smb2_create(tree, mem_ctx, &create);
    2587           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
    2588           8 :         fh3 = create.out.file.handle;
    2589             : 
    2590           8 :         status = smb2_util_write(tree, fh3, "foo", 0, 3);
    2591           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_util_write");
    2592             : 
    2593           8 :         smb2_util_close(tree, fh3);
    2594           8 :         smb2_util_close(tree, fh2);
    2595           8 :         smb2_util_close(tree, fh1);
    2596             : 
    2597           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPRESOURCE_STREAM,
    2598             :                            0, 3, 0, 3, "foo");
    2599           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream");
    2600             : 
    2601           8 : done:
    2602           8 :         smb2_util_unlink(tree, fname);
    2603           8 :         smb2_deltree(tree, BASEDIR);
    2604           8 :         talloc_free(mem_ctx);
    2605           8 :         return ret;
    2606             : }
    2607             : 
    2608           8 : static bool test_rfork_create(struct torture_context *tctx,
    2609             :                               struct smb2_tree *tree)
    2610             : {
    2611           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2612           8 :         const char *fname = BASEDIR "\\torture_rfork_create";
    2613           8 :         const char *rfork = BASEDIR "\\torture_rfork_create" AFPRESOURCE_STREAM;
    2614           0 :         NTSTATUS status;
    2615           0 :         struct smb2_handle testdirh;
    2616           8 :         bool ret = true;
    2617           0 :         struct smb2_create create;
    2618           0 :         struct smb2_handle fh1;
    2619           8 :         const char *streams[] = {
    2620             :                 "::$DATA"
    2621             :         };
    2622           0 :         union smb_fileinfo finfo;
    2623             : 
    2624           8 :         ret = enable_aapl(tctx, tree);
    2625           8 :         torture_assert_goto(tctx, ret == true, ret, done, "enable_aapl failed");
    2626             : 
    2627           8 :         smb2_util_unlink(tree, fname);
    2628             : 
    2629           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2630           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
    2631           8 :         smb2_util_close(tree, testdirh);
    2632             : 
    2633           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    2634           8 :         if (ret == false) {
    2635           0 :                 goto done;
    2636             :         }
    2637             : 
    2638           8 :         torture_comment(tctx, "(%s) open rfork, should return ENOENT\n",
    2639             :                         __location__);
    2640             : 
    2641           8 :         ZERO_STRUCT(create);
    2642           8 :         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
    2643           8 :         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
    2644           8 :         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
    2645           8 :         create.in.fname               = rfork;
    2646           8 :         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
    2647             :                 NTCREATEX_SHARE_ACCESS_READ |
    2648             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2649           8 :         status = smb2_create(tree, mem_ctx, &create);
    2650           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done, "smb2_create");
    2651             : 
    2652           8 :         torture_comment(tctx, "(%s) create resource fork\n", __location__);
    2653             : 
    2654           8 :         ZERO_STRUCT(create);
    2655           8 :         create.in.create_disposition  = NTCREATEX_DISP_OPEN_IF;
    2656           8 :         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
    2657           8 :         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
    2658           8 :         create.in.fname               = rfork;
    2659           8 :         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
    2660             :                 NTCREATEX_SHARE_ACCESS_READ |
    2661             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2662           8 :         status = smb2_create(tree, mem_ctx, &create);
    2663           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
    2664           8 :         fh1 = create.out.file.handle;
    2665             : 
    2666           8 :         torture_comment(tctx, "(%s) getinfo on create handle\n",
    2667             :                         __location__);
    2668             : 
    2669           8 :         ZERO_STRUCT(finfo);
    2670           8 :         finfo.generic.level = RAW_FILEINFO_ALL_INFORMATION;
    2671           8 :         finfo.generic.in.file.handle = fh1;
    2672           8 :         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
    2673           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_getinfo_file");
    2674           8 :         if (finfo.all_info.out.size != 0) {
    2675           0 :                 torture_result(tctx, TORTURE_FAIL,
    2676             :                                "(%s) Incorrect resource fork size\n",
    2677             :                                __location__);
    2678           0 :                 ret = false;
    2679           0 :                 smb2_util_close(tree, fh1);
    2680           0 :                 goto done;
    2681             :         }
    2682             : 
    2683           8 :         torture_comment(tctx, "(%s) open rfork, should still return ENOENT\n",
    2684             :                         __location__);
    2685             : 
    2686           8 :         ZERO_STRUCT(create);
    2687           8 :         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
    2688           8 :         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
    2689           8 :         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
    2690           8 :         create.in.fname               = rfork;
    2691           8 :         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
    2692             :                 NTCREATEX_SHARE_ACCESS_READ |
    2693             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2694           8 :         status = smb2_create(tree, mem_ctx, &create);
    2695           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done, "smb2_create");
    2696             : 
    2697           8 :         ret = check_stream_list(tree, tctx, fname, 1, streams, false);
    2698           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream_list");
    2699             : 
    2700           8 :         torture_comment(tctx, "(%s) close empty created rfork, open should return ENOENT\n",
    2701             :                         __location__);
    2702             : 
    2703           8 :         ZERO_STRUCT(create);
    2704           8 :         create.in.create_disposition  = NTCREATEX_DISP_OPEN;
    2705           8 :         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
    2706           8 :         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
    2707           8 :         create.in.fname               = rfork;
    2708           8 :         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
    2709             :                 NTCREATEX_SHARE_ACCESS_READ |
    2710             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2711           8 :         status = smb2_create(tree, mem_ctx, &create);
    2712           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done, "smb2_create");
    2713             : 
    2714           8 : done:
    2715           8 :         smb2_util_unlink(tree, fname);
    2716           8 :         smb2_deltree(tree, BASEDIR);
    2717           8 :         talloc_free(mem_ctx);
    2718           8 :         return ret;
    2719             : }
    2720             : 
    2721             : /*
    2722             :  * BUG: https://bugzilla.samba.org/show_bug.cgi?id=15182
    2723             :  */
    2724             : 
    2725           8 : static bool test_rfork_fsync(struct torture_context *tctx,
    2726             :                               struct smb2_tree *tree)
    2727             : {
    2728           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2729           8 :         const char *fname = BASEDIR "\\torture_rfork_fsync";
    2730           8 :         const char *rfork = BASEDIR "\\torture_rfork_fsync" AFPRESOURCE_STREAM;
    2731           0 :         NTSTATUS status;
    2732           0 :         struct smb2_handle testdirh;
    2733           8 :         bool ret = true;
    2734           0 :         struct smb2_create create;
    2735           0 :         struct smb2_handle fh1;
    2736           0 :         struct smb2_flush f;
    2737             : 
    2738           8 :         ZERO_STRUCT(fh1);
    2739             : 
    2740           8 :         ret = enable_aapl(tctx, tree);
    2741           8 :         torture_assert_goto(tctx, ret == true, ret, done, "enable_aapl failed");
    2742             : 
    2743           8 :         smb2_util_unlink(tree, fname);
    2744             : 
    2745           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2746           8 :         torture_assert_ntstatus_ok_goto(tctx,
    2747             :                                         status,
    2748             :                                         ret,
    2749             :                                         done,
    2750             :                                         "torture_smb2_testdir");
    2751           8 :         smb2_util_close(tree, testdirh);
    2752             : 
    2753           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    2754           8 :         if (ret == false) {
    2755           0 :                 goto done;
    2756             :         }
    2757             : 
    2758           8 :         torture_comment(tctx, "(%s) create resource fork %s\n",
    2759             :                 __location__,
    2760             :                 rfork);
    2761             : 
    2762           8 :         ZERO_STRUCT(create);
    2763           8 :         create.in.create_disposition  = NTCREATEX_DISP_OPEN_IF;
    2764           8 :         create.in.desired_access      = SEC_STD_READ_CONTROL | SEC_FILE_ALL;
    2765           8 :         create.in.file_attributes     = FILE_ATTRIBUTE_NORMAL;
    2766           8 :         create.in.fname               = rfork;
    2767           8 :         create.in.share_access        = NTCREATEX_SHARE_ACCESS_DELETE |
    2768             :                 NTCREATEX_SHARE_ACCESS_READ |
    2769             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    2770           8 :         status = smb2_create(tree, mem_ctx, &create);
    2771           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
    2772           8 :         fh1 = create.out.file.handle;
    2773             : 
    2774           8 :         torture_comment(tctx, "(%s) Write 10 bytes to resource fork %s\n",
    2775             :                 __location__,
    2776             :                 rfork);
    2777             : 
    2778           8 :         status = smb2_util_write(tree, fh1, "1234567890", 0, 10);
    2779           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    2780             :                                         "smb2_util_write failed\n");
    2781             : 
    2782           8 :         torture_comment(tctx, "(%s) fsync on resource fork %s\n",
    2783             :                 __location__,
    2784             :                 rfork);
    2785             : 
    2786           8 :         f.in.file.handle = fh1;
    2787           8 :         status = smb2_flush(tree, &f);
    2788           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    2789             :                                         "smb2_flush failed\n");
    2790             : 
    2791           8 : done:
    2792             : 
    2793           8 :         smb2_util_close(tree, fh1);
    2794           8 :         smb2_util_unlink(tree, fname);
    2795           8 :         smb2_deltree(tree, BASEDIR);
    2796           8 :         talloc_free(mem_ctx);
    2797           8 :         return ret;
    2798             : }
    2799             : 
    2800           8 : static bool test_rfork_create_ro(struct torture_context *tctx,
    2801             :                                  struct smb2_tree *tree)
    2802             : {
    2803           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2804           8 :         const char *fname = BASEDIR "\\torture_rfork_create";
    2805           8 :         const char *rfork = BASEDIR "\\torture_rfork_create" AFPRESOURCE_STREAM;
    2806           0 :         NTSTATUS status;
    2807           0 :         struct smb2_handle testdirh;
    2808           8 :         bool ret = true;
    2809           0 :         struct smb2_create create;
    2810             : 
    2811           8 :         smb2_util_unlink(tree, fname);
    2812           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2813           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    2814             :                 "torture_smb2_testdir\n");
    2815           8 :         smb2_util_close(tree, testdirh);
    2816             : 
    2817           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    2818           8 :         if (ret == false) {
    2819           0 :                 goto done;
    2820             :         }
    2821             : 
    2822           8 :         torture_comment(tctx, "(%s) Try opening read-only with "
    2823             :                         "open_if create disposition, should work\n",
    2824             :                         __location__);
    2825             : 
    2826           8 :         ZERO_STRUCT(create);
    2827           8 :         create.in.fname = rfork;
    2828           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
    2829           8 :         create.in.desired_access = SEC_FILE_READ_DATA | SEC_STD_READ_CONTROL;
    2830           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    2831           8 :         create.in.share_access = FILE_SHARE_READ | FILE_SHARE_DELETE;
    2832           8 :         status = smb2_create(tree, mem_ctx, &(create));
    2833           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    2834             :                 "smb2_create failed\n");
    2835             : 
    2836           8 :         smb2_util_close(tree, create.out.file.handle);
    2837             : 
    2838           8 : done:
    2839           8 :         smb2_util_unlink(tree, fname);
    2840           8 :         smb2_deltree(tree, BASEDIR);
    2841           8 :         talloc_free(mem_ctx);
    2842           8 :         return ret;
    2843             : }
    2844             : 
    2845           8 : static bool test_adouble_conversion(struct torture_context *tctx,
    2846             :                                     struct smb2_tree *tree)
    2847             : {
    2848           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2849           8 :         const char *fname = BASEDIR "\\test_adouble_conversion";
    2850           8 :         const char *adname = BASEDIR "/._test_adouble_conversion";
    2851           0 :         NTSTATUS status;
    2852           0 :         struct smb2_handle testdirh;
    2853           8 :         bool ret = true;
    2854           8 :         const char data[] = {
    2855             :                 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
    2856             :                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
    2857             :         };
    2858           8 :         size_t datalen = sizeof(data);
    2859           8 :         const char *streams[] = {
    2860             :                 "::$DATA",
    2861             :                 AFPINFO_STREAM,
    2862             :                 AFPRESOURCE_STREAM,
    2863             :                 ":com.apple.metadata" "\xef\x80\xa2" "_kMDItemUserTags:$DATA",
    2864             :                 ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */
    2865             :         };
    2866           8 :         bool is_osx = torture_setting_bool(tctx, "osx", false);
    2867             : 
    2868           8 :         if (is_osx) {
    2869           0 :                 torture_skip(tctx, "Test only works with Samba\n");
    2870             :         }
    2871             : 
    2872           8 :         smb2_deltree(tree, BASEDIR);
    2873             : 
    2874           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2875           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    2876           8 :         smb2_util_close(tree, testdirh);
    2877             : 
    2878           8 :         ret = torture_setup_file(tctx, tree, fname, false);
    2879           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    2880             :                             "torture_setup_file failed\n");
    2881             : 
    2882           8 :         ret = torture_setup_file(tctx, tree, adname, false);
    2883           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    2884             :                             "torture_setup_file failed\n");
    2885             : 
    2886           8 :         ret = write_stream(tree, __location__, tctx, mem_ctx,
    2887             :                            adname, NULL,
    2888             :                            0,
    2889             :                            sizeof(osx_adouble_non_empty_rfork_w_xattr),
    2890             :                            osx_adouble_non_empty_rfork_w_xattr);
    2891           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    2892             :                             "write_stream failed\n");
    2893             : 
    2894           8 :         torture_comment(tctx, "(%s) test OS X AppleDouble conversion\n",
    2895             :             __location__);
    2896             : 
    2897           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx,
    2898             :                            fname, AFPRESOURCE_STREAM,
    2899             :                            16, datalen, 0, datalen, data);
    2900           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    2901             :                             "check AFPRESOURCE_STREAM failed\n");
    2902             : 
    2903           6 :         ret = check_stream(tree, __location__, tctx, mem_ctx,
    2904             :                            fname, AFPINFO_STREAM,
    2905             :                            0, 60, 16, 8, "TESTSLOW");
    2906           6 :         torture_assert_goto(tctx, ret == true, ret, done,
    2907             :                             "check AFPINFO_STREAM failed\n");
    2908             : 
    2909           6 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname,
    2910             :                            ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */
    2911             :                            0, 3, 0, 3, "baz");
    2912           6 :         torture_assert_goto(tctx, ret == true, ret, done,
    2913             :                             "check foo:bar stream failed\n");
    2914             : 
    2915           6 :         ret = check_stream_list(tree, tctx, fname, 5, streams, false);
    2916           6 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream_list");
    2917             : 
    2918           6 : done:
    2919           8 :         smb2_deltree(tree, BASEDIR);
    2920           8 :         talloc_free(mem_ctx);
    2921           8 :         return ret;
    2922             : }
    2923             : 
    2924             : /*
    2925             :  * Test conversion of AppleDouble file without embedded xattr data
    2926             :  */
    2927           8 : static bool test_adouble_conversion_wo_xattr(struct torture_context *tctx,
    2928             :                                              struct smb2_tree *tree)
    2929             : {
    2930           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    2931           8 :         const char *fname = BASEDIR "\\test_adouble_conversion";
    2932           8 :         const char *adname = BASEDIR "/._test_adouble_conversion";
    2933           0 :         NTSTATUS status;
    2934           0 :         struct smb2_handle testdirh;
    2935           8 :         bool ret = true;
    2936           8 :         const char *streams[] = {
    2937             :                 "::$DATA",
    2938             :                 AFPINFO_STREAM,
    2939             :                 AFPRESOURCE_STREAM
    2940             :         };
    2941           0 :         struct smb2_create create;
    2942           0 :         struct smb2_find find;
    2943           0 :         unsigned int count;
    2944           0 :         union smb_search_data *d;
    2945           8 :         const char data[] = {
    2946             :                 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
    2947             :                 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
    2948             :         };
    2949           8 :         size_t datalen = sizeof(data);
    2950           8 :         bool is_osx = torture_setting_bool(tctx, "osx", false);
    2951             : 
    2952           8 :         if (is_osx) {
    2953           0 :                 torture_skip(tctx, "Test only works with Samba\n");
    2954             :         }
    2955             : 
    2956           8 :         smb2_deltree(tree, BASEDIR);
    2957             : 
    2958           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    2959           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    2960             :                                         "torture_smb2_testdir failed\n");
    2961           8 :         smb2_util_close(tree, testdirh);
    2962             : 
    2963           8 :         ret = torture_setup_file(tctx, tree, fname, false);
    2964           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    2965             :                             "torture_setup_file failed\n");
    2966             : 
    2967           8 :         ret = torture_setup_file(tctx, tree, adname, false);
    2968           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    2969             :                             "torture_setup_file failed\n");
    2970             : 
    2971           8 :         ret = write_stream(tree, __location__, tctx, mem_ctx,
    2972             :                            adname, NULL, 0,
    2973             :                            sizeof(osx_adouble_without_xattr),
    2974             :                            osx_adouble_without_xattr);
    2975           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    2976             :                             "write_stream failed\n");
    2977             : 
    2978           8 :         ret = enable_aapl(tctx, tree);
    2979           8 :         torture_assert_goto(tctx, ret == true, ret, done, "enable_aapl failed");
    2980             : 
    2981             :         /*
    2982             :          * Issue a smb2_find(), this triggers the server-side conversion
    2983             :          */
    2984             : 
    2985           8 :         create = (struct smb2_create) {
    2986             :                 .in.desired_access = SEC_RIGHTS_DIR_READ,
    2987             :                 .in.create_options = NTCREATEX_OPTIONS_DIRECTORY,
    2988             :                 .in.file_attributes = FILE_ATTRIBUTE_DIRECTORY,
    2989             :                 .in.share_access = NTCREATEX_SHARE_ACCESS_READ,
    2990             :                 .in.create_disposition = NTCREATEX_DISP_OPEN,
    2991             :                 .in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS,
    2992             :                 .in.fname = BASEDIR,
    2993             :         };
    2994             : 
    2995           8 :         status = smb2_create(tree, tctx, &create);
    2996           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    2997             :                                         "smb2_create failed\n");
    2998             : 
    2999           8 :         find = (struct smb2_find) {
    3000             :                 .in.file.handle = create.out.file.handle,
    3001             :                 .in.pattern = "*",
    3002             :                 .in.max_response_size = 0x1000,
    3003             :                 .in.level = SMB2_FIND_ID_BOTH_DIRECTORY_INFO,
    3004             :         };
    3005             : 
    3006           8 :         status = smb2_find_level(tree, tree, &find, &count, &d);
    3007           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    3008             :                                         "smb2_find_level failed\n");
    3009             : 
    3010           8 :         status = smb2_util_close(tree, create.out.file.handle);
    3011           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    3012             :                                         "smb2_util_close failed");
    3013             : 
    3014             :         /*
    3015             :          * Check number of streams
    3016             :          */
    3017             : 
    3018           8 :         ret = check_stream_list(tree, tctx, fname, 3, streams, false);
    3019           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream_list");
    3020             : 
    3021             : 
    3022             :         /*
    3023             :          * Check Resourcefork data can be read.
    3024             :          */
    3025             : 
    3026           6 :         ret = check_stream(tree, __location__, tctx, mem_ctx,
    3027             :                            fname, AFPRESOURCE_STREAM,
    3028             :                            16, datalen, 0, datalen, data);
    3029           6 :         torture_assert_goto(tctx, ret == true, ret, done,
    3030             :                             "check AFPRESOURCE_STREAM failed\n");
    3031             : 
    3032             :         /*
    3033             :          * Check FinderInfo data has been migrated to stream.
    3034             :          */
    3035             : 
    3036           6 :         ret = check_stream(tree, __location__, tctx, mem_ctx,
    3037             :                            fname, AFPINFO_STREAM,
    3038             :                            0, 60, 16, 8, "WAVEPTul");
    3039           6 :         torture_assert_goto(tctx, ret == true, ret, done,
    3040             :                             "check AFPINFO_STREAM failed\n");
    3041             : 
    3042           6 : done:
    3043           8 :         smb2_deltree(tree, BASEDIR);
    3044           8 :         talloc_free(mem_ctx);
    3045           8 :         return ret;
    3046             : }
    3047             : 
    3048           8 : static bool test_aapl(struct torture_context *tctx,
    3049             :                       struct smb2_tree *tree)
    3050             : {
    3051           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    3052           8 :         const char *fname = BASEDIR "\\test_aapl";
    3053           0 :         NTSTATUS status;
    3054           0 :         struct smb2_handle testdirh;
    3055           8 :         bool ret = true;
    3056           0 :         struct smb2_create io;
    3057           0 :         DATA_BLOB data;
    3058           8 :         struct smb2_create_blob *aapl = NULL;
    3059           0 :         AfpInfo *info;
    3060           8 :         const char *type_creator = "SMB,OLE!";
    3061           0 :         char type_creator_buf[9];
    3062           0 :         uint32_t aapl_cmd;
    3063           0 :         uint32_t aapl_reply_bitmap;
    3064           0 :         uint32_t aapl_server_caps;
    3065           0 :         uint32_t aapl_vol_caps;
    3066           8 :         uint32_t expected_vol_caps = 0;
    3067           0 :         char *model;
    3068           0 :         struct smb2_find f;
    3069           0 :         unsigned int count;
    3070           0 :         union smb_search_data *d;
    3071           0 :         uint64_t rfork_len;
    3072           8 :         bool is_osx_server = torture_setting_bool(tctx, "osx", false);
    3073             : 
    3074           8 :         smb2_deltree(tree, BASEDIR);
    3075             : 
    3076           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    3077           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3078           8 :         smb2_util_close(tree, testdirh);
    3079             : 
    3080           8 :         ZERO_STRUCT(io);
    3081           8 :         io.in.desired_access     = SEC_FLAG_MAXIMUM_ALLOWED;
    3082           8 :         io.in.file_attributes    = FILE_ATTRIBUTE_NORMAL;
    3083           8 :         io.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF;
    3084           8 :         io.in.share_access = (NTCREATEX_SHARE_ACCESS_DELETE |
    3085             :                               NTCREATEX_SHARE_ACCESS_READ |
    3086             :                               NTCREATEX_SHARE_ACCESS_WRITE);
    3087           8 :         io.in.fname = fname;
    3088             : 
    3089             :         /*
    3090             :          * Issuing an SMB2/CREATE with a suitably formed AAPL context,
    3091             :          * controls behaviour of Apple's SMB2 extensions for the whole
    3092             :          * session!
    3093             :          */
    3094             : 
    3095           8 :         data = data_blob_talloc(mem_ctx, NULL, 3 * sizeof(uint64_t));
    3096           8 :         SBVAL(data.data, 0, SMB2_CRTCTX_AAPL_SERVER_QUERY);
    3097           8 :         SBVAL(data.data, 8, (SMB2_CRTCTX_AAPL_SERVER_CAPS |
    3098             :                              SMB2_CRTCTX_AAPL_VOLUME_CAPS |
    3099             :                              SMB2_CRTCTX_AAPL_MODEL_INFO));
    3100           8 :         SBVAL(data.data, 16, (SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR |
    3101             :                               SMB2_CRTCTX_AAPL_UNIX_BASED |
    3102             :                               SMB2_CRTCTX_AAPL_SUPPORTS_NFS_ACE));
    3103             : 
    3104           8 :         torture_comment(tctx, "Testing SMB2 create context AAPL\n");
    3105           8 :         status = smb2_create_blob_add(tctx, &io.in.blobs, "AAPL", data);
    3106           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3107             : 
    3108           8 :         status = smb2_create(tree, tctx, &io);
    3109           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3110           8 :         status = smb2_util_close(tree, io.out.file.handle);
    3111           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3112             : 
    3113             :         /*
    3114             :          * Now check returned AAPL context
    3115             :          */
    3116           8 :         torture_comment(tctx, "Comparing returned AAPL capabilities\n");
    3117             : 
    3118           8 :         aapl = smb2_create_blob_find(&io.out.blobs,
    3119             :                                      SMB2_CREATE_TAG_AAPL);
    3120             : 
    3121           8 :         if (aapl == NULL) {
    3122           0 :                 torture_result(tctx, TORTURE_FAIL,
    3123             :                                "(%s) unexpectedly no AAPL capabilities were returned.",
    3124             :                                __location__);
    3125           0 :                 ret = false;
    3126           0 :                 goto done;
    3127             :         }
    3128             : 
    3129           8 :         if (!is_osx_server) {
    3130           0 :                 size_t expected_aapl_ctx_size;
    3131           0 :                 bool size_ok;
    3132             : 
    3133             :                 /*
    3134             :                  * uint32_t CommandCode = kAAPL_SERVER_QUERY
    3135             :                  * uint32_t Reserved = 0;
    3136             :                  * uint64_t ReplyBitmap = kAAPL_SERVER_CAPS |
    3137             :                  *                        kAAPL_VOLUME_CAPS |
    3138             :                  *                        kAAPL_MODEL_INFO;
    3139             :                  * uint64_t ServerCaps = kAAPL_SUPPORTS_READDIR_ATTR |
    3140             :                  *                       kAAPL_SUPPORTS_OSX_COPYFILE;
    3141             :                  * uint64_t VolumeCaps = kAAPL_SUPPORT_RESOLVE_ID |
    3142             :                  *                       kAAPL_CASE_SENSITIVE;
    3143             :                  * uint32_t Pad2 = 0;
    3144             :                  * uint32_t ModelStringLen = 10;
    3145             :                  * ucs2_t ModelString[5] = "MacSamba";
    3146             :                  */
    3147           8 :                 expected_aapl_ctx_size = strlen("MacSamba") * 2 + 40;
    3148             : 
    3149           8 :                 size_ok = aapl->data.length == expected_aapl_ctx_size;
    3150           8 :                 torture_assert_goto(tctx, size_ok, ret, done, "bad AAPL size");
    3151             :         }
    3152             : 
    3153           8 :         aapl_cmd = IVAL(aapl->data.data, 0);
    3154           8 :         if (aapl_cmd != SMB2_CRTCTX_AAPL_SERVER_QUERY) {
    3155           0 :                 torture_result(tctx, TORTURE_FAIL,
    3156             :                                "(%s) unexpected cmd: %d",
    3157             :                                __location__, (int)aapl_cmd);
    3158           0 :                 ret = false;
    3159           0 :                 goto done;
    3160             :         }
    3161             : 
    3162           8 :         aapl_reply_bitmap = BVAL(aapl->data.data, 8);
    3163           8 :         if (aapl_reply_bitmap != (SMB2_CRTCTX_AAPL_SERVER_CAPS |
    3164             :                                   SMB2_CRTCTX_AAPL_VOLUME_CAPS |
    3165             :                                   SMB2_CRTCTX_AAPL_MODEL_INFO)) {
    3166           0 :                 torture_result(tctx, TORTURE_FAIL,
    3167             :                                "(%s) unexpected reply_bitmap: %d",
    3168             :                                __location__, (int)aapl_reply_bitmap);
    3169           0 :                 ret = false;
    3170           0 :                 goto done;
    3171             :         }
    3172             : 
    3173           8 :         aapl_server_caps = BVAL(aapl->data.data, 16);
    3174           8 :         if (aapl_server_caps != (SMB2_CRTCTX_AAPL_UNIX_BASED |
    3175             :                                  SMB2_CRTCTX_AAPL_SUPPORTS_READ_DIR_ATTR |
    3176             :                                  SMB2_CRTCTX_AAPL_SUPPORTS_NFS_ACE |
    3177             :                                  SMB2_CRTCTX_AAPL_SUPPORTS_OSX_COPYFILE)) {
    3178           0 :                 torture_result(tctx, TORTURE_FAIL,
    3179             :                                "(%s) unexpected server_caps: %d",
    3180             :                                __location__, (int)aapl_server_caps);
    3181           0 :                 ret = false;
    3182           0 :                 goto done;
    3183             :         }
    3184             : 
    3185           8 :         if (is_osx_server) {
    3186           0 :                 expected_vol_caps = 5;
    3187             :         }
    3188           8 :         aapl_vol_caps = BVAL(aapl->data.data, 24);
    3189           8 :         if (aapl_vol_caps != expected_vol_caps) {
    3190             :                 /* this will fail on a case insensitive fs ... */
    3191           0 :                 torture_result(tctx, TORTURE_FAIL,
    3192             :                                 "(%s) unexpected vol_caps: %d",
    3193             :                                 __location__, (int)aapl_vol_caps);
    3194             :         }
    3195             : 
    3196           8 :         ret = convert_string_talloc(mem_ctx,
    3197             :                                     CH_UTF16LE, CH_UNIX,
    3198           8 :                                     aapl->data.data + 40, 10,
    3199             :                                     &model, NULL);
    3200           8 :         if (ret == false) {
    3201           0 :                 torture_result(tctx, TORTURE_FAIL,
    3202             :                                "(%s) convert_string_talloc() failed",
    3203             :                                __location__);
    3204           0 :                 goto done;
    3205             :         }
    3206           8 :         torture_comment(tctx, "Got server model: \"%s\"\n", model);
    3207             : 
    3208             :         /*
    3209             :          * Now that Requested AAPL extensions are enabled, setup some
    3210             :          * Mac files with metadata and resource fork
    3211             :          */
    3212           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    3213           8 :         if (ret == false) {
    3214           0 :                 torture_result(tctx, TORTURE_FAIL,
    3215             :                                "(%s) torture_setup_file() failed",
    3216             :                                __location__);
    3217           0 :                 goto done;
    3218             :         }
    3219             : 
    3220           8 :         info = torture_afpinfo_new(mem_ctx);
    3221           8 :         if (info == NULL) {
    3222           0 :                 torture_result(tctx, TORTURE_FAIL,
    3223             :                                "(%s) torture_afpinfo_new() failed",
    3224             :                                __location__);
    3225           0 :                 ret = false;
    3226           0 :                 goto done;
    3227             :         }
    3228             : 
    3229           8 :         memcpy(info->afpi_FinderInfo, type_creator, 8);
    3230           8 :         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
    3231           8 :         if (ret == false) {
    3232           0 :                 torture_result(tctx, TORTURE_FAIL,
    3233             :                                "(%s) torture_write_afpinfo() failed",
    3234             :                                __location__);
    3235           0 :                 goto done;
    3236             :         }
    3237             : 
    3238           8 :         ret = write_stream(tree, __location__, tctx, mem_ctx,
    3239             :                            fname, AFPRESOURCE_STREAM_NAME,
    3240             :                            0, 3, "foo");
    3241           8 :         if (ret == false) {
    3242           0 :                 torture_result(tctx, TORTURE_FAIL,
    3243             :                                "(%s) write_stream() failed",
    3244             :                                __location__);
    3245           0 :                 goto done;
    3246             :         }
    3247             : 
    3248             :         /*
    3249             :          * Ok, file is prepared, now call smb2/find
    3250             :          */
    3251             : 
    3252           8 :         ZERO_STRUCT(io);
    3253           8 :         io.in.desired_access = SEC_RIGHTS_DIR_READ;
    3254           8 :         io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
    3255           8 :         io.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY;
    3256           8 :         io.in.share_access = (NTCREATEX_SHARE_ACCESS_READ |
    3257             :                               NTCREATEX_SHARE_ACCESS_WRITE |
    3258             :                               NTCREATEX_SHARE_ACCESS_DELETE);
    3259           8 :         io.in.create_disposition = NTCREATEX_DISP_OPEN;
    3260           8 :         io.in.fname = BASEDIR;
    3261           8 :         status = smb2_create(tree, tctx, &io);
    3262           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3263             : 
    3264           8 :         ZERO_STRUCT(f);
    3265           8 :         f.in.file.handle        = io.out.file.handle;
    3266           8 :         f.in.pattern            = "test_aapl";
    3267           8 :         f.in.continue_flags     = SMB2_CONTINUE_FLAG_SINGLE;
    3268           8 :         f.in.max_response_size  = 0x1000;
    3269           8 :         f.in.level              = SMB2_FIND_ID_BOTH_DIRECTORY_INFO;
    3270             : 
    3271           8 :         status = smb2_find_level(tree, tree, &f, &count, &d);
    3272           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3273             : 
    3274           8 :         status = smb2_util_close(tree, io.out.file.handle);
    3275           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3276             : 
    3277           8 :         if (strcmp(d[0].id_both_directory_info.name.s, "test_aapl") != 0) {
    3278           0 :                 torture_result(tctx, TORTURE_FAIL,
    3279             :                                "(%s) write_stream() failed",
    3280             :                                __location__);
    3281           0 :                 ret = false;
    3282           0 :                 goto done;
    3283             :         }
    3284             : 
    3285           8 :         if (d[0].id_both_directory_info.short_name.private_length != 24) {
    3286           0 :                 torture_result(tctx, TORTURE_FAIL,
    3287             :                                "(%s) bad short_name length %" PRIu32 ", expected 24",
    3288           0 :                                __location__, d[0].id_both_directory_info.short_name.private_length);
    3289           0 :                 ret = false;
    3290           0 :                 goto done;
    3291             :         }
    3292             : 
    3293           8 :         torture_comment(tctx, "short_name buffer:\n");
    3294           8 :         dump_data(0, d[0].id_both_directory_info.short_name_buf, 24);
    3295             : 
    3296             :         /*
    3297             :          * Extract data as specified by the AAPL extension:
    3298             :          * - ea_size contains max_access
    3299             :          * - short_name contains resource fork length + FinderInfo
    3300             :          * - reserved2 contains the unix mode
    3301             :          */
    3302           8 :         torture_comment(tctx, "mac_access: %" PRIx32 "\n",
    3303           8 :                         d[0].id_both_directory_info.ea_size);
    3304             : 
    3305           8 :         rfork_len = BVAL(d[0].id_both_directory_info.short_name_buf, 0);
    3306           8 :         if (rfork_len != 3) {
    3307           0 :                 torture_result(tctx, TORTURE_FAIL,
    3308             :                                "(%s) expected resource fork length 3, got: %" PRIu64,
    3309             :                                __location__, rfork_len);
    3310           0 :                 ret = false;
    3311           0 :                 goto done;
    3312             :         }
    3313             : 
    3314           8 :         memcpy(type_creator_buf, d[0].id_both_directory_info.short_name_buf + 8, 8);
    3315           8 :         type_creator_buf[8] = 0;
    3316           8 :         if (strcmp(type_creator, type_creator_buf) != 0) {
    3317           0 :                 torture_result(tctx, TORTURE_FAIL,
    3318             :                                "(%s) expected type/creator \"%s\" , got: %s",
    3319             :                                __location__, type_creator, type_creator_buf);
    3320           0 :                 ret = false;
    3321           0 :                 goto done;
    3322             :         }
    3323             : 
    3324           8 : done:
    3325           8 :         smb2_util_unlink(tree, fname);
    3326           8 :         smb2_deltree(tree, BASEDIR);
    3327           8 :         talloc_free(mem_ctx);
    3328           8 :         return ret;
    3329             : }
    3330             : 
    3331       74240 : static uint64_t patt_hash(uint64_t off)
    3332             : {
    3333       74240 :         return off;
    3334             : }
    3335             : 
    3336          32 : static bool write_pattern(struct torture_context *torture,
    3337             :                           struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
    3338             :                           struct smb2_handle h, uint64_t off, uint64_t len,
    3339             :                           uint64_t patt_off)
    3340             : {
    3341           0 :         NTSTATUS status;
    3342           0 :         uint64_t i;
    3343           0 :         uint8_t *buf;
    3344          32 :         uint64_t io_sz = MIN(1024 * 64, len);
    3345             : 
    3346          32 :         if (len == 0) {
    3347           0 :                 return true;
    3348             :         }
    3349             : 
    3350          32 :         torture_assert(torture, (len % 8) == 0, "invalid write len");
    3351             : 
    3352          32 :         buf = talloc_zero_size(mem_ctx, io_sz);
    3353          32 :         torture_assert(torture, (buf != NULL), "no memory for file data buf");
    3354             : 
    3355          64 :         while (len > 0) {
    3356        8736 :                 for (i = 0; i <= io_sz - 8; i += 8) {
    3357        8704 :                         SBVAL(buf, i, patt_hash(patt_off));
    3358        8704 :                         patt_off += 8;
    3359             :                 }
    3360             : 
    3361          32 :                 status = smb2_util_write(tree, h,
    3362             :                                          buf, off, io_sz);
    3363          32 :                 torture_assert_ntstatus_ok(torture, status, "file write");
    3364             : 
    3365          32 :                 len -= io_sz;
    3366          32 :                 off += io_sz;
    3367             :         }
    3368             : 
    3369          32 :         talloc_free(buf);
    3370             : 
    3371          32 :         return true;
    3372             : }
    3373             : 
    3374          24 : static bool check_pattern(struct torture_context *torture,
    3375             :                           struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
    3376             :                           struct smb2_handle h, uint64_t off, uint64_t len,
    3377             :                           uint64_t patt_off)
    3378             : {
    3379          24 :         if (len == 0) {
    3380           0 :                 return true;
    3381             :         }
    3382             : 
    3383          24 :         torture_assert(torture, (len % 8) == 0, "invalid read len");
    3384             : 
    3385          48 :         while (len > 0) {
    3386           0 :                 uint64_t i;
    3387           0 :                 struct smb2_read r;
    3388           0 :                 NTSTATUS status;
    3389          24 :                 uint64_t io_sz = MIN(1024 * 64, len);
    3390             : 
    3391          24 :                 ZERO_STRUCT(r);
    3392          24 :                 r.in.file.handle = h;
    3393          24 :                 r.in.length      = io_sz;
    3394          24 :                 r.in.offset      = off;
    3395          24 :                 status = smb2_read(tree, mem_ctx, &r);
    3396          24 :                 torture_assert_ntstatus_ok(torture, status, "read");
    3397             : 
    3398          24 :                 torture_assert_u64_equal(torture, r.out.data.length, io_sz,
    3399             :                                          "read data len mismatch");
    3400             : 
    3401        4632 :                 for (i = 0; i <= io_sz - 8; i += 8, patt_off += 8) {
    3402        4608 :                         uint64_t data = BVAL(r.out.data.data, i);
    3403        4608 :                         torture_assert_u64_equal(torture, data, patt_hash(patt_off),
    3404             :                                                  talloc_asprintf(torture, "read data "
    3405             :                                                                  "pattern bad at %llu\n",
    3406             :                                                                  (unsigned long long)off + i));
    3407             :                 }
    3408          24 :                 talloc_free(r.out.data.data);
    3409          24 :                 len -= io_sz;
    3410          24 :                 off += io_sz;
    3411             :         }
    3412             : 
    3413          24 :         return true;
    3414             : }
    3415             : 
    3416          88 : static bool test_setup_open(struct torture_context *torture,
    3417             :                             struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
    3418             :                             const char *fname,
    3419             :                             struct smb2_handle *fh,
    3420             :                             uint32_t desired_access,
    3421             :                             uint32_t file_attributes)
    3422             : {
    3423           0 :         struct smb2_create io;
    3424           0 :         NTSTATUS status;
    3425             : 
    3426          88 :         ZERO_STRUCT(io);
    3427          88 :         io.in.desired_access = desired_access;
    3428          88 :         io.in.file_attributes = file_attributes;
    3429          88 :         io.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
    3430          88 :         io.in.share_access =
    3431             :                 NTCREATEX_SHARE_ACCESS_DELETE|
    3432             :                 NTCREATEX_SHARE_ACCESS_READ|
    3433             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    3434          88 :         if (file_attributes & FILE_ATTRIBUTE_DIRECTORY) {
    3435           0 :                 io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
    3436             :         }
    3437          88 :         io.in.fname = fname;
    3438             : 
    3439          88 :         status = smb2_create(tree, mem_ctx, &io);
    3440          88 :         torture_assert_ntstatus_ok(torture, status, "file create");
    3441             : 
    3442          88 :         *fh = io.out.file.handle;
    3443             : 
    3444          88 :         return true;
    3445             : }
    3446             : 
    3447          80 : static bool test_setup_create_fill(struct torture_context *torture,
    3448             :                                    struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
    3449             :                                    const char *fname,
    3450             :                                    struct smb2_handle *fh,
    3451             :                                    uint64_t size,
    3452             :                                    uint32_t desired_access,
    3453             :                                    uint32_t file_attributes)
    3454             : {
    3455           0 :         bool ok;
    3456             : 
    3457          80 :         ok = test_setup_open(torture, tree, mem_ctx,
    3458             :                              fname,
    3459             :                              fh,
    3460             :                              desired_access,
    3461             :                              file_attributes);
    3462          80 :         torture_assert(torture, ok, "file open");
    3463             : 
    3464          80 :         if (size > 0) {
    3465          32 :                 ok = write_pattern(torture, tree, mem_ctx, *fh, 0, size, 0);
    3466          32 :                 torture_assert(torture, ok, "write pattern");
    3467             :         }
    3468          80 :         return true;
    3469             : }
    3470             : 
    3471          40 : static bool test_setup_copy_chunk(struct torture_context *torture,
    3472             :                                   struct smb2_tree *tree, TALLOC_CTX *mem_ctx,
    3473             :                                   uint32_t nchunks,
    3474             :                                   const char *src_name,
    3475             :                                   struct smb2_handle *src_h,
    3476             :                                   uint64_t src_size,
    3477             :                                   uint32_t src_desired_access,
    3478             :                                   const char *dst_name,
    3479             :                                   struct smb2_handle *dest_h,
    3480             :                                   uint64_t dest_size,
    3481             :                                   uint32_t dest_desired_access,
    3482             :                                   struct srv_copychunk_copy *cc_copy,
    3483             :                                   union smb_ioctl *io)
    3484             : {
    3485           0 :         struct req_resume_key_rsp res_key;
    3486           0 :         bool ok;
    3487           0 :         NTSTATUS status;
    3488           0 :         enum ndr_err_code ndr_ret;
    3489             : 
    3490          40 :         ok = test_setup_create_fill(torture, tree, mem_ctx, src_name,
    3491             :                                     src_h, src_size, src_desired_access,
    3492             :                                     FILE_ATTRIBUTE_NORMAL);
    3493          40 :         torture_assert(torture, ok, "src file create fill");
    3494             : 
    3495          40 :         ok = test_setup_create_fill(torture, tree, mem_ctx, dst_name,
    3496             :                                     dest_h, dest_size, dest_desired_access,
    3497             :                                     FILE_ATTRIBUTE_NORMAL);
    3498          40 :         torture_assert(torture, ok, "dest file create fill");
    3499             : 
    3500          40 :         ZERO_STRUCTPN(io);
    3501          40 :         io->smb2.level = RAW_IOCTL_SMB2;
    3502          40 :         io->smb2.in.file.handle = *src_h;
    3503          40 :         io->smb2.in.function = FSCTL_SRV_REQUEST_RESUME_KEY;
    3504             :         /* Allow for Key + ContextLength + Context */
    3505          40 :         io->smb2.in.max_output_response = 32;
    3506          40 :         io->smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
    3507             : 
    3508          40 :         status = smb2_ioctl(tree, mem_ctx, &io->smb2);
    3509          40 :         torture_assert_ntstatus_ok(torture, status,
    3510             :                                    "FSCTL_SRV_REQUEST_RESUME_KEY");
    3511             : 
    3512          40 :         ndr_ret = ndr_pull_struct_blob(&io->smb2.out.out, mem_ctx, &res_key,
    3513             :                         (ndr_pull_flags_fn_t)ndr_pull_req_resume_key_rsp);
    3514             : 
    3515          40 :         torture_assert_ndr_success(torture, ndr_ret,
    3516             :                                    "ndr_pull_req_resume_key_rsp");
    3517             : 
    3518          40 :         ZERO_STRUCTPN(io);
    3519          40 :         io->smb2.level = RAW_IOCTL_SMB2;
    3520          40 :         io->smb2.in.file.handle = *dest_h;
    3521          40 :         io->smb2.in.function = FSCTL_SRV_COPYCHUNK;
    3522          40 :         io->smb2.in.max_output_response = sizeof(struct srv_copychunk_rsp);
    3523          40 :         io->smb2.in.flags = SMB2_IOCTL_FLAG_IS_FSCTL;
    3524             : 
    3525          40 :         ZERO_STRUCTPN(cc_copy);
    3526          40 :         memcpy(cc_copy->source_key, res_key.resume_key, ARRAY_SIZE(cc_copy->source_key));
    3527          40 :         cc_copy->chunk_count = nchunks;
    3528          40 :         cc_copy->chunks = talloc_zero_array(mem_ctx, struct srv_copychunk, nchunks);
    3529          40 :         torture_assert(torture, (cc_copy->chunks != NULL), "no memory for chunks");
    3530             : 
    3531          40 :         return true;
    3532             : }
    3533             : 
    3534             : 
    3535          40 : static bool check_copy_chunk_rsp(struct torture_context *torture,
    3536             :                                  struct srv_copychunk_rsp *cc_rsp,
    3537             :                                  uint32_t ex_chunks_written,
    3538             :                                  uint32_t ex_chunk_bytes_written,
    3539             :                                  uint32_t ex_total_bytes_written)
    3540             : {
    3541          40 :         torture_assert_int_equal(torture, cc_rsp->chunks_written,
    3542             :                                  ex_chunks_written, "num chunks");
    3543          40 :         torture_assert_int_equal(torture, cc_rsp->chunk_bytes_written,
    3544             :                                  ex_chunk_bytes_written, "chunk bytes written");
    3545          40 :         torture_assert_int_equal(torture, cc_rsp->total_bytes_written,
    3546             :                                  ex_total_bytes_written, "chunk total bytes");
    3547          40 :         return true;
    3548             : }
    3549             : 
    3550           8 : static bool neg_aapl_copyfile(struct torture_context *tctx,
    3551             :                               struct smb2_tree *tree,
    3552             :                               uint64_t flags)
    3553             : {
    3554           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    3555           8 :         const char *fname = "aapl";
    3556           0 :         NTSTATUS status;
    3557           0 :         struct smb2_create io;
    3558           0 :         DATA_BLOB data;
    3559           8 :         struct smb2_create_blob *aapl = NULL;
    3560           0 :         uint32_t aapl_cmd;
    3561           0 :         uint32_t aapl_reply_bitmap;
    3562           0 :         uint32_t aapl_server_caps;
    3563           8 :         bool ret = true;
    3564             : 
    3565           8 :         ZERO_STRUCT(io);
    3566           8 :         io.in.desired_access     = SEC_FLAG_MAXIMUM_ALLOWED;
    3567           8 :         io.in.file_attributes    = FILE_ATTRIBUTE_NORMAL;
    3568           8 :         io.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF;
    3569           8 :         io.in.share_access = (NTCREATEX_SHARE_ACCESS_DELETE |
    3570             :                               NTCREATEX_SHARE_ACCESS_READ |
    3571             :                               NTCREATEX_SHARE_ACCESS_WRITE);
    3572           8 :         io.in.fname = fname;
    3573             : 
    3574           8 :         data = data_blob_talloc(mem_ctx, NULL, 3 * sizeof(uint64_t));
    3575           8 :         SBVAL(data.data, 0, SMB2_CRTCTX_AAPL_SERVER_QUERY);
    3576           8 :         SBVAL(data.data, 8, (SMB2_CRTCTX_AAPL_SERVER_CAPS));
    3577           8 :         SBVAL(data.data, 16, flags);
    3578             : 
    3579           8 :         status = smb2_create_blob_add(tctx, &io.in.blobs, "AAPL", data);
    3580           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3581             : 
    3582           8 :         status = smb2_create(tree, tctx, &io);
    3583           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3584             : 
    3585           8 :         aapl = smb2_create_blob_find(&io.out.blobs,
    3586             :                                      SMB2_CREATE_TAG_AAPL);
    3587           8 :         if (aapl == NULL) {
    3588           0 :                 ret = false;
    3589           0 :                 goto done;
    3590             : 
    3591             :         }
    3592           8 :         if (aapl->data.length < 24) {
    3593           0 :                 ret = false;
    3594           0 :                 goto done;
    3595             :         }
    3596             : 
    3597           8 :         aapl_cmd = IVAL(aapl->data.data, 0);
    3598           8 :         if (aapl_cmd != SMB2_CRTCTX_AAPL_SERVER_QUERY) {
    3599           0 :                 torture_result(tctx, TORTURE_FAIL,
    3600             :                                "(%s) unexpected cmd: %d",
    3601             :                                __location__, (int)aapl_cmd);
    3602           0 :                 ret = false;
    3603           0 :                 goto done;
    3604             :         }
    3605             : 
    3606           8 :         aapl_reply_bitmap = BVAL(aapl->data.data, 8);
    3607           8 :         if (!(aapl_reply_bitmap & SMB2_CRTCTX_AAPL_SERVER_CAPS)) {
    3608           0 :                 torture_result(tctx, TORTURE_FAIL,
    3609             :                                "(%s) unexpected reply_bitmap: %d",
    3610             :                                __location__, (int)aapl_reply_bitmap);
    3611           0 :                 ret = false;
    3612           0 :                 goto done;
    3613             :         }
    3614             : 
    3615           8 :         aapl_server_caps = BVAL(aapl->data.data, 16);
    3616           8 :         if (!(aapl_server_caps & flags)) {
    3617           0 :                 torture_result(tctx, TORTURE_FAIL,
    3618             :                                "(%s) unexpected server_caps: %d",
    3619             :                                __location__, (int)aapl_server_caps);
    3620           0 :                 ret = false;
    3621           0 :                 goto done;
    3622             :         }
    3623             : 
    3624           8 : done:
    3625           8 :         status = smb2_util_close(tree, io.out.file.handle);
    3626           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3627             : 
    3628           8 :         smb2_util_unlink(tree, "aapl");
    3629           8 :         talloc_free(mem_ctx);
    3630           8 :         return ret;
    3631             : }
    3632             : 
    3633           8 : static bool test_copyfile(struct torture_context *torture,
    3634             :                           struct smb2_tree *tree)
    3635             : {
    3636           0 :         struct smb2_handle src_h;
    3637           0 :         struct smb2_handle dest_h;
    3638           0 :         NTSTATUS status;
    3639           0 :         union smb_ioctl io;
    3640           8 :         TALLOC_CTX *tmp_ctx = talloc_new(tree);
    3641           0 :         struct srv_copychunk_copy cc_copy;
    3642           0 :         struct srv_copychunk_rsp cc_rsp;
    3643           0 :         enum ndr_err_code ndr_ret;
    3644           0 :         bool ok;
    3645           8 :         const char *sname = ":foo" "\xef\x80\xa2" "bar:$DATA";
    3646             : 
    3647             :         /*
    3648             :          * First test a copy_chunk with a 0 chunk count without having
    3649             :          * enabled this via AAPL. The request must not fail and the
    3650             :          * copied length in the response must be 0. This is verified
    3651             :          * against Windows 2008r2.
    3652             :          */
    3653             : 
    3654           8 :         ok = test_setup_copy_chunk(torture, tree, tmp_ctx,
    3655             :                                    0, /* 0 chunks, copyfile semantics */
    3656             :                                    FNAME_CC_SRC,
    3657             :                                    &src_h, 4096, /* fill 4096 byte src file */
    3658             :                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
    3659             :                                    FNAME_CC_DST,
    3660             :                                    &dest_h, 0,      /* 0 byte dest file */
    3661             :                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
    3662             :                                    &cc_copy,
    3663             :                                    &io);
    3664           8 :         if (!ok) {
    3665           0 :                 torture_fail_goto(torture, done, "setup copy chunk error");
    3666             :         }
    3667             : 
    3668           8 :         ndr_ret = ndr_push_struct_blob(&io.smb2.in.out, tmp_ctx,
    3669             :                                        &cc_copy,
    3670             :                         (ndr_push_flags_fn_t)ndr_push_srv_copychunk_copy);
    3671           8 :         torture_assert_ndr_success(torture, ndr_ret,
    3672             :                                    "ndr_push_srv_copychunk_copy");
    3673             : 
    3674           8 :         status = smb2_ioctl(tree, tmp_ctx, &io.smb2);
    3675           8 :         torture_assert_ntstatus_ok_goto(torture, status, ok, done, "FSCTL_SRV_COPYCHUNK");
    3676             : 
    3677           8 :         ndr_ret = ndr_pull_struct_blob(&io.smb2.out.out, tmp_ctx,
    3678             :                                        &cc_rsp,
    3679             :                         (ndr_pull_flags_fn_t)ndr_pull_srv_copychunk_rsp);
    3680           8 :         torture_assert_ndr_success(torture, ndr_ret,
    3681             :                                    "ndr_pull_srv_copychunk_rsp");
    3682             : 
    3683           8 :         ok = check_copy_chunk_rsp(torture, &cc_rsp,
    3684             :                                   0,    /* chunks written */
    3685             :                                   0,    /* chunk bytes unsuccessfully written */
    3686             :                                   0); /* total bytes written */
    3687           8 :         if (!ok) {
    3688           0 :                 torture_fail_goto(torture, done, "bad copy chunk response data");
    3689             :         }
    3690             : 
    3691             :         /*
    3692             :          * Now enable AAPL copyfile and test again, the file and the
    3693             :          * stream must be copied by the server.
    3694             :          */
    3695           8 :         ok = neg_aapl_copyfile(torture, tree,
    3696             :                                SMB2_CRTCTX_AAPL_SUPPORTS_OSX_COPYFILE);
    3697           8 :         if (!ok) {
    3698           0 :                 torture_skip_goto(torture, done, "missing AAPL copyfile");
    3699             :                 goto done;
    3700             :         }
    3701             : 
    3702           8 :         smb2_util_close(tree, src_h);
    3703           8 :         smb2_util_close(tree, dest_h);
    3704           8 :         smb2_util_unlink(tree, FNAME_CC_SRC);
    3705           8 :         smb2_util_unlink(tree, FNAME_CC_DST);
    3706             : 
    3707           8 :         ok = torture_setup_file(tmp_ctx, tree, FNAME_CC_SRC, false);
    3708           8 :         if (!ok) {
    3709           0 :                 torture_fail(torture, "setup file error");
    3710             :         }
    3711           8 :         ok = write_stream(tree, __location__, torture, tmp_ctx,
    3712             :                             FNAME_CC_SRC, AFPRESOURCE_STREAM,
    3713             :                             10, 10, "1234567890");
    3714           8 :         if (!ok) {
    3715           0 :                 torture_fail(torture, "setup stream error");
    3716             :         }
    3717             : 
    3718           8 :         ok = write_stream(tree, __location__, torture, tmp_ctx,
    3719             :                             FNAME_CC_SRC, sname,
    3720             :                             10, 10, "abcdefghij");
    3721           8 :         torture_assert_goto(torture, ok == true, ok, done, "write_stream failed\n");
    3722             : 
    3723           8 :         ok = test_setup_copy_chunk(torture, tree, tmp_ctx,
    3724             :                                    0, /* 0 chunks, copyfile semantics */
    3725             :                                    FNAME_CC_SRC,
    3726             :                                    &src_h, 4096, /* fill 4096 byte src file */
    3727             :                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
    3728             :                                    FNAME_CC_DST,
    3729             :                                    &dest_h, 0,      /* 0 byte dest file */
    3730             :                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
    3731             :                                    &cc_copy,
    3732             :                                    &io);
    3733           8 :         if (!ok) {
    3734           0 :                 torture_fail_goto(torture, done, "setup copy chunk error");
    3735             :         }
    3736             : 
    3737           8 :         ndr_ret = ndr_push_struct_blob(&io.smb2.in.out, tmp_ctx,
    3738             :                                        &cc_copy,
    3739             :                         (ndr_push_flags_fn_t)ndr_push_srv_copychunk_copy);
    3740           8 :         torture_assert_ndr_success(torture, ndr_ret,
    3741             :                                    "ndr_push_srv_copychunk_copy");
    3742             : 
    3743           8 :         status = smb2_ioctl(tree, tmp_ctx, &io.smb2);
    3744           8 :         torture_assert_ntstatus_ok_goto(torture, status, ok, done, "FSCTL_SRV_COPYCHUNK");
    3745             : 
    3746           8 :         ndr_ret = ndr_pull_struct_blob(&io.smb2.out.out, tmp_ctx,
    3747             :                                        &cc_rsp,
    3748             :                         (ndr_pull_flags_fn_t)ndr_pull_srv_copychunk_rsp);
    3749           8 :         torture_assert_ndr_success(torture, ndr_ret,
    3750             :                                    "ndr_pull_srv_copychunk_rsp");
    3751             : 
    3752           8 :         ok = check_copy_chunk_rsp(torture, &cc_rsp,
    3753             :                                   0,    /* chunks written */
    3754             :                                   0,    /* chunk bytes unsuccessfully written */
    3755             :                                   4096); /* total bytes written */
    3756           8 :         if (!ok) {
    3757           0 :                 torture_fail_goto(torture, done, "bad copy chunk response data");
    3758             :         }
    3759             : 
    3760           8 :         ok = test_setup_open(torture, tree, tmp_ctx, FNAME_CC_DST, &dest_h,
    3761             :                              SEC_FILE_READ_DATA, FILE_ATTRIBUTE_NORMAL);
    3762           8 :         if (!ok) {
    3763           0 :                 torture_fail_goto(torture, done,"open failed");
    3764             :         }
    3765           8 :         ok = check_pattern(torture, tree, tmp_ctx, dest_h, 0, 4096, 0);
    3766           8 :         if (!ok) {
    3767           0 :                 torture_fail_goto(torture, done, "inconsistent file data");
    3768             :         }
    3769             : 
    3770           8 :         ok = check_stream(tree, __location__, torture, tmp_ctx,
    3771             :                             FNAME_CC_DST, AFPRESOURCE_STREAM,
    3772             :                             0, 20, 10, 10, "1234567890");
    3773           8 :         if (!ok) {
    3774           0 :                 torture_fail_goto(torture, done, "inconsistent stream data");
    3775             :         }
    3776             : 
    3777           8 :         ok = check_stream(tree, __location__, torture, tmp_ctx,
    3778             :                             FNAME_CC_DST, sname,
    3779             :                             0, 20, 10, 10, "abcdefghij");
    3780           8 :         torture_assert_goto(torture, ok == true, ok, done, "check_stream failed\n");
    3781             : 
    3782           8 : done:
    3783           8 :         smb2_util_close(tree, src_h);
    3784           8 :         smb2_util_close(tree, dest_h);
    3785           8 :         smb2_util_unlink(tree, FNAME_CC_SRC);
    3786           8 :         smb2_util_unlink(tree, FNAME_CC_DST);
    3787           8 :         talloc_free(tmp_ctx);
    3788           8 :         return true;
    3789             : }
    3790             : 
    3791        1492 : static bool check_stream_list(struct smb2_tree *tree,
    3792             :                               struct torture_context *tctx,
    3793             :                               const char *fname,
    3794             :                               int num_exp,
    3795             :                               const char **exp,
    3796             :                               bool is_dir)
    3797             : {
    3798        1492 :         bool ret = true;
    3799           0 :         union smb_fileinfo finfo;
    3800           0 :         NTSTATUS status;
    3801           0 :         int i;
    3802        1492 :         TALLOC_CTX *tmp_ctx = talloc_new(tctx);
    3803           0 :         char **exp_sort;
    3804           0 :         struct stream_struct *stream_sort;
    3805           0 :         struct smb2_create create;
    3806           0 :         struct smb2_handle h;
    3807             : 
    3808        1492 :         ZERO_STRUCT(h);
    3809        1492 :         torture_assert_goto(tctx, tmp_ctx != NULL, ret, done, "talloc_new failed");
    3810             : 
    3811        1492 :         ZERO_STRUCT(create);
    3812        1492 :         create.in.fname = fname;
    3813        1492 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    3814        1492 :         create.in.desired_access = SEC_FILE_ALL;
    3815        1492 :         create.in.create_options = is_dir ? NTCREATEX_OPTIONS_DIRECTORY : 0;
    3816        1492 :         create.in.file_attributes = is_dir ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
    3817        1492 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    3818        1492 :         status = smb2_create(tree, tmp_ctx, &create);
    3819        1492 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create");
    3820        1492 :         h = create.out.file.handle;
    3821             : 
    3822        1492 :         finfo.generic.level = RAW_FILEINFO_STREAM_INFORMATION;
    3823        1492 :         finfo.generic.in.file.handle = h;
    3824             : 
    3825        1492 :         status = smb2_getinfo_file(tree, tctx, &finfo);
    3826        1492 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "get stream info");
    3827             : 
    3828        1492 :         smb2_util_close(tree, h);
    3829             : 
    3830        1492 :         torture_assert_int_equal_goto(tctx, finfo.stream_info.out.num_streams, num_exp,
    3831             :                                       ret, done, "stream count");
    3832             : 
    3833        1490 :         if (num_exp == 0) {
    3834           0 :                 TALLOC_FREE(tmp_ctx);
    3835           0 :                 goto done;
    3836             :         }
    3837             : 
    3838        1490 :         exp_sort = talloc_memdup(tmp_ctx, exp, num_exp * sizeof(*exp));
    3839        1490 :         torture_assert_goto(tctx, exp_sort != NULL, ret, done, __location__);
    3840             : 
    3841        1490 :         TYPESAFE_QSORT(exp_sort, num_exp, qsort_string);
    3842             : 
    3843        1490 :         stream_sort = talloc_memdup(tmp_ctx, finfo.stream_info.out.streams,
    3844             :                                     finfo.stream_info.out.num_streams *
    3845             :                                     sizeof(*stream_sort));
    3846        1490 :         torture_assert_goto(tctx, stream_sort != NULL, ret, done, __location__);
    3847             : 
    3848        1490 :         TYPESAFE_QSORT(stream_sort, finfo.stream_info.out.num_streams, qsort_stream);
    3849             : 
    3850        3480 :         for (i=0; i<num_exp; i++) {
    3851        1990 :                 torture_comment(tctx, "i[%d] exp[%s] got[%s]\n",
    3852        1990 :                                 i, exp_sort[i], stream_sort[i].stream_name.s);
    3853        1990 :                 torture_assert_str_equal_goto(tctx, stream_sort[i].stream_name.s, exp_sort[i],
    3854             :                                               ret, done, "stream name");
    3855             :         }
    3856             : 
    3857        1490 : done:
    3858        1492 :         TALLOC_FREE(tmp_ctx);
    3859        1492 :         return ret;
    3860             : }
    3861             : 
    3862         288 : static bool check_stream_list_handle(struct smb2_tree *tree,
    3863             :                                      struct torture_context *tctx,
    3864             :                                      struct smb2_handle h,
    3865             :                                      int num_exp,
    3866             :                                      const char **exp,
    3867             :                                      bool is_dir)
    3868             : {
    3869         288 :         bool ret = true;
    3870           0 :         union smb_fileinfo finfo;
    3871           0 :         NTSTATUS status;
    3872           0 :         int i;
    3873         288 :         TALLOC_CTX *tmp_ctx = talloc_new(tctx);
    3874           0 :         char **exp_sort;
    3875           0 :         struct stream_struct *stream_sort;
    3876             : 
    3877         288 :         torture_assert_goto(tctx, tmp_ctx != NULL, ret, done,
    3878             :                             "talloc_new failed\n");
    3879             : 
    3880         288 :         finfo = (union smb_fileinfo) {
    3881             :                 .stream_info.level = RAW_FILEINFO_STREAM_INFORMATION,
    3882             :                 .stream_info.in.file.handle = h,
    3883             :         };
    3884             : 
    3885         288 :         status = smb2_getinfo_file(tree, tctx, &finfo);
    3886         288 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    3887             :                                         "get stream info\n");
    3888             : 
    3889         288 :         torture_assert_int_equal_goto(tctx, finfo.stream_info.out.num_streams,
    3890             :                                       num_exp, ret, done, "stream count\n");
    3891             : 
    3892         288 :         if (num_exp == 0) {
    3893           0 :                 TALLOC_FREE(tmp_ctx);
    3894           0 :                 goto done;
    3895             :         }
    3896             : 
    3897         288 :         exp_sort = talloc_memdup(tmp_ctx, exp, num_exp * sizeof(*exp));
    3898         288 :         torture_assert_goto(tctx, exp_sort != NULL, ret, done, __location__);
    3899             : 
    3900         288 :         TYPESAFE_QSORT(exp_sort, num_exp, qsort_string);
    3901             : 
    3902         288 :         stream_sort = talloc_memdup(tmp_ctx, finfo.stream_info.out.streams,
    3903             :                                     finfo.stream_info.out.num_streams *
    3904             :                                     sizeof(*stream_sort));
    3905         288 :         torture_assert_goto(tctx, stream_sort != NULL, ret, done, __location__);
    3906             : 
    3907         288 :         TYPESAFE_QSORT(stream_sort, finfo.stream_info.out.num_streams, qsort_stream);
    3908             : 
    3909         672 :         for (i=0; i<num_exp; i++) {
    3910         384 :                 torture_comment(tctx, "i[%d] exp[%s] got[%s]\n",
    3911         384 :                                 i, exp_sort[i], stream_sort[i].stream_name.s);
    3912         384 :                 torture_assert_str_equal_goto(tctx, stream_sort[i].stream_name.s,
    3913             :                                               exp_sort[i], ret, done,
    3914             :                                               "stream name\n");
    3915             :         }
    3916             : 
    3917         288 : done:
    3918         288 :         TALLOC_FREE(tmp_ctx);
    3919         288 :         return ret;
    3920             : }
    3921             : 
    3922             : /*
    3923             :   test stream names
    3924             : */
    3925           8 : static bool test_stream_names(struct torture_context *tctx,
    3926             :                               struct smb2_tree *tree)
    3927             : {
    3928           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    3929           0 :         NTSTATUS status;
    3930           0 :         struct smb2_create create;
    3931           0 :         struct smb2_handle h;
    3932           8 :         const char *fname = BASEDIR "\\stream_names.txt";
    3933           0 :         const char *sname1;
    3934           0 :         bool ret;
    3935             :         /* UTF8 private use are starts at 0xef 0x80 0x80 (0xf000) */
    3936           8 :         const char *streams[] = {
    3937             :                 ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */
    3938             :                 "::$DATA"
    3939             :         };
    3940             : 
    3941           8 :         sname1 = talloc_asprintf(mem_ctx, "%s%s", fname, streams[0]);
    3942             : 
    3943             :         /* clean slate ...*/
    3944           8 :         smb2_util_unlink(tree, fname);
    3945           8 :         smb2_deltree(tree, fname);
    3946           8 :         smb2_deltree(tree, BASEDIR);
    3947             : 
    3948           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h);
    3949           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3950           8 :         smb2_util_close(tree, h);
    3951             : 
    3952           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    3953           8 :         torture_assert_goto(tctx, ret, ret, done, "torture_setup_file");
    3954             : 
    3955           8 :         torture_comment(tctx, "(%s) testing stream names\n", __location__);
    3956           8 :         ZERO_STRUCT(create);
    3957           8 :         create.in.desired_access = SEC_FILE_WRITE_DATA;
    3958           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    3959           8 :         create.in.share_access =
    3960             :                 NTCREATEX_SHARE_ACCESS_DELETE|
    3961             :                 NTCREATEX_SHARE_ACCESS_READ|
    3962             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    3963           8 :         create.in.create_disposition = NTCREATEX_DISP_CREATE;
    3964           8 :         create.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
    3965           8 :         create.in.fname = sname1;
    3966             : 
    3967           8 :         status = smb2_create(tree, mem_ctx, &create);
    3968           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    3969             : 
    3970           8 :         status = smb2_util_write(tree, create.out.file.handle, "foo", 0, 3);
    3971           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    3972             :                                         "smb2_util_write failed\n");
    3973             : 
    3974           8 :         smb2_util_close(tree, create.out.file.handle);
    3975             : 
    3976           8 :         ret = check_stream_list(tree, tctx, fname, 2, streams, false);
    3977           8 :         CHECK_VALUE(ret, true);
    3978             : 
    3979           8 : done:
    3980           8 :         status = smb2_util_unlink(tree, fname);
    3981           8 :         smb2_deltree(tree, BASEDIR);
    3982           8 :         talloc_free(mem_ctx);
    3983             : 
    3984           8 :         return ret;
    3985             : }
    3986             : 
    3987             : /* Renaming a directory with open file, should work for OS X AAPL clients */
    3988           8 : static bool test_rename_dir_openfile(struct torture_context *torture,
    3989             :                                      struct smb2_tree *tree)
    3990             : {
    3991           8 :         bool ret = true;
    3992           0 :         NTSTATUS status;
    3993           0 :         union smb_open io;
    3994           0 :         union smb_close cl;
    3995           0 :         union smb_setfileinfo sinfo;
    3996           0 :         struct smb2_handle d1, h1;
    3997           8 :         const char *renamedir = BASEDIR "-new";
    3998           8 :         bool server_is_osx = torture_setting_bool(torture, "osx", false);
    3999             : 
    4000           8 :         smb2_deltree(tree, BASEDIR);
    4001           8 :         smb2_util_rmdir(tree, BASEDIR);
    4002           8 :         smb2_deltree(tree, renamedir);
    4003             : 
    4004           8 :         ZERO_STRUCT(io.smb2);
    4005           8 :         io.generic.level = RAW_OPEN_SMB2;
    4006           8 :         io.smb2.in.create_flags = 0;
    4007           8 :         io.smb2.in.desired_access = 0x0017019f;
    4008           8 :         io.smb2.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
    4009           8 :         io.smb2.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY;
    4010           8 :         io.smb2.in.share_access = 0;
    4011           8 :         io.smb2.in.alloc_size = 0;
    4012           8 :         io.smb2.in.create_disposition = NTCREATEX_DISP_CREATE;
    4013           8 :         io.smb2.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
    4014           8 :         io.smb2.in.security_flags = 0;
    4015           8 :         io.smb2.in.fname = BASEDIR;
    4016             : 
    4017           8 :         status = smb2_create(tree, torture, &(io.smb2));
    4018           8 :         torture_assert_ntstatus_ok(torture, status, "smb2_create dir");
    4019           8 :         d1 = io.smb2.out.file.handle;
    4020             : 
    4021           8 :         ZERO_STRUCT(io.smb2);
    4022           8 :         io.generic.level = RAW_OPEN_SMB2;
    4023           8 :         io.smb2.in.create_flags = 0;
    4024           8 :         io.smb2.in.desired_access = 0x0017019f;
    4025           8 :         io.smb2.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE;
    4026           8 :         io.smb2.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4027           8 :         io.smb2.in.share_access = 0;
    4028           8 :         io.smb2.in.alloc_size = 0;
    4029           8 :         io.smb2.in.create_disposition = NTCREATEX_DISP_CREATE;
    4030           8 :         io.smb2.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
    4031           8 :         io.smb2.in.security_flags = 0;
    4032           8 :         io.smb2.in.fname = BASEDIR "\\file.txt";
    4033             : 
    4034           8 :         status = smb2_create(tree, torture, &(io.smb2));
    4035           8 :         torture_assert_ntstatus_ok(torture, status, "smb2_create file");
    4036           8 :         h1 = io.smb2.out.file.handle;
    4037             : 
    4038           8 :         if (!server_is_osx) {
    4039           8 :                 torture_comment(torture, "Renaming directory without AAPL, must fail\n");
    4040             : 
    4041           8 :                 ZERO_STRUCT(sinfo);
    4042           8 :                 sinfo.rename_information.level = RAW_SFILEINFO_RENAME_INFORMATION;
    4043           8 :                 sinfo.rename_information.in.file.handle = d1;
    4044           8 :                 sinfo.rename_information.in.overwrite = 0;
    4045           8 :                 sinfo.rename_information.in.root_fid = 0;
    4046           8 :                 sinfo.rename_information.in.new_name = renamedir;
    4047           8 :                 status = smb2_setinfo_file(tree, &sinfo);
    4048             : 
    4049           8 :                 torture_assert_ntstatus_equal(torture, status,
    4050             :                                               NT_STATUS_ACCESS_DENIED,
    4051             :                                               "smb2_setinfo_file");
    4052             :         }
    4053             : 
    4054           8 :         status = smb2_util_close(tree, d1);
    4055           8 :         torture_assert_ntstatus_ok(torture, status, "smb2_util_close\n");
    4056           8 :         ZERO_STRUCT(d1);
    4057             : 
    4058           8 :         torture_comment(torture, "Enabling AAPL\n");
    4059             : 
    4060           8 :         ret = enable_aapl(torture, tree);
    4061           8 :         torture_assert(torture, ret == true, "enable_aapl failed");
    4062             : 
    4063           8 :         torture_comment(torture, "Renaming directory with AAPL\n");
    4064             : 
    4065           8 :         ZERO_STRUCT(io.smb2);
    4066           8 :         io.generic.level = RAW_OPEN_SMB2;
    4067           8 :         io.smb2.in.desired_access = 0x0017019f;
    4068           8 :         io.smb2.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY;
    4069           8 :         io.smb2.in.share_access = 0;
    4070           8 :         io.smb2.in.alloc_size = 0;
    4071           8 :         io.smb2.in.create_disposition = NTCREATEX_DISP_OPEN;
    4072           8 :         io.smb2.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
    4073           8 :         io.smb2.in.security_flags = 0;
    4074           8 :         io.smb2.in.fname = BASEDIR;
    4075             : 
    4076           8 :         status = smb2_create(tree, torture, &(io.smb2));
    4077           8 :         torture_assert_ntstatus_ok(torture, status, "smb2_create dir");
    4078           8 :         d1 = io.smb2.out.file.handle;
    4079             : 
    4080           8 :         ZERO_STRUCT(sinfo);
    4081           8 :         sinfo.rename_information.level = RAW_SFILEINFO_RENAME_INFORMATION;
    4082           8 :         sinfo.rename_information.in.file.handle = d1;
    4083           8 :         sinfo.rename_information.in.overwrite = 0;
    4084           8 :         sinfo.rename_information.in.root_fid = 0;
    4085           8 :         sinfo.rename_information.in.new_name = renamedir;
    4086             : 
    4087           8 :         status = smb2_setinfo_file(tree, &sinfo);
    4088           8 :         torture_assert_ntstatus_ok(torture, status, "smb2_setinfo_file");
    4089             : 
    4090           8 :         ZERO_STRUCT(cl.smb2);
    4091           8 :         cl.smb2.level = RAW_CLOSE_SMB2;
    4092           8 :         cl.smb2.in.file.handle = d1;
    4093           8 :         status = smb2_close(tree, &(cl.smb2));
    4094           8 :         torture_assert_ntstatus_ok(torture, status, "smb2_close");
    4095           8 :         ZERO_STRUCT(d1);
    4096             : 
    4097           8 :         cl.smb2.in.file.handle = h1;
    4098           8 :         status = smb2_close(tree, &(cl.smb2));
    4099           8 :         torture_assert_ntstatus_ok(torture, status, "smb2_close");
    4100           8 :         ZERO_STRUCT(h1);
    4101             : 
    4102           8 :         torture_comment(torture, "Cleaning up\n");
    4103             : 
    4104           8 :         if (h1.data[0] || h1.data[1]) {
    4105           0 :                 ZERO_STRUCT(cl.smb2);
    4106           0 :                 cl.smb2.level = RAW_CLOSE_SMB2;
    4107           0 :                 cl.smb2.in.file.handle = h1;
    4108           0 :                 status = smb2_close(tree, &(cl.smb2));
    4109             :         }
    4110             : 
    4111           8 :         smb2_util_unlink(tree, BASEDIR "\\file.txt");
    4112           8 :         smb2_util_unlink(tree, BASEDIR "-new\\file.txt");
    4113           8 :         smb2_deltree(tree, renamedir);
    4114           8 :         smb2_deltree(tree, BASEDIR);
    4115           8 :         return ret;
    4116             : }
    4117             : 
    4118           8 : static bool test_afpinfo_enoent(struct torture_context *tctx,
    4119             :                                 struct smb2_tree *tree)
    4120             : {
    4121           8 :         bool ret = true;
    4122           0 :         NTSTATUS status;
    4123           0 :         struct smb2_create create;
    4124           0 :         struct smb2_handle h1;
    4125           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    4126           8 :         const char *fname = BASEDIR "\\file";
    4127           8 :         const char *sname = BASEDIR "\\file" AFPINFO_STREAM_NAME;
    4128             : 
    4129           8 :         torture_comment(tctx, "Opening file without AFP_AfpInfo\n");
    4130             : 
    4131           8 :         smb2_deltree(tree, BASEDIR);
    4132           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    4133           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
    4134           8 :         smb2_util_close(tree, h1);
    4135           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    4136           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    4137             : 
    4138           8 :         torture_comment(tctx, "Opening not existing AFP_AfpInfo\n");
    4139             : 
    4140           8 :         ZERO_STRUCT(create);
    4141           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4142           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE; /* stat open */
    4143           8 :         create.in.fname = sname;
    4144             : 
    4145           8 :         status = smb2_create(tree, mem_ctx, &create);
    4146           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    4147             :                                            ret, done, "Got unexpected AFP_AfpInfo stream");
    4148             : 
    4149           8 : done:
    4150           8 :         smb2_util_unlink(tree, fname);
    4151           8 :         smb2_util_rmdir(tree, BASEDIR);
    4152           8 :         return ret;
    4153             : }
    4154             : 
    4155           8 : static bool test_create_delete_on_close(struct torture_context *tctx,
    4156             :                                         struct smb2_tree *tree)
    4157             : {
    4158           8 :         bool ret = true;
    4159           0 :         NTSTATUS status;
    4160           0 :         struct smb2_create create;
    4161           0 :         struct smb2_handle h1;
    4162           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    4163           8 :         const char *fname = BASEDIR "\\file";
    4164           8 :         const char *sname = BASEDIR "\\file" AFPINFO_STREAM_NAME;
    4165           8 :         const char *type_creator = "SMB,OLE!";
    4166           8 :         AfpInfo *info = NULL;
    4167           8 :         const char *streams_basic[] = {
    4168             :                 "::$DATA"
    4169             :         };
    4170           8 :         const char *streams_afpinfo[] = {
    4171             :                 "::$DATA",
    4172             :                 AFPINFO_STREAM
    4173             :         };
    4174             : 
    4175           8 :         torture_assert_goto(tctx, mem_ctx != NULL, ret, done, "talloc_new");
    4176             : 
    4177           8 :         torture_comment(tctx, "Checking whether create with delete-on-close work with AFP_AfpInfo\n");
    4178             : 
    4179           8 :         smb2_deltree(tree, BASEDIR);
    4180           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    4181           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
    4182           8 :         smb2_util_close(tree, h1);
    4183           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    4184           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    4185             : 
    4186           8 :         torture_comment(tctx, "Opening not existing AFP_AfpInfo\n");
    4187             : 
    4188           8 :         ZERO_STRUCT(create);
    4189           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4190           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE; /* stat open */
    4191           8 :         create.in.fname = sname;
    4192             : 
    4193           8 :         status = smb2_create(tree, mem_ctx, &create);
    4194           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    4195             :                                            ret, done, "Got unexpected AFP_AfpInfo stream");
    4196             : 
    4197           8 :         ZERO_STRUCT(create);
    4198           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4199           8 :         create.in.desired_access = SEC_FILE_ALL;
    4200           8 :         create.in.fname = sname;
    4201             : 
    4202           8 :         status = smb2_create(tree, mem_ctx, &create);
    4203           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    4204             :                                            ret, done, "Got unexpected AFP_AfpInfo stream");
    4205             : 
    4206           8 :         ret = check_stream_list(tree, tctx, fname, 1, streams_basic, false);
    4207           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4208             : 
    4209           8 :         torture_comment(tctx, "Deleting AFP_AfpInfo via create with delete-on-close\n");
    4210             : 
    4211           8 :         info = torture_afpinfo_new(mem_ctx);
    4212           8 :         torture_assert_goto(tctx, info != NULL, ret, done, "torture_afpinfo_new failed");
    4213             : 
    4214           8 :         memcpy(info->afpi_FinderInfo, type_creator, 8);
    4215           8 :         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
    4216           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_write_afpinfo failed");
    4217             : 
    4218           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    4219             :                            0, 60, 16, 8, type_creator);
    4220           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad type/creator in AFP_AfpInfo");
    4221             : 
    4222           8 :         ret = check_stream_list(tree, tctx, fname, 2, streams_afpinfo, false);
    4223           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4224             : 
    4225           8 :         ZERO_STRUCT(create);
    4226           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4227           8 :         create.in.create_options = NTCREATEX_OPTIONS_DELETE_ON_CLOSE;
    4228           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE | SEC_STD_SYNCHRONIZE | SEC_STD_DELETE;
    4229           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4230           8 :         create.in.fname = sname;
    4231           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4232             : 
    4233           8 :         status = smb2_create(tree, mem_ctx, &create);
    4234           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    4235             : 
    4236           8 :         h1 = create.out.file.handle;
    4237           8 :         smb2_util_close(tree, h1);
    4238             : 
    4239           8 :         ZERO_STRUCT(create);
    4240           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4241           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE;
    4242           8 :         create.in.fname = sname;
    4243           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4244           8 :         status = smb2_create(tree, mem_ctx, &create);
    4245           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    4246             :                                            ret, done, "Got unexpected AFP_AfpInfo stream");
    4247             : 
    4248           8 :         ret = check_stream_list(tree, tctx, fname, 1, streams_basic, false);
    4249           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4250             : 
    4251           8 : done:
    4252           8 :         smb2_util_unlink(tree, fname);
    4253           8 :         smb2_util_rmdir(tree, BASEDIR);
    4254           8 :         return ret;
    4255             : }
    4256             : 
    4257           8 : static bool test_setinfo_delete_on_close(struct torture_context *tctx,
    4258             :                                          struct smb2_tree *tree)
    4259             : {
    4260           8 :         bool ret = true;
    4261           0 :         NTSTATUS status;
    4262           0 :         struct smb2_create create;
    4263           0 :         union smb_setfileinfo sfinfo;
    4264           0 :         struct smb2_handle h1;
    4265           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    4266           8 :         const char *fname = BASEDIR "\\file";
    4267           8 :         const char *sname = BASEDIR "\\file" AFPINFO_STREAM_NAME;
    4268           8 :         const char *type_creator = "SMB,OLE!";
    4269           8 :         AfpInfo *info = NULL;
    4270           8 :         const char *streams[] = {
    4271             :                 AFPINFO_STREAM,
    4272             :                 "::$DATA"
    4273             :         };
    4274           8 :         const char *streams_basic[] = {
    4275             :                 "::$DATA"
    4276             :         };
    4277             : 
    4278           8 :         torture_assert_goto(tctx, mem_ctx != NULL, ret, done, "talloc_new");
    4279             : 
    4280           8 :         torture_comment(tctx, "Deleting AFP_AfpInfo via setinfo with delete-on-close\n");
    4281             : 
    4282           8 :         smb2_deltree(tree, BASEDIR);
    4283           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    4284           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
    4285           8 :         smb2_util_close(tree, h1);
    4286           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    4287           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    4288             : 
    4289           8 :         info = torture_afpinfo_new(mem_ctx);
    4290           8 :         torture_assert_goto(tctx, info != NULL, ret, done, "torture_afpinfo_new failed");
    4291           8 :         memcpy(info->afpi_FinderInfo, type_creator, 8);
    4292           8 :         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
    4293           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_write_afpinfo failed");
    4294             : 
    4295           8 :         ZERO_STRUCT(create);
    4296           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4297           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE | SEC_STD_SYNCHRONIZE | SEC_STD_DELETE;
    4298           8 :         create.in.fname = sname;
    4299           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4300           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4301             : 
    4302           8 :         status = smb2_create(tree, mem_ctx, &create);
    4303           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    4304             : 
    4305           8 :         h1 = create.out.file.handle;
    4306             : 
    4307             :         /* Delete stream via setinfo delete-on-close */
    4308           8 :         ZERO_STRUCT(sfinfo);
    4309           8 :         sfinfo.disposition_info.in.delete_on_close = 1;
    4310           8 :         sfinfo.generic.level = RAW_SFILEINFO_DISPOSITION_INFORMATION;
    4311           8 :         sfinfo.generic.in.file.handle = h1;
    4312           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    4313           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "set delete-on-close failed");
    4314             : 
    4315           8 :         ret = check_stream_list(tree, tctx, fname, 2, streams, false);
    4316           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4317             : 
    4318           8 :         ZERO_STRUCT(create);
    4319           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4320           8 :         create.in.desired_access = SEC_FILE_ALL;
    4321           8 :         create.in.fname = sname;
    4322           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4323           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4324           8 :         status = smb2_create(tree, mem_ctx, &create);
    4325           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_DELETE_PENDING,
    4326             :                                            ret, done, "Got unexpected AFP_AfpInfo stream");
    4327             : 
    4328           8 :         smb2_util_close(tree, h1);
    4329             : 
    4330           8 :         ret = check_stream_list(tree, tctx, fname, 1, streams_basic, false);
    4331           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4332             : 
    4333           8 :         ZERO_STRUCT(create);
    4334           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4335           8 :         create.in.desired_access = SEC_FILE_ALL;
    4336           8 :         create.in.fname = sname;
    4337           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4338           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4339           8 :         status = smb2_create(tree, mem_ctx, &create);
    4340           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    4341             :                                            ret, done, "Got unexpected AFP_AfpInfo stream");
    4342             : 
    4343           8 : done:
    4344           8 :         smb2_util_unlink(tree, fname);
    4345           8 :         smb2_util_rmdir(tree, BASEDIR);
    4346           8 :         return ret;
    4347             : }
    4348             : 
    4349           8 : static bool test_setinfo_eof(struct torture_context *tctx,
    4350             :                              struct smb2_tree *tree)
    4351             : {
    4352           8 :         bool ret = true;
    4353           0 :         NTSTATUS status;
    4354           0 :         struct smb2_create create;
    4355           0 :         union smb_setfileinfo sfinfo;
    4356           0 :         struct smb2_handle h1;
    4357           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    4358           8 :         const char *fname = BASEDIR "\\file";
    4359           8 :         const char *sname = BASEDIR "\\file" AFPINFO_STREAM_NAME;
    4360           8 :         const char *type_creator = "SMB,OLE!";
    4361           8 :         AfpInfo *info = NULL;
    4362           8 :         const char *streams_afpinfo[] = {
    4363             :                 "::$DATA",
    4364             :                 AFPINFO_STREAM
    4365             :         };
    4366             : 
    4367           8 :         torture_assert_goto(tctx, mem_ctx != NULL, ret, done, "talloc_new");
    4368             : 
    4369           8 :         torture_comment(tctx, "Set AFP_AfpInfo EOF to 61, 1 and 0\n");
    4370             : 
    4371           8 :         smb2_deltree(tree, BASEDIR);
    4372           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    4373           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
    4374           8 :         smb2_util_close(tree, h1);
    4375           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    4376           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    4377             : 
    4378           8 :         info = torture_afpinfo_new(mem_ctx);
    4379           8 :         torture_assert_goto(tctx, info != NULL, ret, done, "torture_afpinfo_new failed");
    4380           8 :         memcpy(info->afpi_FinderInfo, type_creator, 8);
    4381           8 :         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
    4382           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_write_afpinfo failed");
    4383             : 
    4384           8 :         ZERO_STRUCT(create);
    4385           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4386           8 :         create.in.desired_access = SEC_FILE_ALL;
    4387           8 :         create.in.fname = sname;
    4388           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4389           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4390             : 
    4391           8 :         status = smb2_create(tree, mem_ctx, &create);
    4392           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    4393             : 
    4394           8 :         h1 = create.out.file.handle;
    4395             : 
    4396           8 :         torture_comment(tctx, "Set AFP_AfpInfo EOF to 61\n");
    4397             : 
    4398             :         /* Test setinfo end-of-file info */
    4399           8 :         ZERO_STRUCT(sfinfo);
    4400           8 :         sfinfo.generic.in.file.handle = h1;
    4401           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    4402           8 :         sfinfo.position_information.in.position = 61;
    4403           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    4404           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_ALLOTTED_SPACE_EXCEEDED,
    4405             :                                            ret, done, "set eof 61 failed");
    4406             : 
    4407           8 :         torture_comment(tctx, "Set AFP_AfpInfo EOF to 1\n");
    4408             : 
    4409             :         /* Truncation returns success, but has no effect */
    4410           8 :         ZERO_STRUCT(sfinfo);
    4411           8 :         sfinfo.generic.in.file.handle = h1;
    4412           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    4413           8 :         sfinfo.position_information.in.position = 1;
    4414           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    4415           8 :         torture_assert_ntstatus_ok_goto(tctx, status,
    4416             :                                         ret, done, "set eof 1 failed");
    4417           8 :         smb2_util_close(tree, h1);
    4418             : 
    4419           8 :         ret = check_stream_list(tree, tctx, fname, 2, streams_afpinfo, false);
    4420           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4421             : 
    4422           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    4423             :                            0, 60, 16, 8, type_creator);
    4424           8 :         torture_assert_goto(tctx, ret == true, ret, done, "FinderInfo changed");
    4425             : 
    4426           8 :         ZERO_STRUCT(create);
    4427           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4428           8 :         create.in.desired_access = SEC_FILE_ALL;
    4429           8 :         create.in.fname = sname;
    4430           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4431           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4432             : 
    4433           8 :         status = smb2_create(tree, mem_ctx, &create);
    4434           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    4435             : 
    4436           8 :         h1 = create.out.file.handle;
    4437             : 
    4438             :         /*
    4439             :          * Delete stream via setinfo end-of-file info to 0, should
    4440             :          * return success but stream MUST NOT deleted
    4441             :          */
    4442           8 :         ZERO_STRUCT(sfinfo);
    4443           8 :         sfinfo.generic.in.file.handle = h1;
    4444           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    4445           8 :         sfinfo.position_information.in.position = 0;
    4446           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    4447           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "set eof 0 failed");
    4448             : 
    4449           8 :         smb2_util_close(tree, h1);
    4450             : 
    4451           8 :         ret = check_stream_list(tree, tctx, fname, 2, streams_afpinfo, false);
    4452           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4453             : 
    4454           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    4455             :                            0, 60, 16, 8, type_creator);
    4456           8 :         torture_assert_goto(tctx, ret == true, ret, done, "FinderInfo changed");
    4457             : 
    4458           8 : done:
    4459           8 :         smb2_util_unlink(tree, fname);
    4460           8 :         smb2_util_rmdir(tree, BASEDIR);
    4461           8 :         return ret;
    4462             : }
    4463             : 
    4464           8 : static bool test_afpinfo_all0(struct torture_context *tctx,
    4465             :                               struct smb2_tree *tree)
    4466             : {
    4467           8 :         bool ret = true;
    4468           0 :         NTSTATUS status;
    4469           0 :         struct smb2_create create;
    4470           8 :         struct smb2_handle h1 = {{0}};
    4471           8 :         struct smb2_handle baseh = {{0}};
    4472           0 :         union smb_setfileinfo setfinfo;
    4473           0 :         union smb_fileinfo getfinfo;
    4474           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    4475           8 :         const char *fname = BASEDIR "\\file";
    4476           8 :         const char *sname = BASEDIR "\\file" AFPINFO_STREAM;
    4477           8 :         const char *type_creator = "SMB,OLE!";
    4478           8 :         AfpInfo *info = NULL;
    4479           8 :         char *infobuf = NULL;
    4480           8 :         const char *streams_basic[] = {
    4481             :                 "::$DATA"
    4482             :         };
    4483           8 :         const char *streams_afpinfo[] = {
    4484             :                 "::$DATA",
    4485             :                 AFPINFO_STREAM
    4486             :         };
    4487             : 
    4488           8 :         torture_assert_goto(tctx, mem_ctx != NULL, ret, done, "talloc_new");
    4489             : 
    4490           8 :         torture_comment(tctx, "Write all 0 to AFP_AfpInfo and see what happens\n");
    4491             : 
    4492           8 :         smb2_deltree(tree, BASEDIR);
    4493           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    4494           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
    4495           8 :         smb2_util_close(tree, h1);
    4496           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    4497           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    4498             : 
    4499           8 :         info = torture_afpinfo_new(mem_ctx);
    4500           8 :         torture_assert_goto(tctx, info != NULL, ret, done, "torture_afpinfo_new failed");
    4501           8 :         memcpy(info->afpi_FinderInfo, type_creator, 8);
    4502           8 :         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
    4503           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_write_afpinfo failed");
    4504             : 
    4505           8 :         ret = check_stream_list(tree, tctx, fname, 2, streams_afpinfo, false);
    4506           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4507             : 
    4508             :         /* Write all 0 to AFP_AfpInfo */
    4509           8 :         memset(info->afpi_FinderInfo, 0, AFP_FinderSize);
    4510           8 :         infobuf = torture_afpinfo_pack(mem_ctx, info);
    4511           8 :         torture_assert_not_null_goto(tctx, infobuf, ret, done,
    4512             :                                      "torture_afpinfo_pack failed\n");
    4513             : 
    4514           8 :         ZERO_STRUCT(create);
    4515           8 :         create.in.desired_access = SEC_FILE_ALL;
    4516           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4517           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4518           8 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    4519           8 :         create.in.fname = fname;
    4520             : 
    4521           8 :         status = smb2_create(tree, mem_ctx, &create);
    4522           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    4523             :                                         "smb2_create failed\n");
    4524           8 :         baseh = create.out.file.handle;
    4525             : 
    4526           8 :         ZERO_STRUCT(create);
    4527           8 :         create.in.desired_access = SEC_FILE_ALL;
    4528           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4529           8 :         create.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF;
    4530           8 :         create.in.fname = sname;
    4531             : 
    4532           8 :         status = smb2_create(tree, mem_ctx, &create);
    4533           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    4534             :                                         "smb2_create failed\n");
    4535           8 :         h1 = create.out.file.handle;
    4536             : 
    4537           8 :         status = smb2_util_write(tree, h1, infobuf, 0, AFP_INFO_SIZE);
    4538           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    4539             :                                         "smb2_util_write failed\n");
    4540             : 
    4541             :         /*
    4542             :          * Get stream information on open handle, must return only default
    4543             :          * stream, the AFP_AfpInfo stream must not be returned.
    4544             :          */
    4545             : 
    4546           8 :         ZERO_STRUCT(getfinfo);
    4547           8 :         getfinfo.generic.level = RAW_FILEINFO_STREAM_INFORMATION;
    4548           8 :         getfinfo.generic.in.file.handle = baseh;
    4549             : 
    4550           8 :         status = smb2_getinfo_file(tree, tctx, &getfinfo);
    4551           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    4552             :                                         "get stream info\n");
    4553             : 
    4554           8 :         torture_assert_int_equal_goto(tctx, getfinfo.stream_info.out.num_streams,
    4555             :                                       1, ret, done, "stream count");
    4556             : 
    4557           8 :         smb2_util_close(tree, baseh);
    4558           8 :         ZERO_STRUCT(baseh);
    4559             : 
    4560             :         /*
    4561             :          * Try to set some file-basic-info (time) on the stream. This catches
    4562             :          * naive implementation mistakes that simply deleted the backing store
    4563             :          * from the filesystem in the zero-out step.
    4564             :          */
    4565             : 
    4566           8 :         ZERO_STRUCT(setfinfo);
    4567           8 :         unix_to_nt_time(&setfinfo.basic_info.in.write_time, time(NULL));
    4568           8 :         setfinfo.basic_info.in.attrib = 0x20;
    4569           8 :         setfinfo.generic.level = RAW_SFILEINFO_BASIC_INFORMATION;
    4570           8 :         setfinfo.generic.in.file.handle = h1;
    4571             : 
    4572           8 :         status = smb2_setinfo_file(tree, &setfinfo);
    4573           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    4574             :                                         "smb2_getinfo_file failed\n");
    4575             : 
    4576           8 :         ret = check_stream_list(tree, tctx, fname, 1, streams_basic, false);
    4577           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream_list");
    4578             : 
    4579           8 :         smb2_util_close(tree, h1);
    4580           8 :         ZERO_STRUCT(h1);
    4581             : 
    4582           8 :         ret = check_stream_list(tree, tctx, fname, 1, streams_basic, false);
    4583           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4584             : 
    4585           8 : done:
    4586           8 :         if (!smb2_util_handle_empty(h1)) {
    4587           0 :                 smb2_util_close(tree, h1);
    4588             :         }
    4589           8 :         if (!smb2_util_handle_empty(baseh)) {
    4590           0 :                 smb2_util_close(tree, baseh);
    4591             :         }
    4592           8 :         smb2_util_unlink(tree, fname);
    4593           8 :         smb2_util_rmdir(tree, BASEDIR);
    4594           8 :         return ret;
    4595             : }
    4596             : 
    4597           8 : static bool test_create_delete_on_close_resource(struct torture_context *tctx,
    4598             :                                                  struct smb2_tree *tree)
    4599             : {
    4600           8 :         bool ret = true;
    4601           0 :         NTSTATUS status;
    4602           0 :         struct smb2_create create;
    4603           0 :         struct smb2_handle h1;
    4604           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    4605           8 :         const char *fname = BASEDIR "\\file";
    4606           8 :         const char *sname = BASEDIR "\\file" AFPRESOURCE_STREAM_NAME;
    4607           8 :         const char *streams_basic[] = {
    4608             :                 "::$DATA"
    4609             :         };
    4610           8 :         const char *streams_afpresource[] = {
    4611             :                 "::$DATA",
    4612             :                 AFPRESOURCE_STREAM
    4613             :         };
    4614             : 
    4615           8 :         torture_assert_goto(tctx, mem_ctx != NULL, ret, done, "talloc_new");
    4616             : 
    4617           8 :         torture_comment(tctx, "Checking whether create with delete-on-close is ignored for AFP_AfpResource\n");
    4618             : 
    4619           8 :         smb2_deltree(tree, BASEDIR);
    4620           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    4621           8 :         torture_assert_ntstatus_ok(tctx, status, "torture_smb2_testdir");
    4622           8 :         smb2_util_close(tree, h1);
    4623           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    4624           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    4625             : 
    4626           8 :         torture_comment(tctx, "Opening not existing AFP_AfpResource\n");
    4627             : 
    4628           8 :         ZERO_STRUCT(create);
    4629           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4630           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE; /* stat open */
    4631           8 :         create.in.fname = sname;
    4632             : 
    4633           8 :         status = smb2_create(tree, mem_ctx, &create);
    4634           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    4635             :                                            ret, done, "Got unexpected AFP_AfpResource stream");
    4636             : 
    4637           8 :         ZERO_STRUCT(create);
    4638           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4639           8 :         create.in.desired_access = SEC_FILE_ALL;
    4640           8 :         create.in.fname = sname;
    4641             : 
    4642           8 :         status = smb2_create(tree, mem_ctx, &create);
    4643           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    4644             :                                            ret, done, "Got unexpected AFP_AfpResource stream");
    4645             : 
    4646           8 :         ret = check_stream_list(tree, tctx, fname, 1, streams_basic, false);
    4647           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4648             : 
    4649           8 :         torture_comment(tctx, "Trying to delete AFP_AfpResource via create with delete-on-close\n");
    4650             : 
    4651           8 :         ret = write_stream(tree, __location__, tctx, mem_ctx,
    4652             :                            fname, AFPRESOURCE_STREAM_NAME,
    4653             :                            0, 10, "1234567890");
    4654           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Writing to AFP_AfpResource failed");
    4655             : 
    4656           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPRESOURCE_STREAM_NAME,
    4657             :                            0, 10, 0, 10, "1234567890");
    4658           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad content from AFP_AfpResource");
    4659             : 
    4660           8 :         ret = check_stream_list(tree, tctx, fname, 2, streams_afpresource, false);
    4661           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4662             : 
    4663           8 :         ZERO_STRUCT(create);
    4664           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4665           8 :         create.in.create_options = NTCREATEX_OPTIONS_DELETE_ON_CLOSE;
    4666           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE | SEC_STD_SYNCHRONIZE | SEC_STD_DELETE;
    4667           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4668           8 :         create.in.fname = sname;
    4669           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4670             : 
    4671           8 :         status = smb2_create(tree, mem_ctx, &create);
    4672           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    4673             : 
    4674           8 :         h1 = create.out.file.handle;
    4675           8 :         smb2_util_close(tree, h1);
    4676             : 
    4677           8 :         ret = check_stream_list(tree, tctx, fname, 2, streams_afpresource, false);
    4678           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4679             : 
    4680           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPRESOURCE_STREAM_NAME,
    4681             :                            0, 10, 0, 10, "1234567890");
    4682           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad content from AFP_AfpResource");
    4683             : 
    4684           8 : done:
    4685           8 :         smb2_util_unlink(tree, fname);
    4686           8 :         smb2_util_rmdir(tree, BASEDIR);
    4687           8 :         return ret;
    4688             : }
    4689             : 
    4690           8 : static bool test_setinfo_delete_on_close_resource(struct torture_context *tctx,
    4691             :                                                   struct smb2_tree *tree)
    4692             : {
    4693           8 :         bool ret = true;
    4694           0 :         NTSTATUS status;
    4695           0 :         struct smb2_create create;
    4696           0 :         union smb_setfileinfo sfinfo;
    4697           0 :         struct smb2_handle h1;
    4698           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    4699           8 :         const char *fname = BASEDIR "\\file";
    4700           8 :         const char *sname = BASEDIR "\\file" AFPRESOURCE_STREAM_NAME;
    4701           8 :         const char *streams_afpresource[] = {
    4702             :                 "::$DATA",
    4703             :                 AFPRESOURCE_STREAM
    4704             :         };
    4705             : 
    4706           8 :         torture_assert_goto(tctx, mem_ctx != NULL, ret, done, "talloc_new");
    4707             : 
    4708           8 :         torture_comment(tctx, "Trying to delete AFP_AfpResource via setinfo with delete-on-close\n");
    4709             : 
    4710           8 :         smb2_deltree(tree, BASEDIR);
    4711           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    4712           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
    4713           8 :         smb2_util_close(tree, h1);
    4714           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    4715           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    4716             : 
    4717           8 :         ret = write_stream(tree, __location__, tctx, mem_ctx,
    4718             :                            fname, AFPRESOURCE_STREAM_NAME,
    4719             :                            10, 10, "1234567890");
    4720           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Writing to AFP_AfpResource failed");
    4721             : 
    4722           8 :         ZERO_STRUCT(create);
    4723           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4724           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE | SEC_STD_SYNCHRONIZE | SEC_STD_DELETE;
    4725           8 :         create.in.fname = sname;
    4726           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4727           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4728             : 
    4729           8 :         status = smb2_create(tree, mem_ctx, &create);
    4730           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    4731             : 
    4732           8 :         h1 = create.out.file.handle;
    4733             : 
    4734             :         /* Try to delete stream via setinfo delete-on-close */
    4735           8 :         ZERO_STRUCT(sfinfo);
    4736           8 :         sfinfo.disposition_info.in.delete_on_close = 1;
    4737           8 :         sfinfo.generic.level = RAW_SFILEINFO_DISPOSITION_INFORMATION;
    4738           8 :         sfinfo.generic.in.file.handle = h1;
    4739           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    4740           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "set delete-on-close failed");
    4741             : 
    4742           8 :         smb2_util_close(tree, h1);
    4743             : 
    4744           8 :         ret = check_stream_list(tree, tctx, fname, 2, streams_afpresource, false);
    4745           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4746             : 
    4747           8 :         ZERO_STRUCT(create);
    4748           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4749           8 :         create.in.desired_access = SEC_FILE_ALL;
    4750           8 :         create.in.fname = sname;
    4751           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4752           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4753           8 :         status = smb2_create(tree, mem_ctx, &create);
    4754           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    4755             :                                         "Got unexpected AFP_AfpResource stream");
    4756             : 
    4757           8 : done:
    4758           8 :         smb2_util_unlink(tree, fname);
    4759           8 :         smb2_util_rmdir(tree, BASEDIR);
    4760           8 :         return ret;
    4761             : }
    4762             : 
    4763           8 : static bool test_setinfo_eof_resource(struct torture_context *tctx,
    4764             :                                       struct smb2_tree *tree)
    4765             : {
    4766           8 :         bool ret = true;
    4767           0 :         NTSTATUS status;
    4768           0 :         struct smb2_create create;
    4769           0 :         union smb_setfileinfo sfinfo;
    4770           0 :         union smb_fileinfo finfo;
    4771           0 :         struct smb2_handle h1;
    4772           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    4773           8 :         const char *fname = BASEDIR "\\file";
    4774           8 :         const char *sname = BASEDIR "\\file" AFPRESOURCE_STREAM_NAME;
    4775           8 :         const char *streams_basic[] = {
    4776             :                 "::$DATA"
    4777             :         };
    4778             : 
    4779           8 :         torture_assert_goto(tctx, mem_ctx != NULL, ret, done, "talloc_new");
    4780             : 
    4781           8 :         ret = enable_aapl(tctx, tree);
    4782           8 :         torture_assert_goto(tctx, ret == true, ret, done, "enable_aapl failed");
    4783             : 
    4784           8 :         torture_comment(tctx, "Set AFP_AfpResource EOF to 1 and 0\n");
    4785             : 
    4786           8 :         smb2_deltree(tree, BASEDIR);
    4787           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    4788           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir");
    4789           8 :         smb2_util_close(tree, h1);
    4790           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    4791           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    4792             : 
    4793           8 :         ret = write_stream(tree, __location__, tctx, mem_ctx,
    4794             :                            fname, AFPRESOURCE_STREAM_NAME,
    4795             :                            10, 10, "1234567890");
    4796           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Writing to AFP_AfpResource failed");
    4797             : 
    4798           8 :         ZERO_STRUCT(create);
    4799           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4800           8 :         create.in.desired_access = SEC_FILE_ALL;
    4801           8 :         create.in.fname = sname;
    4802           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4803           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4804             : 
    4805           8 :         status = smb2_create(tree, mem_ctx, &create);
    4806           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    4807             : 
    4808           8 :         h1 = create.out.file.handle;
    4809             : 
    4810           8 :         torture_comment(tctx, "Set AFP_AfpResource EOF to 1\n");
    4811             : 
    4812             :         /* Test setinfo end-of-file info */
    4813           8 :         ZERO_STRUCT(sfinfo);
    4814           8 :         sfinfo.generic.in.file.handle = h1;
    4815           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    4816           8 :         sfinfo.position_information.in.position = 1;
    4817           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    4818           8 :         torture_assert_ntstatus_ok_goto(tctx, status,
    4819             :                                         ret, done, "set eof 1 failed");
    4820             : 
    4821           8 :         smb2_util_close(tree, h1);
    4822             : 
    4823             :         /* Check size == 1 */
    4824           8 :         ZERO_STRUCT(create);
    4825           8 :         create.in.fname = sname;
    4826           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4827           8 :         create.in.desired_access = SEC_FILE_ALL;
    4828           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4829           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4830           8 :         status = smb2_create(tree, mem_ctx, &create);
    4831           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    4832             : 
    4833           8 :         h1 = create.out.file.handle;
    4834             : 
    4835           8 :         ZERO_STRUCT(finfo);
    4836           8 :         finfo.generic.level = RAW_FILEINFO_SMB2_ALL_INFORMATION;
    4837           8 :         finfo.generic.in.file.handle = h1;
    4838           8 :         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
    4839           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_getinfo_file failed");
    4840             : 
    4841           8 :         smb2_util_close(tree, h1);
    4842             : 
    4843           8 :         torture_assert_goto(tctx, finfo.all_info.out.size == 1, ret, done, "size != 1");
    4844             : 
    4845           8 :         ZERO_STRUCT(create);
    4846           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4847           8 :         create.in.desired_access = SEC_FILE_ALL;
    4848           8 :         create.in.fname = sname;
    4849           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4850           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4851             : 
    4852           8 :         status = smb2_create(tree, mem_ctx, &create);
    4853           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    4854             : 
    4855           8 :         h1 = create.out.file.handle;
    4856             : 
    4857             :         /*
    4858             :          * Delete stream via setinfo end-of-file info to 0, this
    4859             :          * should delete the stream.
    4860             :          */
    4861           8 :         ZERO_STRUCT(sfinfo);
    4862           8 :         sfinfo.generic.in.file.handle = h1;
    4863           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    4864           8 :         sfinfo.position_information.in.position = 0;
    4865           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    4866           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "set eof 0 failed");
    4867             : 
    4868           8 :         smb2_util_close(tree, h1);
    4869             : 
    4870           8 :         ret = check_stream_list(tree, tctx, fname, 1, streams_basic, false);
    4871           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    4872             : 
    4873           8 :         ZERO_STRUCT(create);
    4874           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    4875           8 :         create.in.desired_access = SEC_FILE_ALL;
    4876           8 :         create.in.fname = sname;
    4877           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4878           8 :         create.in.impersonation_level = NTCREATEX_IMPERSONATION_IMPERSONATION;
    4879             : 
    4880           8 :         status = smb2_create(tree, mem_ctx, &create);
    4881           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    4882             :                                            ret, done, "smb2_create failed");
    4883             : 
    4884           8 : done:
    4885           8 :         smb2_util_unlink(tree, fname);
    4886           8 :         smb2_util_rmdir(tree, BASEDIR);
    4887           8 :         return ret;
    4888             : }
    4889             : 
    4890             : /*
    4891             :  * This tests that right after creating the AFP_AfpInfo stream,
    4892             :  * reading from the stream returns an empty, default metadata blob of
    4893             :  * 60 bytes.
    4894             :  *
    4895             :  * NOTE: against OS X SMB server this only works if the read request
    4896             :  * is compounded with the create that created the stream, is fails
    4897             :  * otherwise. We don't care...
    4898             :  */
    4899           8 : static bool test_null_afpinfo(struct torture_context *tctx,
    4900             :                               struct smb2_tree *tree)
    4901             : {
    4902           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    4903           8 :         const char *fname = "test_null_afpinfo";
    4904           8 :         const char *sname = "test_null_afpinfo" AFPINFO_STREAM_NAME;
    4905           0 :         NTSTATUS status;
    4906           8 :         bool ret = true;
    4907           0 :         struct smb2_request *req[3];
    4908           0 :         struct smb2_handle handle;
    4909           0 :         struct smb2_create create;
    4910           0 :         struct smb2_read read;
    4911           8 :         AfpInfo *afpinfo = NULL;
    4912           8 :         char *afpinfo_buf = NULL;
    4913           8 :         const char *type_creator = "SMB,OLE!";
    4914           0 :         struct smb2_handle handle2;
    4915           0 :         struct smb2_read r;
    4916             : 
    4917           8 :         torture_comment(tctx, "Checking create of AfpInfo stream\n");
    4918             : 
    4919           8 :         smb2_util_unlink(tree, fname);
    4920             : 
    4921           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    4922           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file failed");
    4923             : 
    4924           8 :         ZERO_STRUCT(create);
    4925           8 :         create.in.desired_access = SEC_FILE_READ_DATA|SEC_FILE_WRITE_DATA;
    4926           8 :         create.in.share_access = FILE_SHARE_READ | FILE_SHARE_DELETE;
    4927           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    4928           8 :         create.in.impersonation_level = SMB2_IMPERSONATION_IMPERSONATION;
    4929           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
    4930           8 :         create.in.fname = sname;
    4931             : 
    4932           8 :         smb2_transport_compound_start(tree->session->transport, 2);
    4933             : 
    4934           8 :         req[0] = smb2_create_send(tree, &create);
    4935             : 
    4936           8 :         handle.data[0] = UINT64_MAX;
    4937           8 :         handle.data[1] = UINT64_MAX;
    4938             : 
    4939           8 :         smb2_transport_compound_set_related(tree->session->transport, true);
    4940             : 
    4941           8 :         ZERO_STRUCT(read);
    4942           8 :         read.in.file.handle = handle;
    4943           8 :         read.in.length = AFP_INFO_SIZE;
    4944           8 :         req[1] = smb2_read_send(tree, &read);
    4945             : 
    4946           8 :         status = smb2_create_recv(req[0], tree, &create);
    4947           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create_recv failed");
    4948             : 
    4949           8 :         handle = create.out.file.handle;
    4950             : 
    4951           8 :         status = smb2_read_recv(req[1], tree, &read);
    4952           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_read_recv failed");
    4953             : 
    4954           8 :         status = torture_smb2_testfile_access(tree, sname, &handle2,
    4955             :                                               SEC_FILE_READ_DATA);
    4956           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    4957             :                                         "torture_smb2_testfile failed\n");
    4958           8 :         r = (struct smb2_read) {
    4959             :                 .in.file.handle = handle2,
    4960             :                 .in.length      = AFP_INFO_SIZE,
    4961             :         };
    4962             : 
    4963           8 :         status = smb2_read(tree, tree, &r);
    4964           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    4965             :                                         "torture_smb2_testfile failed\n");
    4966           8 :         smb2_util_close(tree, handle2);
    4967             : 
    4968           8 :         afpinfo = torture_afpinfo_new(mem_ctx);
    4969           8 :         torture_assert_goto(tctx, afpinfo != NULL, ret, done, "torture_afpinfo_new failed");
    4970             : 
    4971           8 :         memcpy(afpinfo->afpi_FinderInfo, type_creator, 8);
    4972             : 
    4973           8 :         afpinfo_buf = torture_afpinfo_pack(tctx, afpinfo);
    4974           8 :         torture_assert_goto(tctx, afpinfo_buf != NULL, ret, done, "torture_afpinfo_new failed");
    4975             : 
    4976           8 :         status = smb2_util_write(tree, handle, afpinfo_buf, 0, AFP_INFO_SIZE);
    4977           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_util_write failed");
    4978             : 
    4979           8 :         smb2_util_close(tree, handle);
    4980             : 
    4981           8 :         ret = check_stream(tree, __location__, tctx, mem_ctx, fname, AFPINFO_STREAM,
    4982             :                            0, 60, 16, 8, type_creator);
    4983           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    4984             : 
    4985           8 : done:
    4986           8 :         smb2_util_unlink(tree, fname);
    4987           8 :         talloc_free(mem_ctx);
    4988           8 :         return ret;
    4989             : }
    4990             : 
    4991           8 : static bool test_delete_file_with_rfork(struct torture_context *tctx,
    4992             :                                         struct smb2_tree *tree)
    4993             : {
    4994           8 :         const char *fname = "torture_write_rfork_io";
    4995           8 :         const char *rfork_content = "1234567890";
    4996           0 :         NTSTATUS status;
    4997           8 :         bool ret = true;
    4998             : 
    4999           8 :         smb2_util_unlink(tree, fname);
    5000             : 
    5001           8 :         torture_comment(tctx, "Test deleting file with resource fork\n");
    5002             : 
    5003           8 :         ret = torture_setup_file(tctx, tree, fname, false);
    5004           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file failed\n");
    5005             : 
    5006           8 :         ret = write_stream(tree, __location__, tctx, tctx,
    5007             :                            fname, AFPRESOURCE_STREAM_NAME,
    5008             :                            10, 10, rfork_content);
    5009           8 :         torture_assert_goto(tctx, ret == true, ret, done, "write_stream failed\n");
    5010             : 
    5011           8 :         ret = check_stream(tree, __location__, tctx, tctx,
    5012             :                            fname, AFPRESOURCE_STREAM_NAME,
    5013             :                            0, 20, 10, 10, rfork_content);
    5014           8 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed\n");
    5015             : 
    5016           8 :         status = smb2_util_unlink(tree, fname);
    5017           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "check_stream failed\n");
    5018             : 
    5019           8 : done:
    5020           8 :         return ret;
    5021             : }
    5022             : 
    5023           8 : static bool test_rename_and_read_rsrc(struct torture_context *tctx,
    5024             :                                       struct smb2_tree *tree)
    5025             : {
    5026           8 :         bool ret = true;
    5027           0 :         NTSTATUS status;
    5028           0 :         struct smb2_create create, create2;
    5029           0 :         struct smb2_handle h1, h2;
    5030           8 :         const char *fname = "test_rename_openfile";
    5031           8 :         const char *sname = "test_rename_openfile" AFPRESOURCE_STREAM_NAME;
    5032           8 :         const char *fname_renamed = "test_rename_openfile_renamed";
    5033           8 :         const char *data = "1234567890";
    5034           0 :         union smb_setfileinfo sinfo;
    5035           8 :         bool server_is_macos = torture_setting_bool(tctx, "osx", false);
    5036           0 :         NTSTATUS expected_status;
    5037             : 
    5038           8 :         ret = enable_aapl(tctx, tree);
    5039           8 :         torture_assert_goto(tctx, ret == true, ret, done, "enable_aapl failed");
    5040             : 
    5041           8 :         torture_comment(tctx, "Create file with resource fork\n");
    5042             : 
    5043           8 :         ret = torture_setup_file(tctx, tree, fname, false);
    5044           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    5045             : 
    5046           8 :         ret = write_stream(tree, __location__, tctx, tctx,
    5047             :                            fname, AFPRESOURCE_STREAM_NAME, 0, 10, data);
    5048           8 :         torture_assert_goto(tctx, ret == true, ret, done, "write_stream failed");
    5049             : 
    5050           8 :         torture_comment(tctx, "Open resource fork\n");
    5051             : 
    5052           8 :         ZERO_STRUCT(create);
    5053           8 :         create.in.desired_access = SEC_FILE_ALL;
    5054           8 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    5055           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    5056           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    5057           8 :         create.in.impersonation_level = SMB2_IMPERSONATION_IMPERSONATION;
    5058           8 :         create.in.fname = sname;
    5059             : 
    5060           8 :         status = smb2_create(tree, tctx, &create);
    5061           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    5062             : 
    5063           8 :         h1 = create.out.file.handle;
    5064             : 
    5065           8 :         torture_comment(tctx, "Rename base file\n");
    5066             : 
    5067           8 :         ZERO_STRUCT(create2);
    5068           8 :         create2.in.desired_access = SEC_FILE_ALL;
    5069           8 :         create2.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    5070           8 :         create2.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    5071           8 :         create2.in.create_disposition = NTCREATEX_DISP_OPEN;
    5072           8 :         create2.in.impersonation_level = SMB2_IMPERSONATION_IMPERSONATION;
    5073           8 :         create2.in.fname = fname;
    5074             : 
    5075           8 :         status = smb2_create(tree, tctx, &create2);
    5076           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    5077             : 
    5078           8 :         h2 = create2.out.file.handle;
    5079             : 
    5080           8 :         ZERO_STRUCT(sinfo);
    5081           8 :         sinfo.rename_information.level = RAW_SFILEINFO_RENAME_INFORMATION;
    5082           8 :         sinfo.rename_information.in.file.handle = h2;
    5083           8 :         sinfo.rename_information.in.overwrite = 0;
    5084           8 :         sinfo.rename_information.in.root_fid = 0;
    5085           8 :         sinfo.rename_information.in.new_name = fname_renamed;
    5086             : 
    5087           8 :         if (server_is_macos) {
    5088           0 :                 expected_status = NT_STATUS_SHARING_VIOLATION;
    5089             :         } else {
    5090           8 :                 expected_status = NT_STATUS_ACCESS_DENIED;
    5091             :         }
    5092             : 
    5093           8 :         status = smb2_setinfo_file(tree, &sinfo);
    5094           8 :         torture_assert_ntstatus_equal_goto(
    5095             :                 tctx, status, expected_status, ret, done,
    5096             :                 "smb2_setinfo_file failed");
    5097             : 
    5098           8 :         smb2_util_close(tree, h2);
    5099             : 
    5100           8 :         status = smb2_util_write(tree, h1, "foo", 0, 3);
    5101           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    5102             :                                         "write failed\n");
    5103             : 
    5104           8 :         smb2_util_close(tree, h1);
    5105             : 
    5106           8 : done:
    5107           8 :         smb2_util_unlink(tree, fname);
    5108           8 :         smb2_util_unlink(tree, fname_renamed);
    5109             : 
    5110           8 :         return ret;
    5111             : }
    5112             : 
    5113           8 : static bool test_readdir_attr_illegal_ntfs(struct torture_context *tctx,
    5114             :                                            struct smb2_tree *tree)
    5115             : {
    5116           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    5117           8 :         const char *name = "test" "\xef\x80\xa2" "aapl"; /* "test:aapl" */
    5118           8 :         const char *fname = BASEDIR "\\test" "\xef\x80\xa2" "aapl"; /* "test:aapl" */
    5119           0 :         NTSTATUS status;
    5120           0 :         struct smb2_handle testdirh;
    5121           8 :         bool ret = true;
    5122           0 :         struct smb2_create io;
    5123           0 :         AfpInfo *info;
    5124           8 :         const char *type_creator = "SMB,OLE!";
    5125           0 :         struct smb2_find f;
    5126           0 :         unsigned int count;
    5127           0 :         union smb_search_data *d;
    5128           0 :         uint64_t rfork_len;
    5129           0 :         unsigned int i;
    5130             : 
    5131           8 :         smb2_deltree(tree, BASEDIR);
    5132             : 
    5133           8 :         status = torture_smb2_testdir(tree, BASEDIR, &testdirh);
    5134           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "torture_smb2_testdir failed");
    5135           8 :         smb2_util_close(tree, testdirh);
    5136             : 
    5137           8 :         torture_comment(tctx, "Enabling AAPL\n");
    5138             : 
    5139           8 :         ret = enable_aapl(tctx, tree);
    5140           8 :         torture_assert_goto(tctx, ret == true, ret, done, "enable_aapl failed");
    5141             : 
    5142             :         /*
    5143             :          * Now that Requested AAPL extensions are enabled, setup some
    5144             :          * Mac files with metadata and resource fork
    5145             :          */
    5146             : 
    5147           8 :         torture_comment(tctx, "Preparing file\n");
    5148             : 
    5149           8 :         ret = torture_setup_file(mem_ctx, tree, fname, false);
    5150           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file failed");
    5151             : 
    5152           8 :         info = torture_afpinfo_new(mem_ctx);
    5153           8 :         torture_assert_not_null_goto(tctx, info, ret, done, "torture_afpinfo_new failed");
    5154             : 
    5155           8 :         memcpy(info->afpi_FinderInfo, type_creator, 8);
    5156           8 :         ret = torture_write_afpinfo(tree, tctx, mem_ctx, fname, info);
    5157           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_write_afpinfo failed");
    5158             : 
    5159           8 :         ret = write_stream(tree, __location__, tctx, mem_ctx,
    5160             :                            fname, AFPRESOURCE_STREAM_NAME,
    5161             :                            0, 3, "foo");
    5162           8 :         torture_assert_goto(tctx, ret == true, ret, done, "write_stream failed");
    5163             : 
    5164             :         /*
    5165             :          * Ok, file is prepared, now call smb2/find
    5166             :          */
    5167             : 
    5168           8 :         torture_comment(tctx, "Issue find\n");
    5169             : 
    5170           8 :         ZERO_STRUCT(io);
    5171           8 :         io.in.desired_access = SEC_RIGHTS_DIR_READ;
    5172           8 :         io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY;
    5173           8 :         io.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY;
    5174           8 :         io.in.share_access = (NTCREATEX_SHARE_ACCESS_READ |
    5175             :                               NTCREATEX_SHARE_ACCESS_WRITE |
    5176             :                               NTCREATEX_SHARE_ACCESS_DELETE);
    5177           8 :         io.in.create_disposition = NTCREATEX_DISP_OPEN;
    5178           8 :         io.in.fname = BASEDIR;
    5179           8 :         status = smb2_create(tree, tctx, &io);
    5180           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_create failed");
    5181             : 
    5182           8 :         ZERO_STRUCT(f);
    5183           8 :         f.in.file.handle        = io.out.file.handle;
    5184           8 :         f.in.pattern            = "*";
    5185           8 :         f.in.max_response_size  = 0x1000;
    5186           8 :         f.in.level              = SMB2_FIND_ID_BOTH_DIRECTORY_INFO;
    5187             : 
    5188           8 :         status = smb2_find_level(tree, tree, &f, &count, &d);
    5189           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_find_level failed");
    5190             : 
    5191           8 :         status = smb2_util_close(tree, io.out.file.handle);
    5192           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done, "smb2_util_close failed");
    5193             : 
    5194           8 :         torture_comment(tctx, "Checking find response with enriched macOS metadata\n");
    5195             : 
    5196          28 :         for (i = 0; i < count; i++) {
    5197          28 :                 const char *found = d[i].id_both_directory_info.name.s;
    5198             : 
    5199          28 :                 if (!strcmp(found, ".") || !strcmp(found, ".."))
    5200          16 :                         continue;
    5201          12 :                 if (strncmp(found, "._", 2) == 0) {
    5202           4 :                         continue;
    5203             :                 }
    5204           8 :                 break;
    5205             :         }
    5206             : 
    5207           8 :         torture_assert_str_equal_goto(tctx,
    5208             :                                       d[i].id_both_directory_info.name.s, name,
    5209             :                                       ret, done, "bad name");
    5210             : 
    5211           8 :         rfork_len = BVAL(d[i].id_both_directory_info.short_name_buf, 0);
    5212           8 :         torture_assert_int_equal_goto(tctx, rfork_len, 3, ret, done, "bad resource fork length");
    5213             : 
    5214           8 :         torture_assert_mem_equal_goto(tctx, type_creator,
    5215             :                                       d[i].id_both_directory_info.short_name_buf + 8,
    5216             :                                       8, ret, done, "Bad FinderInfo");
    5217           8 : done:
    5218           8 :         smb2_util_unlink(tree, fname);
    5219           8 :         smb2_deltree(tree, BASEDIR);
    5220           8 :         talloc_free(mem_ctx);
    5221           8 :         return ret;
    5222             : }
    5223             : 
    5224           8 : static bool test_invalid_afpinfo(struct torture_context *tctx,
    5225             :                                  struct smb2_tree *tree1,
    5226             :                                  struct smb2_tree *tree2)
    5227             : {
    5228           8 :         const char *fname = "filtest_invalid_afpinfo";
    5229           8 :         const char *sname = "filtest_invalid_afpinfo" AFPINFO_STREAM_NAME;
    5230           0 :         struct smb2_create create;
    5231           8 :         const char *streams_basic[] = {
    5232             :                 "::$DATA"
    5233             :         };
    5234           8 :         const char *streams_afpinfo[] = {
    5235             :                 "::$DATA",
    5236             :                 AFPINFO_STREAM
    5237             :         };
    5238           0 :         NTSTATUS status;
    5239           8 :         bool ret = true;
    5240             : 
    5241           8 :         if (tree2 == NULL) {
    5242           0 :                 torture_skip_goto(tctx, done, "need second share without fruit\n");
    5243             :         }
    5244             : 
    5245           8 :         torture_comment(tctx, "Testing invalid AFP_AfpInfo stream\n");
    5246             : 
    5247           8 :         ret = torture_setup_file(tctx, tree2, fname, false);
    5248           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    5249             : 
    5250           8 :         ret = write_stream(tree2, __location__, tctx, tctx,
    5251             :                            fname, AFPINFO_STREAM_NAME,
    5252             :                            0, 3, "foo");
    5253           8 :         torture_assert_goto(tctx, ret == true, ret, done, "write_stream failed");
    5254             : 
    5255           8 :         ret = check_stream_list(tree2, tctx, fname, 2, streams_afpinfo, false);
    5256           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    5257             : 
    5258           8 :         torture_comment(tctx, "Listing streams, bad AFPINFO stream must not be present\n");
    5259             : 
    5260           8 :         ret = check_stream_list(tree1, tctx, fname, 1, streams_basic, false);
    5261           8 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    5262             : 
    5263           8 :         torture_comment(tctx, "Try to open AFPINFO stream, must fail\n");
    5264             : 
    5265           8 :         ZERO_STRUCT(create);
    5266           8 :         create.in.desired_access = SEC_FILE_ALL;
    5267           8 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    5268           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    5269           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    5270           8 :         create.in.impersonation_level = SMB2_IMPERSONATION_IMPERSONATION;
    5271           8 :         create.in.fname = sname;
    5272             : 
    5273           8 :         status = smb2_create(tree1, tctx, &create);
    5274           8 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    5275             :                                            ret, done, "Stream still around?");
    5276             : 
    5277           8 : done:
    5278           8 :         smb2_util_unlink(tree1, fname);
    5279           8 :         return ret;
    5280             : }
    5281             : 
    5282           8 : static bool test_writing_afpinfo(struct torture_context *tctx,
    5283             :                                  struct smb2_tree *tree)
    5284             : {
    5285           8 :         const char *fname = "filtest_invalid_afpinfo";
    5286           8 :         const char *sname = "filtest_invalid_afpinfo" AFPINFO_STREAM;
    5287           8 :         const char *streams_afpinfo[] = {
    5288             :                 "::$DATA",
    5289             :                 AFPINFO_STREAM
    5290             :         };
    5291           8 :         bool ret = true;
    5292           0 :         static AfpInfo *afpi = NULL;
    5293           8 :         char *buf = NULL;
    5294           8 :         char *afpi_buf = NULL;
    5295           8 :         char *zero_buf = NULL;
    5296           8 :         bool broken_osx = torture_setting_bool(tctx, "broken_osx_45759458", false);
    5297           8 :         off_t min_offset_for_2streams = 16;
    5298           0 :         int i;
    5299           0 :         NTSTATUS status;
    5300           0 :         struct test_sizes {
    5301             :                 off_t offset;
    5302             :                 size_t size;
    5303             :                 bool expected_result;
    5304           8 :         } test_sizes[] = {
    5305             :                 { 0, 1, false},
    5306             :                 { 0, 2, false},
    5307             :                 { 0, 3, true},
    5308             :                 { 0, 4, true},
    5309             :                 { 0, 14, true},
    5310             :                 { 0, 15, true},
    5311             :                 { 0, 16, true},
    5312             :                 { 0, 24, true},
    5313             :                 { 0, 34, true},
    5314             :                 { 0, 44, true},
    5315             :                 { 0, 54, true},
    5316             :                 { 0, 55, true},
    5317             :                 { 0, 56, true},
    5318             :                 { 0, 57, true},
    5319             :                 { 0, 58, true},
    5320             :                 { 0, 59, true},
    5321             :                 { 0, 60, true},
    5322             :                 { 0, 61, true},
    5323             :                 { 0, 64, true},
    5324             :                 { 0, 1024, true},
    5325             :                 { 0, 10064, true},
    5326             : 
    5327             :                 { 1, 1, false},
    5328             :                 { 1, 2, false},
    5329             :                 { 1, 3, false},
    5330             :                 { 1, 4, false},
    5331             :                 { 1, 14, false},
    5332             :                 { 1, 15, false},
    5333             :                 { 1, 16, false},
    5334             :                 { 1, 24, false},
    5335             :                 { 1, 34, false},
    5336             :                 { 1, 44, false},
    5337             :                 { 1, 54, false},
    5338             :                 { 1, 55, false},
    5339             :                 { 1, 56, false},
    5340             :                 { 1, 57, false},
    5341             :                 { 1, 58, false},
    5342             :                 { 1, 59, false},
    5343             :                 { 1, 60, true},
    5344             :                 { 1, 61, true},
    5345             :                 { 1, 1024, true},
    5346             :                 { 1, 10064, true},
    5347             : 
    5348             :                 { 30, 1, false},
    5349             :                 { 30, 2, false},
    5350             :                 { 30, 3, false},
    5351             :                 { 30, 4, false},
    5352             :                 { 30, 14, false},
    5353             :                 { 30, 15, false},
    5354             :                 { 30, 16, false},
    5355             :                 { 30, 24, false},
    5356             :                 { 30, 34, false},
    5357             :                 { 30, 44, false},
    5358             :                 { 30, 54, false},
    5359             :                 { 30, 55, false},
    5360             :                 { 30, 56, false},
    5361             :                 { 30, 57, false},
    5362             :                 { 30, 58, false},
    5363             :                 { 30, 59, false},
    5364             :                 { 30, 60, true},
    5365             :                 { 30, 61, true},
    5366             :                 { 30, 1024, true},
    5367             :                 { 30, 10064, true},
    5368             : 
    5369             :                 { 58, 1, false},
    5370             :                 { 58, 2, false},
    5371             :                 { 58, 3, false},
    5372             :                 { 58, 4, false},
    5373             :                 { 58, 14, false},
    5374             :                 { 58, 15, false},
    5375             :                 { 58, 16, false},
    5376             :                 { 58, 24, false},
    5377             :                 { 58, 34, false},
    5378             :                 { 58, 44, false},
    5379             :                 { 58, 54, false},
    5380             :                 { 58, 55, false},
    5381             :                 { 58, 56, false},
    5382             :                 { 58, 57, false},
    5383             :                 { 58, 58, false},
    5384             :                 { 58, 59, false},
    5385             :                 { 58, 60, true},
    5386             :                 { 58, 61, true},
    5387             :                 { 58, 1024, true},
    5388             :                 { 58, 10064, true},
    5389             : 
    5390             :                 { 59, 1, false},
    5391             :                 { 59, 2, false},
    5392             :                 { 59, 3, false},
    5393             :                 { 59, 4, false},
    5394             :                 { 59, 14, false},
    5395             :                 { 59, 15, false},
    5396             :                 { 59, 16, false},
    5397             :                 { 59, 24, false},
    5398             :                 { 59, 34, false},
    5399             :                 { 59, 44, false},
    5400             :                 { 59, 54, false},
    5401             :                 { 59, 55, false},
    5402             :                 { 59, 56, false},
    5403             :                 { 59, 57, false},
    5404             :                 { 59, 58, false},
    5405             :                 { 59, 59, false},
    5406             :                 { 59, 60, true},
    5407             :                 { 59, 61, true},
    5408             :                 { 59, 1024, true},
    5409             :                 { 59, 10064, true},
    5410             : 
    5411             :                 { 60, 1, false},
    5412             :                 { 60, 2, false},
    5413             :                 { 60, 3, false},
    5414             :                 { 60, 4, false},
    5415             :                 { 60, 14, false},
    5416             :                 { 60, 15, false},
    5417             :                 { 60, 16, false},
    5418             :                 { 60, 24, false},
    5419             :                 { 60, 34, false},
    5420             :                 { 60, 44, false},
    5421             :                 { 60, 54, false},
    5422             :                 { 60, 55, false},
    5423             :                 { 60, 56, false},
    5424             :                 { 60, 57, false},
    5425             :                 { 60, 58, false},
    5426             :                 { 60, 59, false},
    5427             :                 { 60, 60, true},
    5428             :                 { 60, 61, true},
    5429             :                 { 60, 1024, true},
    5430             :                 { 60, 10064, true},
    5431             : 
    5432             :                 { 61, 1, false},
    5433             :                 { 61, 2, false},
    5434             :                 { 61, 3, false},
    5435             :                 { 61, 4, false},
    5436             :                 { 61, 14, false},
    5437             :                 { 61, 15, false},
    5438             :                 { 61, 16, false},
    5439             :                 { 61, 24, false},
    5440             :                 { 61, 34, false},
    5441             :                 { 61, 44, false},
    5442             :                 { 61, 54, false},
    5443             :                 { 61, 55, false},
    5444             :                 { 61, 56, false},
    5445             :                 { 61, 57, false},
    5446             :                 { 61, 58, false},
    5447             :                 { 61, 59, false},
    5448             :                 { 61, 60, true},
    5449             :                 { 61, 61, true},
    5450             :                 { 61, 1024, true},
    5451             :                 { 61, 10064, true},
    5452             : 
    5453             :                 { 10000, 1, false},
    5454             :                 { 10000, 2, false},
    5455             :                 { 10000, 3, false},
    5456             :                 { 10000, 4, false},
    5457             :                 { 10000, 14, false},
    5458             :                 { 10000, 15, false},
    5459             :                 { 10000, 16, false},
    5460             :                 { 10000, 24, false},
    5461             :                 { 10000, 34, false},
    5462             :                 { 10000, 44, false},
    5463             :                 { 10000, 54, false},
    5464             :                 { 10000, 55, false},
    5465             :                 { 10000, 56, false},
    5466             :                 { 10000, 57, false},
    5467             :                 { 10000, 58, false},
    5468             :                 { 10000, 59, false},
    5469             :                 { 10000, 60, true},
    5470             :                 { 10000, 61, true},
    5471             :                 { 10000, 1024, true},
    5472             :                 { 10000, 10064, true},
    5473             : 
    5474             :                 { -1, 0, false},
    5475             :         };
    5476             : 
    5477           8 :         afpi = torture_afpinfo_new(tctx);
    5478           8 :         torture_assert_not_null_goto(tctx, afpi, ret, done,
    5479             :                                      "torture_afpinfo_new failed\n");
    5480             : 
    5481           8 :         memcpy(afpi->afpi_FinderInfo, "FOO BAR ", 8);
    5482             : 
    5483           8 :         buf = torture_afpinfo_pack(afpi, afpi);
    5484           8 :         torture_assert_not_null_goto(tctx, buf, ret, done,
    5485             :                                      "torture_afpinfo_pack failed\n");
    5486             : 
    5487           8 :         afpi_buf = talloc_zero_array(tctx, char, 10064);
    5488           8 :         torture_assert_not_null_goto(tctx, afpi_buf, ret, done,
    5489             :                                      "talloc_zero_array failed\n");
    5490           8 :         memcpy(afpi_buf, buf, 60);
    5491             : 
    5492           8 :         zero_buf = talloc_zero_array(tctx, char, 10064);
    5493           8 :         torture_assert_not_null_goto(tctx, zero_buf, ret, done,
    5494             :                                      "talloc_zero_array failed\n");
    5495             : 
    5496           8 :         ret = torture_setup_file(tctx, tree, fname, false);
    5497           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    5498             :                             "torture_setup_file\n");
    5499             : 
    5500        1296 :         for (i = 0; test_sizes[i].offset != -1; i++) {
    5501           0 :                 struct smb2_handle h;
    5502           0 :                 struct smb2_create c;
    5503           0 :                 int expected_num_streams;
    5504           0 :                 size_t fi_check_size;
    5505             : 
    5506        1288 :                 torture_comment(tctx,
    5507             :                                 "Test %d: offset=%jd size=%zu result=%s\n",
    5508             :                                 i,
    5509        1288 :                                 (intmax_t)test_sizes[i].offset,
    5510             :                                 test_sizes[i].size,
    5511        1288 :                                 test_sizes[i].expected_result ? "true":"false");
    5512             : 
    5513             : 
    5514        1288 :                 c = (struct smb2_create) {
    5515             :                         .in.desired_access = SEC_FILE_WRITE_DATA,
    5516             :                         .in.file_attributes = FILE_ATTRIBUTE_NORMAL,
    5517             :                         .in.create_disposition = NTCREATEX_DISP_OPEN_IF,
    5518             :                         .in.fname = sname,
    5519             :                 };
    5520             : 
    5521        1288 :                 status = smb2_create(tree, tree, &c);
    5522        1288 :                 torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    5523             :                                                 "smb2_create\n");
    5524        1288 :                 h = c.out.file.handle;
    5525             : 
    5526        1288 :                 status = smb2_util_write(tree,
    5527             :                                          h,
    5528             :                                          zero_buf,
    5529             :                                          test_sizes[i].offset,
    5530             :                                          test_sizes[i].size);
    5531        1288 :                 torture_assert_ntstatus_equal_goto(
    5532             :                         tctx, status, NT_STATUS_INVALID_PARAMETER,
    5533             :                         ret, done, "smb2_util_write\n");
    5534             : 
    5535        1288 :                 status = smb2_util_write(tree,
    5536             :                                          h,
    5537             :                                          afpi_buf,
    5538             :                                          test_sizes[i].offset,
    5539             :                                          test_sizes[i].size);
    5540        1288 :                 smb2_util_close(tree, h);
    5541        1288 :                 if (test_sizes[i].expected_result == true) {
    5542         376 :                         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    5543             :                                                         "smb2_util_write\n");
    5544             :                 } else {
    5545         912 :                         torture_assert_ntstatus_equal_goto(
    5546             :                                 tctx, status, NT_STATUS_INVALID_PARAMETER,
    5547             :                                 ret, done, "smb2_util_write\n");
    5548             :                 }
    5549             : 
    5550        1288 :                 if (broken_osx) {
    5551             :                         /*
    5552             :                          * Currently macOS has a bug (Radar #45759458) where it
    5553             :                          * writes more bytes then requested from uninitialized
    5554             :                          * memory to the filesystem. That means it will likely
    5555             :                          * write data to FinderInfo so the stream is not empty
    5556             :                          * and thus listed when the number of streams is
    5557             :                          * queried.
    5558             :                          */
    5559           0 :                         min_offset_for_2streams = 2;
    5560             :                 }
    5561             : 
    5562        1288 :                 if ((test_sizes[i].expected_result == true) &&
    5563         376 :                     (test_sizes[i].size > min_offset_for_2streams))
    5564             :                 {
    5565         336 :                         expected_num_streams = 2;
    5566             :                 } else {
    5567         952 :                         expected_num_streams = 1;
    5568             :                 }
    5569             : 
    5570        1288 :                 ret = check_stream_list(tree, tctx, fname,
    5571             :                                         expected_num_streams,
    5572             :                                         streams_afpinfo, false);
    5573        1288 :                 torture_assert_goto(tctx, ret == true, ret, done,
    5574             :                                     "Bad streams\n");
    5575             : 
    5576        1288 :                 if (test_sizes[i].expected_result == false) {
    5577         912 :                         continue;
    5578             :                 }
    5579             : 
    5580         376 :                 if (test_sizes[i].size <= 16) {
    5581             :                         /*
    5582             :                          * FinderInfo with the "FOO BAR " string we wrote above
    5583             :                          * would start at offset 16. Check whether this test
    5584             :                          * wrote 1 byte or more.
    5585             :                          */
    5586          40 :                         goto next;
    5587             :                 }
    5588             : 
    5589         336 :                 fi_check_size = test_sizes[i].size - 16;
    5590         336 :                 fi_check_size = MIN(fi_check_size, 8);
    5591             : 
    5592         336 :                 ret = check_stream(tree, __location__,
    5593             :                                    tctx, tctx,
    5594             :                                    fname, AFPINFO_STREAM,
    5595             :                                    0, 60, 16, fi_check_size, "FOO BAR ");
    5596         336 :                 torture_assert_goto(tctx, ret == true, ret, done,
    5597             :                                     "Bad streams\n");
    5598             : 
    5599         336 : next:
    5600         376 :                 status = smb2_util_unlink(tree, sname);
    5601         376 :                 if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
    5602           0 :                         bool missing_ok;
    5603             : 
    5604          40 :                         missing_ok = test_sizes[i].expected_result == false;
    5605          40 :                         missing_ok |= test_sizes[i].size <= 16;
    5606             : 
    5607          40 :                         torture_assert_goto(tctx, missing_ok,
    5608             :                                             ret, done, "smb2_util_unlink\n");
    5609             :                 }
    5610             :         }
    5611             : 
    5612           8 : done:
    5613           8 :         smb2_util_unlink(tree, fname);
    5614           8 :         return ret;
    5615             : }
    5616             : 
    5617           2 : static bool test_zero_file_id(struct torture_context *tctx,
    5618             :                               struct smb2_tree *tree)
    5619             : {
    5620           2 :         const char *fname = "filtest_file_id";
    5621           2 :         struct smb2_create create = {0};
    5622           0 :         NTSTATUS status;
    5623           2 :         bool ret = true;
    5624           2 :         uint8_t zero_file_id[8] = {0};
    5625             : 
    5626           2 :         torture_comment(tctx, "Testing zero file id\n");
    5627             : 
    5628           2 :         ret = torture_setup_file(tctx, tree, fname, false);
    5629           2 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    5630             : 
    5631           2 :         ZERO_STRUCT(create);
    5632           2 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE;
    5633           2 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    5634           2 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    5635           2 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    5636           2 :         create.in.fname = fname;
    5637           2 :         create.in.query_on_disk_id = true;
    5638             : 
    5639           2 :         status = smb2_create(tree, tctx, &create);
    5640           2 :         torture_assert_ntstatus_equal_goto(tctx, status, NT_STATUS_OK, ret,
    5641             :                                            done,
    5642             :                                            "test file could not be opened");
    5643           2 :         torture_assert_mem_not_equal_goto(tctx, create.out.on_disk_id,
    5644             :                                           zero_file_id, 8, ret, done,
    5645             :                                           "unexpected zero file id");
    5646             : 
    5647           2 :         smb2_util_close(tree, create.out.file.handle);
    5648             : 
    5649           2 :         ret = enable_aapl(tctx, tree);
    5650           2 :         torture_assert(tctx, ret == true, "enable_aapl failed");
    5651             : 
    5652           2 :         ZERO_STRUCT(create);
    5653           2 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE;
    5654           2 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    5655           2 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    5656           2 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    5657           2 :         create.in.fname = fname;
    5658           2 :         create.in.query_on_disk_id = true;
    5659             : 
    5660           2 :         status = smb2_create(tree, tctx, &create);
    5661           2 :         torture_assert_ntstatus_equal_goto(
    5662             :             tctx, status, NT_STATUS_OK, ret, done,
    5663             :             "test file could not be opened with AAPL");
    5664           2 :         torture_assert_mem_equal_goto(tctx, create.out.on_disk_id, zero_file_id,
    5665             :                                       8, ret, done, "non-zero file id");
    5666             : 
    5667           2 :         smb2_util_close(tree, create.out.file.handle);
    5668             : 
    5669           2 : done:
    5670           2 :         smb2_util_unlink(tree, fname);
    5671           2 :         return ret;
    5672             : }
    5673             : 
    5674          16 : static bool copy_one_stream(struct torture_context *torture,
    5675             :                             struct smb2_tree *tree,
    5676             :                             TALLOC_CTX *tmp_ctx,
    5677             :                             const char *src_sname,
    5678             :                             const char *dst_sname)
    5679             : {
    5680          16 :         struct smb2_handle src_h = {{0}};
    5681          16 :         struct smb2_handle dest_h = {{0}};
    5682           0 :         NTSTATUS status;
    5683           0 :         union smb_ioctl io;
    5684           0 :         struct srv_copychunk_copy cc_copy;
    5685           0 :         struct srv_copychunk_rsp cc_rsp;
    5686           0 :         enum ndr_err_code ndr_ret;
    5687          16 :         bool ok = false;
    5688             : 
    5689          16 :         ok = test_setup_copy_chunk(torture, tree, tmp_ctx,
    5690             :                                    1, /* 1 chunk */
    5691             :                                    src_sname,
    5692             :                                    &src_h, 256, /* fill 256 byte src file */
    5693             :                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
    5694             :                                    dst_sname,
    5695             :                                    &dest_h, 0,      /* 0 byte dest file */
    5696             :                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
    5697             :                                    &cc_copy,
    5698             :                                    &io);
    5699          16 :         torture_assert_goto(torture, ok == true, ok, done,
    5700             :                             "setup copy chunk error\n");
    5701             : 
    5702             :         /* copy all src file data (via a single chunk desc) */
    5703          16 :         cc_copy.chunks[0].source_off = 0;
    5704          16 :         cc_copy.chunks[0].target_off = 0;
    5705          16 :         cc_copy.chunks[0].length = 256;
    5706             : 
    5707          16 :         ndr_ret = ndr_push_struct_blob(
    5708             :                 &io.smb2.in.out, tmp_ctx, &cc_copy,
    5709             :                 (ndr_push_flags_fn_t)ndr_push_srv_copychunk_copy);
    5710             : 
    5711          16 :         torture_assert_ndr_success_goto(torture, ndr_ret, ok, done,
    5712             :                                    "ndr_push_srv_copychunk_copy\n");
    5713             : 
    5714          16 :         status = smb2_ioctl(tree, tmp_ctx, &io.smb2);
    5715          16 :         torture_assert_ntstatus_ok_goto(torture, status, ok, done,
    5716             :                                         "FSCTL_SRV_COPYCHUNK\n");
    5717             : 
    5718          16 :         ndr_ret = ndr_pull_struct_blob(
    5719             :                 &io.smb2.out.out, tmp_ctx, &cc_rsp,
    5720             :                 (ndr_pull_flags_fn_t)ndr_pull_srv_copychunk_rsp);
    5721             : 
    5722          16 :         torture_assert_ndr_success_goto(torture, ndr_ret, ok, done,
    5723             :                                    "ndr_pull_srv_copychunk_rsp\n");
    5724             : 
    5725          16 :         ok = check_copy_chunk_rsp(torture, &cc_rsp,
    5726             :                                   1,    /* chunks written */
    5727             :                                   0,    /* chunk bytes unsuccessfully written */
    5728             :                                   256); /* total bytes written */
    5729          16 :         torture_assert_goto(torture, ok == true, ok, done,
    5730             :                             "bad copy chunk response data\n");
    5731             : 
    5732          16 :         ok = check_pattern(torture, tree, tmp_ctx, dest_h, 0, 256, 0);
    5733          16 :         if (!ok) {
    5734           0 :                 torture_fail(torture, "inconsistent file data\n");
    5735             :         }
    5736             : 
    5737          16 : done:
    5738          16 :         if (!smb2_util_handle_empty(src_h)) {
    5739          16 :                 smb2_util_close(tree, src_h);
    5740             :         }
    5741          16 :         if (!smb2_util_handle_empty(dest_h)) {
    5742          16 :                 smb2_util_close(tree, dest_h);
    5743             :         }
    5744             : 
    5745          16 :         return ok;
    5746             : }
    5747             : 
    5748           8 : static bool copy_finderinfo_stream(struct torture_context *torture,
    5749             :                                    struct smb2_tree *tree,
    5750             :                                    TALLOC_CTX *tmp_ctx,
    5751             :                                    const char *src_name,
    5752             :                                    const char *dst_name)
    5753             : {
    5754           8 :         struct smb2_handle src_h = {{0}};
    5755           8 :         struct smb2_handle dest_h = {{0}};
    5756           0 :         NTSTATUS status;
    5757           0 :         union smb_ioctl io;
    5758           0 :         struct srv_copychunk_copy cc_copy;
    5759           0 :         struct srv_copychunk_rsp cc_rsp;
    5760           0 :         enum ndr_err_code ndr_ret;
    5761           8 :         const char *type_creator = "SMB,OLE!";
    5762           8 :         AfpInfo *info = NULL;
    5763           8 :         const char *src_name_afpinfo = NULL;
    5764           8 :         const char *dst_name_afpinfo = NULL;
    5765           8 :         bool ok = false;
    5766             : 
    5767           8 :         src_name_afpinfo = talloc_asprintf(tmp_ctx, "%s%s", src_name,
    5768             :                                            AFPINFO_STREAM);
    5769           8 :         torture_assert_not_null_goto(torture, src_name_afpinfo, ok, done,
    5770             :                                      "talloc_asprintf failed\n");
    5771             : 
    5772           8 :         dst_name_afpinfo = talloc_asprintf(tmp_ctx, "%s%s", dst_name,
    5773             :                                            AFPINFO_STREAM);
    5774           8 :         torture_assert_not_null_goto(torture, dst_name_afpinfo, ok, done,
    5775             :                                      "talloc_asprintf failed\n");
    5776             : 
    5777           8 :         info = torture_afpinfo_new(tmp_ctx);
    5778           8 :         torture_assert_not_null_goto(torture, info, ok, done,
    5779             :                                      "torture_afpinfo_new failed\n");
    5780             : 
    5781           8 :         memcpy(info->afpi_FinderInfo, type_creator, 8);
    5782           8 :         ok = torture_write_afpinfo(tree, torture, tmp_ctx, src_name, info);
    5783           8 :         torture_assert_goto(torture, ok == true, ok, done,
    5784             :                             "torture_write_afpinfo failed\n");
    5785             : 
    5786           8 :         ok = test_setup_copy_chunk(torture, tree, tmp_ctx,
    5787             :                                    1, /* 1 chunk */
    5788             :                                    src_name_afpinfo,
    5789             :                                    &src_h, 0,
    5790             :                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
    5791             :                                    dst_name_afpinfo,
    5792             :                                    &dest_h, 0,
    5793             :                                    SEC_FILE_READ_DATA | SEC_FILE_WRITE_DATA,
    5794             :                                    &cc_copy,
    5795             :                                    &io);
    5796           8 :         torture_assert_goto(torture, ok == true, ok, done,
    5797             :                             "setup copy chunk error\n");
    5798             : 
    5799             :         /* copy all src file data (via a single chunk desc) */
    5800           8 :         cc_copy.chunks[0].source_off = 0;
    5801           8 :         cc_copy.chunks[0].target_off = 0;
    5802           8 :         cc_copy.chunks[0].length = 60;
    5803             : 
    5804           8 :         ndr_ret = ndr_push_struct_blob(
    5805             :                 &io.smb2.in.out, tmp_ctx, &cc_copy,
    5806             :                 (ndr_push_flags_fn_t)ndr_push_srv_copychunk_copy);
    5807             : 
    5808           8 :         torture_assert_ndr_success_goto(torture, ndr_ret, ok, done,
    5809             :                                    "ndr_push_srv_copychunk_copy\n");
    5810             : 
    5811           8 :         status = smb2_ioctl(tree, tmp_ctx, &io.smb2);
    5812           8 :         torture_assert_ntstatus_ok_goto(torture, status, ok, done,
    5813             :                                         "FSCTL_SRV_COPYCHUNK\n");
    5814             : 
    5815           8 :         ndr_ret = ndr_pull_struct_blob(
    5816             :                 &io.smb2.out.out, tmp_ctx, &cc_rsp,
    5817             :                 (ndr_pull_flags_fn_t)ndr_pull_srv_copychunk_rsp);
    5818             : 
    5819           8 :         torture_assert_ndr_success_goto(torture, ndr_ret, ok, done,
    5820             :                                    "ndr_pull_srv_copychunk_rsp\n");
    5821             : 
    5822           8 :         smb2_util_close(tree, src_h);
    5823           8 :         ZERO_STRUCT(src_h);
    5824           8 :         smb2_util_close(tree, dest_h);
    5825           8 :         ZERO_STRUCT(dest_h);
    5826             : 
    5827           8 :         ok = check_copy_chunk_rsp(torture, &cc_rsp,
    5828             :                                   1,    /* chunks written */
    5829             :                                   0,    /* chunk bytes unsuccessfully written */
    5830             :                                   60); /* total bytes written */
    5831           8 :         torture_assert_goto(torture, ok == true, ok, done,
    5832             :                             "bad copy chunk response data\n");
    5833             : 
    5834           8 :         ok = check_stream(tree, __location__, torture, tmp_ctx,
    5835             :                           dst_name, AFPINFO_STREAM,
    5836             :                           0, 60, 16, 8, type_creator);
    5837           8 :         torture_assert_goto(torture, ok == true, ok, done, "check_stream failed\n");
    5838             : 
    5839           8 : done:
    5840           8 :         if (!smb2_util_handle_empty(src_h)) {
    5841           0 :                 smb2_util_close(tree, src_h);
    5842             :         }
    5843           8 :         if (!smb2_util_handle_empty(dest_h)) {
    5844           0 :                 smb2_util_close(tree, dest_h);
    5845             :         }
    5846             : 
    5847           8 :         return ok;
    5848             : }
    5849             : 
    5850           8 : static bool test_copy_chunk_streams(struct torture_context *torture,
    5851             :                                     struct smb2_tree *tree)
    5852             : {
    5853           8 :         const char *src_name = "src";
    5854           8 :         const char *dst_name = "dst";
    5855           0 :         struct names {
    5856             :                 const char *src_sname;
    5857             :                 const char *dst_sname;
    5858           8 :         } names[] = {
    5859             :                 { "src:foo", "dst:foo" },
    5860             :                 { "src" AFPRESOURCE_STREAM, "dst" AFPRESOURCE_STREAM }
    5861             :         };
    5862           0 :         size_t i;
    5863           8 :         TALLOC_CTX *tmp_ctx = NULL;
    5864           8 :         bool ok = false;
    5865             : 
    5866           8 :         tmp_ctx = talloc_new(tree);
    5867           8 :         torture_assert_not_null_goto(torture, tmp_ctx, ok, done,
    5868             :                                      "torture_setup_file\n");
    5869             : 
    5870           8 :         smb2_util_unlink(tree, src_name);
    5871           8 :         smb2_util_unlink(tree, dst_name);
    5872             : 
    5873           8 :         ok = torture_setup_file(torture, tree, src_name, false);
    5874           8 :         torture_assert_goto(torture, ok == true, ok, done, "torture_setup_file\n");
    5875           8 :         ok = torture_setup_file(torture, tree, dst_name, false);
    5876           8 :         torture_assert_goto(torture, ok == true, ok, done, "torture_setup_file\n");
    5877             : 
    5878          24 :         for (i = 0; i < ARRAY_SIZE(names); i++) {
    5879          16 :                 ok = copy_one_stream(torture, tree, tmp_ctx,
    5880             :                                      names[i].src_sname,
    5881             :                                      names[i].dst_sname);
    5882          16 :                 torture_assert_goto(torture, ok == true, ok, done,
    5883             :                                     "copy_one_stream failed\n");
    5884             :         }
    5885             : 
    5886           8 :         ok = copy_finderinfo_stream(torture, tree, tmp_ctx,
    5887             :                                     src_name, dst_name);
    5888           8 :         torture_assert_goto(torture, ok == true, ok, done,
    5889             :                             "copy_finderinfo_stream failed\n");
    5890             : 
    5891           8 : done:
    5892           8 :         smb2_util_unlink(tree, src_name);
    5893           8 :         smb2_util_unlink(tree, dst_name);
    5894           8 :         talloc_free(tmp_ctx);
    5895           8 :         return ok;
    5896             : }
    5897             : 
    5898             : /*
    5899             :  * Ensure this security descriptor has exactly one mode, uid
    5900             :  * and gid.
    5901             :  */
    5902             : 
    5903          16 : static NTSTATUS check_nfs_sd(const struct security_descriptor *psd)
    5904             : {
    5905           0 :         uint32_t i;
    5906          16 :         bool got_one_mode = false;
    5907          16 :         bool got_one_uid = false;
    5908          16 :         bool got_one_gid = false;
    5909             : 
    5910          16 :         if (psd->dacl == NULL) {
    5911           0 :                 return NT_STATUS_INVALID_SECURITY_DESCR;
    5912             :         }
    5913             : 
    5914         112 :         for (i = 0; i < psd->dacl->num_aces; i++) {
    5915          96 :                 if (dom_sid_compare_domain(&global_sid_Unix_NFS_Mode,
    5916          96 :                                            &psd->dacl->aces[i].trustee) == 0) {
    5917          16 :                         if (got_one_mode == true) {
    5918             :                                 /* Can't have more than one. */
    5919           0 :                                 return NT_STATUS_INVALID_SECURITY_DESCR;
    5920             :                         }
    5921          16 :                         got_one_mode = true;
    5922             :                 }
    5923             :         }
    5924         112 :         for (i = 0; i < psd->dacl->num_aces; i++) {
    5925          96 :                 if (dom_sid_compare_domain(&global_sid_Unix_NFS_Users,
    5926          96 :                                            &psd->dacl->aces[i].trustee) == 0) {
    5927          16 :                         if (got_one_uid == true) {
    5928             :                                 /* Can't have more than one. */
    5929           0 :                                 return NT_STATUS_INVALID_SECURITY_DESCR;
    5930             :                         }
    5931          16 :                         got_one_uid = true;
    5932             :                 }
    5933             :         }
    5934         112 :         for (i = 0; i < psd->dacl->num_aces; i++) {
    5935          96 :                 if (dom_sid_compare_domain(&global_sid_Unix_NFS_Groups,
    5936          96 :                                            &psd->dacl->aces[i].trustee) == 0) {
    5937          16 :                         if (got_one_gid == true) {
    5938             :                                 /* Can't have more than one. */
    5939           0 :                                 return NT_STATUS_INVALID_SECURITY_DESCR;
    5940             :                         }
    5941          16 :                         got_one_gid = true;
    5942             :                 }
    5943             :         }
    5944             :         /* Must have at least one of each. */
    5945          16 :         if (got_one_mode == false ||
    5946          16 :                         got_one_uid == false ||
    5947          16 :                         got_one_gid == false) {
    5948           0 :                 return NT_STATUS_INVALID_SECURITY_DESCR;
    5949             :         }
    5950          16 :         return NT_STATUS_OK;
    5951             : }
    5952             : 
    5953           8 : static bool test_nfs_aces(struct torture_context *tctx,
    5954             :                           struct smb2_tree *tree)
    5955             : {
    5956           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    5957           0 :         struct security_ace ace;
    5958           0 :         struct dom_sid sid;
    5959           8 :         const char *fname = BASEDIR "\\nfs_aces.txt";
    5960           8 :         struct smb2_handle h = {{0}};
    5961           0 :         union smb_fileinfo finfo2;
    5962           0 :         union smb_setfileinfo set;
    5963           8 :         struct security_descriptor *psd = NULL;
    5964           0 :         NTSTATUS status;
    5965           8 :         bool ret = true;
    5966           8 :         bool is_osx = torture_setting_bool(tctx, "osx", false);
    5967             : 
    5968           8 :         if (is_osx) {
    5969           0 :                 torture_skip(tctx, "Test only works with Samba\n");
    5970             :         }
    5971             : 
    5972           8 :         ret = enable_aapl(tctx, tree);
    5973           8 :         torture_assert(tctx, ret == true, "enable_aapl failed");
    5974             : 
    5975             :         /* clean slate ...*/
    5976           8 :         smb2_util_unlink(tree, fname);
    5977           8 :         smb2_deltree(tree, fname);
    5978           8 :         smb2_deltree(tree, BASEDIR);
    5979             : 
    5980           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h);
    5981           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    5982           8 :         smb2_util_close(tree, h);
    5983             : 
    5984             :         /* Create a test file. */
    5985           8 :         status = torture_smb2_testfile_access(tree,
    5986             :                                 fname,
    5987             :                                 &h,
    5988             :                                 SEC_STD_READ_CONTROL |
    5989             :                                 SEC_STD_WRITE_DAC |
    5990             :                                 SEC_RIGHTS_FILE_ALL);
    5991           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    5992             : 
    5993             :         /* Get the ACL. */
    5994           8 :         finfo2.query_secdesc.in.secinfo_flags =
    5995             :                 SECINFO_OWNER |
    5996             :                 SECINFO_GROUP |
    5997             :                 SECINFO_DACL;
    5998           8 :         finfo2.generic.level = RAW_FILEINFO_SEC_DESC;
    5999           8 :         finfo2.generic.in.file.handle = h;
    6000           8 :         status = smb2_getinfo_file(tree, tctx, &finfo2);
    6001           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    6002             : 
    6003           8 :         psd = finfo2.query_secdesc.out.sd;
    6004             : 
    6005             :         /* Ensure we have only single mode/uid/gid NFS entries. */
    6006           8 :         status = check_nfs_sd(psd);
    6007           8 :         if (!NT_STATUS_IS_OK(status)) {
    6008           0 :                 NDR_PRINT_DEBUG(
    6009             :                         security_descriptor,
    6010             :                         discard_const_p(struct security_descriptor, psd));
    6011             :         }
    6012           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    6013             : 
    6014             :         /* Add a couple of extra NFS uids and gids. */
    6015           8 :         sid_compose(&sid, &global_sid_Unix_NFS_Users, 27);
    6016           8 :         init_sec_ace(&ace, &sid, SEC_ACE_TYPE_ACCESS_DENIED, 0, 0);
    6017           8 :         status = security_descriptor_dacl_add(psd, &ace);
    6018           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    6019           8 :         status = security_descriptor_dacl_add(psd, &ace);
    6020           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    6021             : 
    6022           8 :         sid_compose(&sid, &global_sid_Unix_NFS_Groups, 300);
    6023           8 :         init_sec_ace(&ace, &sid, SEC_ACE_TYPE_ACCESS_DENIED, 0, 0);
    6024           8 :         status = security_descriptor_dacl_add(psd, &ace);
    6025           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    6026           8 :         status = security_descriptor_dacl_add(psd, &ace);
    6027           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    6028             : 
    6029             :         /* Now set on the file handle. */
    6030           8 :         set.set_secdesc.level = RAW_SFILEINFO_SEC_DESC;
    6031           8 :         set.set_secdesc.in.file.handle = h;
    6032           8 :         set.set_secdesc.in.secinfo_flags = SECINFO_DACL;
    6033           8 :         set.set_secdesc.in.sd = psd;
    6034           8 :         status = smb2_setinfo_file(tree, &set);
    6035           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    6036             : 
    6037             :         /* Get the ACL again. */
    6038           8 :         finfo2.query_secdesc.in.secinfo_flags =
    6039             :                 SECINFO_OWNER |
    6040             :                 SECINFO_GROUP |
    6041             :                 SECINFO_DACL;
    6042           8 :         finfo2.generic.level = RAW_FILEINFO_SEC_DESC;
    6043           8 :         finfo2.generic.in.file.handle = h;
    6044           8 :         status = smb2_getinfo_file(tree, tctx, &finfo2);
    6045           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    6046             : 
    6047           8 :         psd = finfo2.query_secdesc.out.sd;
    6048             : 
    6049             :         /* Ensure we have only single mode/uid/gid NFS entries. */
    6050           8 :         status = check_nfs_sd(psd);
    6051           8 :         if (!NT_STATUS_IS_OK(status)) {
    6052           0 :                 NDR_PRINT_DEBUG(
    6053             :                         security_descriptor,
    6054             :                         discard_const_p(struct security_descriptor, psd));
    6055             :         }
    6056           8 :         CHECK_STATUS(status, NT_STATUS_OK);
    6057             : 
    6058           8 : done:
    6059           8 :         if (!smb2_util_handle_empty(h)) {
    6060           8 :                 smb2_util_close(tree, h);
    6061             :         }
    6062           8 :         smb2_util_unlink(tree, fname);
    6063           8 :         smb2_deltree(tree, fname);
    6064           8 :         smb2_deltree(tree, BASEDIR);
    6065           8 :         talloc_free(mem_ctx);
    6066           8 :         return ret;
    6067             : }
    6068             : 
    6069           8 : static bool test_setinfo_stream_eof(struct torture_context *tctx,
    6070             :                                     struct smb2_tree *tree)
    6071             : {
    6072           8 :         bool ret = true;
    6073           0 :         NTSTATUS status;
    6074           0 :         struct smb2_create create;
    6075           0 :         union smb_setfileinfo sfinfo;
    6076           0 :         union smb_fileinfo finfo;
    6077           0 :         struct smb2_handle h1;
    6078           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    6079           8 :         const char *fname = BASEDIR "\\file";
    6080           8 :         const char *sname = BASEDIR "\\file:foo";
    6081             : 
    6082           8 :         torture_assert_goto(tctx, mem_ctx != NULL, ret, done,
    6083             :                             "talloc_new failed\n");
    6084             : 
    6085           8 :         ret = enable_aapl(tctx, tree);
    6086           8 :         torture_assert(tctx, ret == true, "enable_aapl failed");
    6087             : 
    6088           8 :         torture_comment(tctx, "Test setting EOF on a stream\n");
    6089             : 
    6090           8 :         smb2_deltree(tree, BASEDIR);
    6091           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    6092           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6093             :                                         "torture_smb2_testdir\n");
    6094           8 :         smb2_util_close(tree, h1);
    6095             : 
    6096           8 :         status = torture_smb2_testfile(tree, fname, &h1);
    6097           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6098             :                                         "torture_smb2_testfile failed\n");
    6099           8 :         smb2_util_close(tree, h1);
    6100             : 
    6101           8 :         status = torture_smb2_testfile_access(tree, sname, &h1,
    6102             :                                               SEC_FILE_WRITE_DATA);
    6103           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6104             :                                         "torture_smb2_testfile failed\n");
    6105             : 
    6106           8 :         status = smb2_util_write(tree, h1, "1234567890", 0, 10);
    6107           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6108             :                                         "smb2_util_write failed\n");
    6109           8 :         smb2_util_close(tree, h1);
    6110             : 
    6111             :         /*
    6112             :          * Test setting EOF to 21
    6113             :          */
    6114             : 
    6115           8 :         torture_comment(tctx, "Setting stream EOF to 21\n");
    6116             : 
    6117           8 :         status = torture_smb2_testfile_access(tree, sname, &h1,
    6118             :                                               SEC_FILE_WRITE_DATA);
    6119           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6120             :                                         "torture_smb2_testfile failed\n");
    6121             : 
    6122           8 :         ZERO_STRUCT(sfinfo);
    6123           8 :         sfinfo.generic.in.file.handle = h1;
    6124           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    6125           8 :         sfinfo.position_information.in.position = 21;
    6126           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    6127           8 :         torture_assert_ntstatus_ok_goto(tctx, status,
    6128             :                                         ret, done, "set EOF 21 failed\n");
    6129             : 
    6130           8 :         smb2_util_close(tree, h1);
    6131             : 
    6132           8 :         status = torture_smb2_testfile_access(tree, sname, &h1,
    6133             :                                               SEC_FILE_WRITE_DATA);
    6134           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6135             :                                         "torture_smb2_testfile failed\n");
    6136             : 
    6137           8 :         ZERO_STRUCT(finfo);
    6138           8 :         finfo.generic.level = RAW_FILEINFO_STANDARD_INFORMATION;
    6139           8 :         finfo.generic.in.file.handle = h1;
    6140           8 :         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
    6141           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6142             :                                         "smb2_getinfo_file failed");
    6143             : 
    6144           8 :         smb2_util_close(tree, h1);
    6145             : 
    6146           8 :         torture_assert_goto(tctx, finfo.standard_info.out.size == 21,
    6147             :                             ret, done, "size != 21\n");
    6148             : 
    6149             :         /*
    6150             :          * Test setting EOF to 0
    6151             :          */
    6152             : 
    6153           8 :         torture_comment(tctx, "Setting stream EOF to 0\n");
    6154             : 
    6155           8 :         status = torture_smb2_testfile_access(tree, sname, &h1,
    6156             :                                               SEC_FILE_WRITE_DATA);
    6157           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6158             :                                         "torture_smb2_testfile failed\n");
    6159             : 
    6160           8 :         ZERO_STRUCT(sfinfo);
    6161           8 :         sfinfo.generic.in.file.handle = h1;
    6162           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    6163           8 :         sfinfo.position_information.in.position = 0;
    6164           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    6165           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6166             :                                         "set eof 0 failed\n");
    6167             : 
    6168           8 :         ZERO_STRUCT(create);
    6169           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE;
    6170           8 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    6171           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    6172           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    6173           8 :         create.in.fname = sname;
    6174             : 
    6175           8 :         status = smb2_create(tree, tctx, &create);
    6176           8 :         torture_assert_ntstatus_equal_goto(
    6177             :                 tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done,
    6178             :                 "Unexpected status\n");
    6179             : 
    6180           8 :         smb2_util_close(tree, h1);
    6181             : 
    6182           8 :         ZERO_STRUCT(create);
    6183           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE;
    6184           8 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    6185           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    6186           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    6187           8 :         create.in.fname = sname;
    6188             : 
    6189           8 :         status = smb2_create(tree, tctx, &create);
    6190           8 :         torture_assert_ntstatus_equal_goto(
    6191             :                 tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done,
    6192             :                 "Unexpected status\n");
    6193             : 
    6194           8 :         status = torture_smb2_testfile_access(tree, sname, &h1,
    6195             :                                               SEC_FILE_WRITE_DATA);
    6196           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6197             :                                         "torture_smb2_testfile failed\n");
    6198             : 
    6199           8 :         ZERO_STRUCT(finfo);
    6200           8 :         finfo.generic.level = RAW_FILEINFO_STANDARD_INFORMATION;
    6201           8 :         finfo.generic.in.file.handle = h1;
    6202           8 :         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
    6203           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6204             :                                         "smb2_getinfo_file failed\n");
    6205             : 
    6206           8 :         smb2_util_close(tree, h1);
    6207             : 
    6208           8 :         torture_assert_goto(tctx, finfo.standard_info.out.size == 0,
    6209             :                             ret, done, "size != 0\n");
    6210             : 
    6211             :         /*
    6212             :          * Test setinfo end-of-file info to 1
    6213             :          */
    6214             : 
    6215           8 :         torture_comment(tctx, "Setting stream EOF to 1\n");
    6216             : 
    6217           8 :         status = torture_smb2_testfile_access(tree, sname, &h1,
    6218             :                                               SEC_FILE_WRITE_DATA);
    6219           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6220             :                                         "torture_smb2_testfile failed\n");
    6221             : 
    6222           8 :         ZERO_STRUCT(sfinfo);
    6223           8 :         sfinfo.generic.in.file.handle = h1;
    6224           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    6225           8 :         sfinfo.position_information.in.position = 1;
    6226           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    6227           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6228             :                                         "set EOF 1 failed\n");
    6229             : 
    6230           8 :         smb2_util_close(tree, h1);
    6231             : 
    6232           8 :         status = torture_smb2_testfile_access(tree, sname, &h1,
    6233             :                                               SEC_FILE_WRITE_DATA);
    6234           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6235             :                                         "torture_smb2_testfile failed\n");
    6236             : 
    6237           8 :         ZERO_STRUCT(finfo);
    6238           8 :         finfo.generic.level = RAW_FILEINFO_STANDARD_INFORMATION;
    6239           8 :         finfo.generic.in.file.handle = h1;
    6240           8 :         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
    6241           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6242             :                                         "smb2_getinfo_file failed\n");
    6243             : 
    6244           8 :         smb2_util_close(tree, h1);
    6245             : 
    6246           8 :         torture_assert_goto(tctx, finfo.standard_info.out.size == 1,
    6247             :                             ret, done, "size != 1\n");
    6248             : 
    6249             :         /*
    6250             :          * Test setting EOF to 0 with AAPL enabled, should delete stream
    6251             :          */
    6252             : 
    6253           8 :         torture_comment(tctx, "Enabling AAPL extensions\n");
    6254             : 
    6255           8 :         ret = enable_aapl(tctx, tree);
    6256           8 :         torture_assert(tctx, ret == true, "enable_aapl failed\n");
    6257             : 
    6258           8 :         torture_comment(tctx, "Setting stream EOF to 0\n");
    6259           8 :         status = torture_smb2_testfile_access(tree, sname, &h1,
    6260             :                                               SEC_FILE_WRITE_DATA);
    6261           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6262             :                                         "torture_smb2_testfile failed\n");
    6263             : 
    6264           8 :         ZERO_STRUCT(sfinfo);
    6265           8 :         sfinfo.generic.in.file.handle = h1;
    6266           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    6267           8 :         sfinfo.position_information.in.position = 0;
    6268           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    6269           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6270             :                                         "set eof 0 failed\n");
    6271             : 
    6272           8 :         ZERO_STRUCT(create);
    6273           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE;
    6274           8 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    6275           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    6276           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    6277           8 :         create.in.fname = sname;
    6278             : 
    6279           8 :         status = smb2_create(tree, tctx, &create);
    6280           8 :         torture_assert_ntstatus_equal_goto(
    6281             :                 tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done,
    6282             :                 "Unexpected status\n");
    6283             : 
    6284           8 :         smb2_util_close(tree, h1);
    6285             : 
    6286           8 :         ZERO_STRUCT(create);
    6287           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE;
    6288           8 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    6289           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    6290           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    6291           8 :         create.in.fname = sname;
    6292             : 
    6293           8 :         status = smb2_create(tree, tctx, &create);
    6294           8 :         torture_assert_ntstatus_equal_goto(
    6295             :                 tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND, ret, done,
    6296             :                 "Unexpected status\n");
    6297             : 
    6298           8 :         torture_comment(
    6299             :                 tctx, "Setting main file EOF to 1 to force 0-truncate\n");
    6300             : 
    6301           8 :         status = torture_smb2_testfile_access(
    6302             :                 tree,
    6303             :                 fname,
    6304             :                 &h1,
    6305             :                 SEC_FILE_WRITE_DATA);
    6306           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6307             :                                         "torture_smb2_testfile failed\n");
    6308             : 
    6309           8 :         ZERO_STRUCT(sfinfo);
    6310           8 :         sfinfo.generic.in.file.handle = h1;
    6311           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    6312           8 :         sfinfo.position_information.in.position = 1;
    6313           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    6314           8 :         torture_assert_ntstatus_ok_goto(
    6315             :                 tctx,
    6316             :                 status,
    6317             :                 ret,
    6318             :                 done,
    6319             :                 "set eof 1 failed\n");
    6320             : 
    6321           8 :         sfinfo.position_information.in.position = 0;
    6322           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    6323           8 :         torture_assert_ntstatus_ok_goto(
    6324             :                 tctx,
    6325             :                 status,
    6326             :                 ret,
    6327             :                 done,
    6328             :                 "set eof 0 failed\n");
    6329             : 
    6330           8 :         smb2_util_close(tree, h1);
    6331             : 
    6332           8 :         ZERO_STRUCT(create);
    6333           8 :         create.in.desired_access = SEC_FILE_READ_ATTRIBUTE;
    6334           8 :         create.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
    6335           8 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    6336           8 :         create.in.create_disposition = NTCREATEX_DISP_OPEN;
    6337           8 :         create.in.fname = fname;
    6338             : 
    6339           8 :         status = smb2_create(tree, tctx, &create);
    6340           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6341             :                                         "torture_smb2_testfile failed\n");
    6342           8 :         smb2_util_close(tree, h1);
    6343             : 
    6344           8 :         torture_comment(tctx, "Writing to stream after setting EOF to 0\n");
    6345           8 :         status = torture_smb2_testfile_access(tree, sname, &h1,
    6346             :                                               SEC_FILE_WRITE_DATA);
    6347           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6348             :                                         "torture_smb2_testfile failed\n");
    6349             : 
    6350           8 :         status = smb2_util_write(tree, h1, "1234567890", 0, 10);
    6351           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6352             :                                         "smb2_util_write failed\n");
    6353             : 
    6354           8 :         ZERO_STRUCT(sfinfo);
    6355           8 :         sfinfo.generic.in.file.handle = h1;
    6356           8 :         sfinfo.generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
    6357           8 :         sfinfo.position_information.in.position = 0;
    6358           8 :         status = smb2_setinfo_file(tree, &sfinfo);
    6359           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6360             :                                         "set eof 0 failed\n");
    6361             : 
    6362           8 :         status = smb2_util_write(tree, h1, "1234567890", 0, 10);
    6363           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6364             :                                         "smb2_util_write failed\n");
    6365             : 
    6366           8 :         smb2_util_close(tree, h1);
    6367             : 
    6368           8 : done:
    6369           8 :         smb2_util_unlink(tree, fname);
    6370           8 :         smb2_util_rmdir(tree, BASEDIR);
    6371           8 :         return ret;
    6372             : }
    6373             : 
    6374             : #define MAX_STREAMS 16
    6375             : 
    6376             : struct tcase {
    6377             :         const char *name;
    6378             :         uint32_t access;
    6379             :         const char *write_data;
    6380             :         size_t write_size;
    6381             :         struct tcase_results {
    6382             :                 size_t size;
    6383             :                 NTSTATUS initial_status;
    6384             :                 NTSTATUS final_status;
    6385             :                 int num_streams_open_handle;
    6386             :                 const char *streams_open_handle[MAX_STREAMS];
    6387             :                 int num_streams_closed_handle;
    6388             :                 const char *streams_closed_handle[MAX_STREAMS];
    6389             :         } create, write, overwrite, eof, doc;
    6390             : };
    6391             : 
    6392             : typedef enum {T_CREATE, T_WRITE, T_OVERWRITE, T_EOF, T_DOC} subtcase_t;
    6393             : 
    6394         144 : static bool test_empty_stream_do_checks(
    6395             :         struct torture_context *tctx,
    6396             :         struct smb2_tree *tree,
    6397             :         struct smb2_tree *tree2,
    6398             :         struct tcase *tcase,
    6399             :         TALLOC_CTX *mem_ctx,
    6400             :         struct smb2_handle baseh,
    6401             :         struct smb2_handle streamh,
    6402             :         subtcase_t subcase)
    6403             : {
    6404         144 :         bool ret = false;
    6405           0 :         NTSTATUS status;
    6406           0 :         struct smb2_handle h1;
    6407           0 :         union smb_fileinfo finfo;
    6408         144 :         struct tcase_results *tcase_results = NULL;
    6409             : 
    6410         144 :         switch (subcase) {
    6411          48 :         case T_CREATE:
    6412          48 :                 tcase_results = &tcase->create;
    6413          48 :                 break;
    6414          24 :         case T_OVERWRITE:
    6415          24 :                 tcase_results = &tcase->overwrite;
    6416          24 :                 break;
    6417          24 :         case T_WRITE:
    6418          24 :                 tcase_results = &tcase->write;
    6419          24 :                 break;
    6420          24 :         case T_EOF:
    6421          24 :                 tcase_results = &tcase->eof;
    6422          24 :                 break;
    6423          24 :         case T_DOC:
    6424          24 :                 tcase_results = &tcase->doc;
    6425          24 :                 break;
    6426             :         }
    6427             : 
    6428         144 :         finfo = (union smb_fileinfo) {
    6429             :                 .generic.level = RAW_FILEINFO_STANDARD_INFORMATION,
    6430             :                 .generic.in.file.handle = streamh,
    6431             :         };
    6432             : 
    6433             :         /*
    6434             :          * Test: check size, same client
    6435             :          */
    6436             : 
    6437         144 :         status = smb2_getinfo_file(tree, mem_ctx, &finfo);
    6438         144 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6439             :                                         "torture_smb2_testfile failed\n");
    6440             : 
    6441         144 :         torture_assert_int_equal_goto(tctx, finfo.standard_info.out.size,
    6442             :                                       tcase_results->size,
    6443             :                                       ret, done, "Wrong size\n");
    6444             : 
    6445             :         /*
    6446             :          * Test: open, same client
    6447             :          */
    6448             : 
    6449         144 :         status = torture_smb2_open(tree, tcase->name,
    6450             :                                    SEC_FILE_READ_ATTRIBUTE, &h1);
    6451         144 :         torture_assert_ntstatus_equal_goto(tctx, status,
    6452             :                                            tcase_results->initial_status,
    6453             :                                            ret, done,
    6454             :                                            "smb2_create failed\n");
    6455         144 :         if (NT_STATUS_IS_OK(status)) {
    6456          32 :                 status = smb2_util_close(tree, h1);
    6457          32 :                 torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6458             :                                                 "smb2_util_close failed\n");
    6459             :         }
    6460             : 
    6461             :         /*
    6462             :          * Test: check streams, same client
    6463             :          */
    6464             : 
    6465         144 :         ret = check_stream_list_handle(tree, tctx, baseh,
    6466             :                                        tcase_results->num_streams_open_handle,
    6467         144 :                                        tcase_results->streams_open_handle,
    6468             :                                        false);
    6469         144 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    6470             : 
    6471             :         /*
    6472             :          * Test: open, different client
    6473             :          */
    6474             : 
    6475         144 :         status = torture_smb2_open(tree2, tcase->name,
    6476             :                                    SEC_FILE_READ_ATTRIBUTE, &h1);
    6477         144 :         torture_assert_ntstatus_equal_goto(tctx, status,
    6478             :                                            tcase_results->initial_status,
    6479             :                                            ret, done,
    6480             :                                            "smb2_create failed\n");
    6481         144 :         if (NT_STATUS_IS_OK(status)) {
    6482          32 :                 finfo = (union smb_fileinfo) {
    6483             :                         .generic.level = RAW_FILEINFO_STANDARD_INFORMATION,
    6484             :                         .generic.in.file.handle = h1,
    6485             :                 };
    6486             : 
    6487             :                 /*
    6488             :                  * Test: check size, different client
    6489             :                  */
    6490             : 
    6491          32 :                 status = smb2_getinfo_file(tree2, mem_ctx, &finfo);
    6492          32 :                 torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6493             :                                                 "smb2_getinfo_file failed\n");
    6494             : 
    6495          32 :                 torture_assert_int_equal_goto(tctx, finfo.standard_info.out.size,
    6496             :                                               tcase_results->size,
    6497             :                                               ret, done, "Wrong size\n");
    6498             : 
    6499             :                 /*
    6500             :                  * Test: check streams, different client
    6501             :                  */
    6502             : 
    6503          32 :                 ret = check_stream_list(tree2, tctx, BASEDIR "\\file",
    6504             :                                         tcase_results->num_streams_open_handle,
    6505          32 :                                         tcase_results->streams_open_handle,
    6506             :                                         false);
    6507          32 :                 torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    6508             : 
    6509          32 :                 status = smb2_util_close(tree2, h1);
    6510          32 :                 torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6511             :                                                 "smb2_util_close failed\n");
    6512             :         }
    6513             : 
    6514         144 :         status = smb2_util_close(tree, streamh);
    6515         144 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6516             :                                         "smb2_util_close failed\n");
    6517             : 
    6518             :         /*
    6519             :          * Test: open after close, same client
    6520             :          */
    6521             : 
    6522         144 :         status = torture_smb2_open(tree, tcase->name,
    6523             :                                    SEC_FILE_READ_DATA, &h1);
    6524         144 :         torture_assert_ntstatus_equal_goto(tctx, status,
    6525             :                                            tcase_results->final_status,
    6526             :                                            ret, done,
    6527             :                                            "smb2_create failed\n");
    6528         144 :         if (NT_STATUS_IS_OK(status)) {
    6529          40 :                 status = smb2_util_close(tree, h1);
    6530          40 :                 torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6531             :                                                 "smb2_util_close failed\n");
    6532             :         }
    6533             : 
    6534             :         /*
    6535             :          * Test: open after close, different client
    6536             :          */
    6537             : 
    6538         144 :         status = torture_smb2_open(tree2, tcase->name,
    6539             :                                    SEC_FILE_READ_DATA, &h1);
    6540         144 :         torture_assert_ntstatus_equal_goto(tctx, status,
    6541             :                                            tcase_results->final_status,
    6542             :                                            ret, done,
    6543             :                                            "smb2_create failed\n");
    6544         144 :         if (NT_STATUS_IS_OK(status)) {
    6545          40 :                 status = smb2_util_close(tree2, h1);
    6546          40 :                 torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6547             :                                                 "smb2_util_close failed\n");
    6548             :         }
    6549             : 
    6550             :         /*
    6551             :          * Test: check streams after close, same client
    6552             :          */
    6553             : 
    6554         144 :         ret = check_stream_list_handle(tree, tctx, baseh,
    6555             :                                        tcase_results->num_streams_closed_handle,
    6556         144 :                                        tcase_results->streams_closed_handle,
    6557             :                                        false);
    6558         144 :         torture_assert_goto(tctx, ret == true, ret, done, "Bad streams");
    6559             : 
    6560         144 :         ret = true;
    6561             : 
    6562         144 : done:
    6563         144 :         smb2_util_close(tree, streamh);
    6564         144 :         smb2_util_close(tree, baseh);
    6565         144 :         return ret;
    6566             : }
    6567             : 
    6568          48 : static bool test_empty_stream_do_one(
    6569             :         struct torture_context *tctx,
    6570             :         struct smb2_tree *tree,
    6571             :         struct smb2_tree *tree2,
    6572             :         struct tcase *tcase)
    6573             : {
    6574          48 :         bool ret = false;
    6575           0 :         NTSTATUS status;
    6576          48 :         struct smb2_handle baseh = {{0}};
    6577           0 :         struct smb2_handle streamh;
    6578           0 :         struct smb2_create create;
    6579           0 :         union smb_setfileinfo sfinfo;
    6580          48 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    6581             : 
    6582          48 :         torture_comment(tctx, "Testing stream [%s]\n", tcase->name);
    6583             : 
    6584          48 :         torture_assert_goto(tctx, mem_ctx != NULL, ret, done, "talloc_new\n");
    6585             : 
    6586             :         /*
    6587             :          * Subtest: create
    6588             :          */
    6589          48 :         torture_comment(tctx, "Subtest: T_CREATE\n");
    6590             : 
    6591          48 :         status = smb2_util_unlink(tree, BASEDIR "\\file");
    6592          48 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6593             :                                         "smb2_util_unlink failed\n");
    6594             : 
    6595          48 :         status = torture_smb2_testfile_access(tree, BASEDIR "\\file",
    6596             :                                               &baseh, SEC_FILE_ALL);
    6597          48 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6598             :                                         "torture_smb2_testfile_access failed\n");
    6599             : 
    6600          48 :         status = torture_smb2_testfile_access(tree, tcase->name, &streamh,
    6601             :                                               tcase->access);
    6602          48 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6603             :                                         "torture_smb2_testfile_access failed\n");
    6604             : 
    6605          48 :         ret = test_empty_stream_do_checks(tctx, tree, tree2, tcase,
    6606             :                                           mem_ctx, baseh, streamh, T_CREATE);
    6607          48 :         torture_assert_goto(tctx, ret, ret, done, "test failed\n");
    6608             : 
    6609          48 :         if (!(tcase->access & SEC_FILE_WRITE_DATA)) {
    6610             :                 /*
    6611             :                  * All subsequent tests require write access
    6612             :                  */
    6613          24 :                 ret = true;
    6614          24 :                 goto done;
    6615             :         }
    6616             : 
    6617             :         /*
    6618             :          * Subtest: create and write
    6619             :          */
    6620          24 :         torture_comment(tctx, "Subtest: T_WRITE\n");
    6621             : 
    6622          24 :         status = smb2_util_unlink(tree, BASEDIR "\\file");
    6623          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6624             :                                         "smb2_util_unlink failed\n");
    6625             : 
    6626          24 :         status = torture_smb2_testfile_access(tree, BASEDIR "\\file",
    6627             :                                               &baseh, SEC_FILE_ALL);
    6628          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6629             :                                         "torture_smb2_testfile_access failed\n");
    6630             : 
    6631          24 :         status = torture_smb2_testfile_access(tree, tcase->name, &streamh,
    6632             :                                               tcase->access);
    6633          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6634             :                                         "torture_smb2_testfile_access failed\n");
    6635             : 
    6636          24 :         status = smb2_util_write(tree, streamh, tcase->write_data, 0,
    6637             :                                  tcase->write_size);
    6638          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6639             :                                         "torture_smb2_open failed\n");
    6640             : 
    6641          24 :         ret = test_empty_stream_do_checks(tctx, tree, tree2, tcase,
    6642             :                                           mem_ctx, baseh, streamh, T_WRITE);
    6643          24 :         torture_assert_goto(tctx, ret, ret, done, "test failed\n");
    6644             : 
    6645             :         /*
    6646             :          * Subtest: overwrite
    6647             :          */
    6648          24 :         torture_comment(tctx, "Subtest: T_OVERWRITE\n");
    6649             : 
    6650          24 :         status = smb2_util_unlink(tree, BASEDIR "\\file");
    6651          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6652             :                                         "smb2_util_unlink failed\n");
    6653             : 
    6654          24 :         status = torture_smb2_testfile_access(tree, BASEDIR "\\file",
    6655             :                                               &baseh, SEC_FILE_ALL);
    6656          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6657             :                                         "torture_smb2_testfile_access failed\n");
    6658             : 
    6659          24 :         create = (struct smb2_create) {
    6660             :                 .in.desired_access = SEC_FILE_ALL,
    6661             :                 .in.share_access = NTCREATEX_SHARE_ACCESS_MASK,
    6662             :                 .in.file_attributes = FILE_ATTRIBUTE_NORMAL,
    6663             :                 .in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF,
    6664          24 :                 .in.fname = tcase->name,
    6665             :         };
    6666             : 
    6667          24 :         status = smb2_create(tree, tctx, &create);
    6668          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6669             :                                         "torture_smb2_testfile failed\n");
    6670          24 :         streamh = create.out.file.handle;
    6671             : 
    6672          24 :         ret = test_empty_stream_do_checks(tctx, tree, tree2, tcase,
    6673             :                                           mem_ctx, baseh, streamh, T_OVERWRITE);
    6674          24 :         torture_assert_goto(tctx, ret, ret, done, "test failed\n");
    6675             : 
    6676             :         /*
    6677             :          * Subtest: setinfo EOF 0
    6678             :          */
    6679          24 :         torture_comment(tctx, "Subtest: T_EOF\n");
    6680             : 
    6681          24 :         status = smb2_util_unlink(tree, BASEDIR "\\file");
    6682          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6683             :                                         "smb2_util_unlink failed\n");
    6684             : 
    6685          24 :         status = torture_smb2_testfile_access(tree, BASEDIR "\\file",
    6686             :                                               &baseh, SEC_FILE_ALL);
    6687          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6688             :                                         "torture_smb2_testfile_access failed\n");
    6689             : 
    6690          24 :         status = torture_smb2_testfile_access(tree, tcase->name, &streamh,
    6691             :                                               tcase->access);
    6692          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6693             :                                         "torture_smb2_testfile_access failed\n");
    6694             : 
    6695          24 :         status = smb2_util_write(tree, streamh, tcase->write_data, 0,
    6696             :                                  tcase->write_size);
    6697          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6698             :                                         "torture_smb2_open failed\n");
    6699             : 
    6700          24 :         sfinfo = (union smb_setfileinfo) {
    6701             :                 .end_of_file_info.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION,
    6702             :                 .end_of_file_info.in.file.handle = streamh,
    6703             :                 .end_of_file_info.in.size = 0,
    6704             :         };
    6705          24 :         status = smb2_setinfo_file(tree, &sfinfo);
    6706          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6707             :                                         "set eof 0 failed\n");
    6708             : 
    6709          24 :         ret = test_empty_stream_do_checks(tctx, tree, tree2, tcase,
    6710             :                                           mem_ctx, baseh, streamh, T_EOF);
    6711          24 :         torture_assert_goto(tctx, ret, ret, done, "test failed\n");
    6712             : 
    6713             :         /*
    6714             :          * Subtest: delete-on-close
    6715             :          */
    6716          24 :         torture_comment(tctx, "Subtest: T_DOC\n");
    6717             : 
    6718          24 :         status = smb2_util_unlink(tree, BASEDIR "\\file");
    6719          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6720             :                                         "smb2_util_unlink failed\n");
    6721             : 
    6722          24 :         status = torture_smb2_testfile_access(tree, BASEDIR "\\file",
    6723             :                                               &baseh, SEC_FILE_ALL);
    6724          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6725             :                                         "torture_smb2_testfile_access failed\n");
    6726             : 
    6727          24 :         status = torture_smb2_testfile_access(tree, tcase->name, &streamh,
    6728             :                                               tcase->access);
    6729          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6730             :                                         "torture_smb2_testfile_access failed\n");
    6731             : 
    6732          24 :         status = smb2_util_write(tree, streamh, tcase->write_data, 0,
    6733             :                                  tcase->write_size);
    6734          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6735             :                                         "torture_smb2_open failed\n");
    6736             : 
    6737          24 :         sfinfo = (union smb_setfileinfo) {
    6738             :                 .disposition_info.level = RAW_SFILEINFO_DISPOSITION_INFORMATION,
    6739             :                 .disposition_info.in.file.handle = streamh,
    6740             :                 .disposition_info.in.delete_on_close = true,
    6741             :         };
    6742          24 :         status = smb2_setinfo_file(tree, &sfinfo);
    6743          24 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6744             :                                         "set eof 0 failed\n");
    6745             : 
    6746          24 :         ret = test_empty_stream_do_checks(tctx, tree, tree2, tcase,
    6747             :                                           mem_ctx, baseh, streamh,
    6748             :                                           T_DOC);
    6749          24 :         torture_assert_goto(tctx, ret, ret, done, "test failed\n");
    6750             : 
    6751          24 :         ret = true;
    6752             : 
    6753          48 : done:
    6754          48 :         smb2_util_close(tree, baseh);
    6755          48 :         TALLOC_FREE(mem_ctx);
    6756          48 :         return ret;
    6757             : }
    6758             : 
    6759           8 : static bool test_empty_stream(struct torture_context *tctx,
    6760             :                               struct smb2_tree *tree)
    6761             : {
    6762           8 :         struct smb2_tree *tree2 = NULL;
    6763           8 :         struct tcase *tcase = NULL;
    6764           8 :         const char *fname = BASEDIR "\\file";
    6765           0 :         struct smb2_handle h1;
    6766           8 :         bool ret = true;
    6767           0 :         NTSTATUS status;
    6768           8 :         AfpInfo ai = (AfpInfo) {
    6769             :                 .afpi_Signature = AFP_Signature,
    6770             :                 .afpi_Version = AFP_Version,
    6771             :                 .afpi_BackupTime = AFP_BackupTime,
    6772             :                 .afpi_FinderInfo = "FOO BAR ",
    6773             :         };
    6774           8 :         char *ai_blob = torture_afpinfo_pack(tctx, &ai);
    6775           8 :         struct tcase tcase_afpinfo_ro = (struct tcase) {
    6776             :                 .name = BASEDIR "\\file" AFPINFO_STREAM,
    6777             :                 .access = SEC_FILE_READ_DATA|SEC_FILE_READ_ATTRIBUTE,
    6778             :                 .create = {
    6779             :                         .size = 60,
    6780             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6781             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6782             :                         .num_streams_open_handle = 1,
    6783             :                         .num_streams_closed_handle = 1,
    6784             :                         .streams_open_handle = {"::$DATA"},
    6785             :                         .streams_closed_handle = {"::$DATA"},
    6786             :                 },
    6787             :         };
    6788           8 :         struct tcase tcase_afpinfo_rw = (struct tcase) {
    6789             :                 .name = BASEDIR "\\file" AFPINFO_STREAM,
    6790             :                 .access = SEC_FILE_READ_DATA|SEC_FILE_READ_ATTRIBUTE|SEC_FILE_WRITE_DATA|SEC_STD_DELETE,
    6791             :                 .write_data = ai_blob,
    6792             :                 .write_size = AFP_INFO_SIZE,
    6793             :                 .create = {
    6794             :                         .size = 60,
    6795             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6796             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6797             :                         .num_streams_open_handle = 1,
    6798             :                         .num_streams_closed_handle = 1,
    6799             :                         .streams_open_handle = {"::$DATA"},
    6800             :                         .streams_closed_handle = {"::$DATA"},
    6801             :                 },
    6802             :                 .write = {
    6803             :                         .size = 60,
    6804             :                         .initial_status = NT_STATUS_OK,
    6805             :                         .final_status = NT_STATUS_OK,
    6806             :                         .num_streams_open_handle = 2,
    6807             :                         .num_streams_closed_handle = 2,
    6808             :                         .streams_open_handle = {"::$DATA", AFPINFO_STREAM},
    6809             :                         .streams_closed_handle = {"::$DATA", AFPINFO_STREAM},
    6810             :                 },
    6811             :                 .overwrite = {
    6812             :                         .size = 60,
    6813             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6814             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6815             :                         .num_streams_open_handle = 1,
    6816             :                         .num_streams_closed_handle = 1,
    6817             :                         .streams_open_handle = {"::$DATA"},
    6818             :                         .streams_closed_handle = {"::$DATA"},
    6819             :                 },
    6820             :                 .eof = {
    6821             :                         .size = 60,
    6822             :                         .initial_status = NT_STATUS_OK,
    6823             :                         .final_status = NT_STATUS_OK,
    6824             :                         .num_streams_open_handle = 2,
    6825             :                         .num_streams_closed_handle = 2,
    6826             :                         .streams_open_handle = {"::$DATA", AFPINFO_STREAM},
    6827             :                         .streams_closed_handle = {"::$DATA", AFPINFO_STREAM},
    6828             :                 },
    6829             :                 .doc = {
    6830             :                         .size = 60,
    6831             :                         .initial_status = NT_STATUS_DELETE_PENDING,
    6832             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6833             :                         .num_streams_open_handle = 2,
    6834             :                         .num_streams_closed_handle = 1,
    6835             :                         .streams_open_handle = {"::$DATA", AFPINFO_STREAM},
    6836             :                         .streams_closed_handle = {"::$DATA"},
    6837             :                 },
    6838             :         };
    6839             : 
    6840           8 :         struct tcase tcase_afpresource_ro = (struct tcase) {
    6841             :                 .name = BASEDIR "\\file" AFPRESOURCE_STREAM,
    6842             :                 .access = SEC_FILE_READ_DATA|SEC_FILE_READ_ATTRIBUTE,
    6843             :                 .create = {
    6844             :                         .size = 0,
    6845             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6846             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6847             :                         .num_streams_open_handle = 1,
    6848             :                         .num_streams_closed_handle = 1,
    6849             :                         .streams_open_handle = {"::$DATA"},
    6850             :                         .streams_closed_handle = {"::$DATA"},
    6851             :                 },
    6852             :         };
    6853           8 :         struct tcase tcase_afpresource_rw = (struct tcase) {
    6854             :                 .name = BASEDIR "\\file" AFPRESOURCE_STREAM,
    6855             :                 .access = SEC_FILE_READ_DATA|SEC_FILE_READ_ATTRIBUTE|SEC_FILE_WRITE_DATA|SEC_STD_DELETE,
    6856             :                 .write_data = "foo",
    6857             :                 .write_size = 3,
    6858             :                 .create = {
    6859             :                         .size = 0,
    6860             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6861             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6862             :                         .num_streams_open_handle = 1,
    6863             :                         .num_streams_closed_handle = 1,
    6864             :                         .streams_open_handle = {"::$DATA"},
    6865             :                         .streams_closed_handle = {"::$DATA"},
    6866             :                 },
    6867             :                 .write = {
    6868             :                         .size = 3,
    6869             :                         .initial_status = NT_STATUS_OK,
    6870             :                         .final_status = NT_STATUS_OK,
    6871             :                         .num_streams_open_handle = 2,
    6872             :                         .num_streams_closed_handle = 2,
    6873             :                         .streams_open_handle = {"::$DATA", AFPRESOURCE_STREAM},
    6874             :                         .streams_closed_handle = {"::$DATA", AFPRESOURCE_STREAM},
    6875             :                 },
    6876             :                 .overwrite = {
    6877             :                         .size = 0,
    6878             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6879             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6880             :                         .num_streams_open_handle = 1,
    6881             :                         .num_streams_closed_handle = 1,
    6882             :                         .streams_open_handle = {"::$DATA"},
    6883             :                         .streams_closed_handle = {"::$DATA"},
    6884             :                 },
    6885             :                 .eof = {
    6886             :                         .size = 0,
    6887             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6888             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6889             :                         .num_streams_open_handle = 1,
    6890             :                         .num_streams_closed_handle = 1,
    6891             :                         .streams_open_handle = {"::$DATA"},
    6892             :                         .streams_closed_handle = {"::$DATA"},
    6893             :                 },
    6894             :                 .doc = {
    6895             :                         .size = 3,
    6896             :                         .initial_status = NT_STATUS_DELETE_PENDING,
    6897             :                         .final_status = NT_STATUS_OK,
    6898             :                         .num_streams_open_handle = 2,
    6899             :                         .num_streams_closed_handle = 2,
    6900             :                         .streams_open_handle = {"::$DATA", AFPRESOURCE_STREAM},
    6901             :                         .streams_closed_handle = {"::$DATA", AFPRESOURCE_STREAM},
    6902             :                 },
    6903             :         };
    6904             : 
    6905           8 :         struct tcase tcase_foo_ro = (struct tcase) {
    6906             :                 .name = BASEDIR "\\file:foo",
    6907             :                 .access = SEC_FILE_READ_DATA|SEC_FILE_READ_ATTRIBUTE,
    6908             :                 .write_data = "foo",
    6909             :                 .write_size = 3,
    6910             :                 .create = {
    6911             :                         .size = 0,
    6912             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6913             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6914             :                         .num_streams_open_handle = 1,
    6915             :                         .num_streams_closed_handle = 1,
    6916             :                         .streams_open_handle = {"::$DATA"},
    6917             :                         .streams_closed_handle = {"::$DATA"},
    6918             :                 },
    6919             :         };
    6920             : 
    6921           8 :         struct tcase tcase_foo_rw = (struct tcase) {
    6922             :                 .name = BASEDIR "\\file:foo",
    6923             :                 .access = SEC_FILE_READ_DATA|SEC_FILE_READ_ATTRIBUTE|SEC_FILE_WRITE_DATA|SEC_STD_DELETE,
    6924             :                 .write_data = "foo",
    6925             :                 .write_size = 3,
    6926             :                 .create = {
    6927             :                         .size = 0,
    6928             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6929             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6930             :                         .num_streams_open_handle = 1,
    6931             :                         .num_streams_closed_handle = 1,
    6932             :                         .streams_open_handle = {"::$DATA"},
    6933             :                         .streams_closed_handle = {"::$DATA"},
    6934             :                 },
    6935             :                 .write = {
    6936             :                         .size = 3,
    6937             :                         .initial_status = NT_STATUS_OK,
    6938             :                         .final_status = NT_STATUS_OK,
    6939             :                         .num_streams_open_handle = 2,
    6940             :                         .num_streams_closed_handle = 2,
    6941             :                         .streams_open_handle = {"::$DATA", ":foo:$DATA"},
    6942             :                         .streams_closed_handle = {"::$DATA", ":foo:$DATA"},
    6943             :                 },
    6944             :                 .overwrite = {
    6945             :                         .size = 0,
    6946             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6947             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6948             :                         .num_streams_open_handle = 1,
    6949             :                         .num_streams_closed_handle = 1,
    6950             :                         .streams_open_handle = {"::$DATA"},
    6951             :                         .streams_closed_handle = {"::$DATA"},
    6952             :                 },
    6953             :                 .eof = {
    6954             :                         .size = 0,
    6955             :                         .initial_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6956             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6957             :                         .num_streams_open_handle = 1,
    6958             :                         .num_streams_closed_handle = 1,
    6959             :                         .streams_open_handle = {"::$DATA"},
    6960             :                         .streams_closed_handle = {"::$DATA"},
    6961             :                 },
    6962             :                 .doc = {
    6963             :                         .size = 3,
    6964             :                         .initial_status = NT_STATUS_DELETE_PENDING,
    6965             :                         .final_status = NT_STATUS_OBJECT_NAME_NOT_FOUND,
    6966             :                         .num_streams_open_handle = 2,
    6967             :                         .num_streams_closed_handle = 1,
    6968             :                         .streams_open_handle = {"::$DATA", ":foo:$DATA"},
    6969             :                         .streams_closed_handle = {"::$DATA"},
    6970             :                 },
    6971             :         };
    6972             : 
    6973           8 :         struct tcase tcases[] = {
    6974             :                 tcase_afpinfo_ro,
    6975             :                 tcase_afpinfo_rw,
    6976             :                 tcase_afpresource_ro,
    6977             :                 tcase_afpresource_rw,
    6978             :                 tcase_foo_ro,
    6979             :                 tcase_foo_rw,
    6980             :                 {0}
    6981             :         };
    6982             : 
    6983           8 :         ret = torture_smb2_connection(tctx, &tree2);
    6984           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    6985             :                             "torture_smb2_connection failed\n");
    6986             : 
    6987           8 :         ret = enable_aapl(tctx, tree);
    6988           8 :         torture_assert(tctx, ret == true, "enable_aapl failed\n");
    6989             : 
    6990           8 :         ret = enable_aapl(tctx, tree2);
    6991           8 :         torture_assert(tctx, ret == true, "enable_aapl failed\n");
    6992             : 
    6993           8 :         smb2_deltree(tree, BASEDIR);
    6994             : 
    6995           8 :         status = torture_smb2_testdir(tree, BASEDIR, &h1);
    6996           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    6997             :                                         "torture_smb2_testdir\n");
    6998           8 :         smb2_util_close(tree, h1);
    6999             : 
    7000          56 :         for (tcase = &tcases[0]; tcase->name != NULL; tcase++) {
    7001          48 :                 ret = torture_setup_file(tctx, tree, fname, false);
    7002          48 :                 torture_assert_goto(tctx, ret == true, ret, done,
    7003             :                                     "torture_setup_file failed\n");
    7004             : 
    7005          48 :                 ret = test_empty_stream_do_one(tctx, tree, tree2, tcase);
    7006          48 :                 torture_assert_goto(tctx, ret == true, ret, done,
    7007             :                                     "subtest failed\n");
    7008             : 
    7009          48 :                 status = smb2_util_unlink(tree, fname);
    7010          48 :                 torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    7011             :                                                 "smb2_util_unlink failed\n");
    7012             :         }
    7013             : 
    7014           8 : done:
    7015           8 :         smb2_deltree(tree, BASEDIR);
    7016           8 :         TALLOC_FREE(tree2);
    7017           8 :         return ret;
    7018             : }
    7019             : 
    7020             : /*
    7021             : -------------------------------------------------------------------------------
    7022             : MagicNumber: 00051607                                        : AppleDouble
    7023             : Version    : 00020000                                        : Version 2
    7024             : Filler     : 4D 61 63 20 4F 53 20 58 20 20 20 20 20 20 20 20 : Mac OS X
    7025             : Num. of ent: 0002                                            : 2
    7026             : 
    7027             : -------------------------------------------------------------------------------
    7028             : Entry ID   : 00000009 : Finder Info
    7029             : Offset     : 00000032 : 50
    7030             : Length     : 00000EB0 : 3760
    7031             : 
    7032             : -DInfo-----:
    7033             : Rect top   : 0000     : 0
    7034             : Rect left  : 0000     : 0
    7035             : Rect bottom: 0000     : 0
    7036             : Rect right : 0000     : 0
    7037             : isAlias    : 0
    7038             : Invisible  : 0
    7039             : hasBundle  : 0
    7040             : nameLocked : 0
    7041             : Stationery : 0
    7042             : CustomIcon : 0
    7043             : Reserved   : 0
    7044             : Inited     : 1
    7045             : NoINITS    : 0
    7046             : Shared     : 0
    7047             : SwitchLaunc: 0
    7048             : Hidden Ext : 0
    7049             : color      : 000      : none
    7050             : isOnDesk   : 0
    7051             : Location v : 0000     : 0
    7052             : Location h : 0000     : 0
    7053             : View       : 0000     : ..
    7054             : 
    7055             : -DXInfo----:
    7056             : Scroll v   : 0000     : 0
    7057             : Scroll h   : 0000     : 0
    7058             : Rsvd|OpnChn: 00000000 : 0
    7059             : AreInvalid : 0
    7060             : unknown bit: 0
    7061             : unknown bit: 0
    7062             : unknown bit: 0
    7063             : unknown bit: 0
    7064             : unknown bit: 0
    7065             : unknown bit: 0
    7066             : CustomBadge: 0
    7067             : ObjctIsBusy: 0
    7068             : unknown bit: 0
    7069             : unknown bit: 0
    7070             : unknown bit: 0
    7071             : unknown bit: 0
    7072             : RoutingInfo: 0
    7073             : unknown bit: 0
    7074             : unknown bit: 0
    7075             : Comment    : 0000     : ..
    7076             : PutAway    : 00000000 : 0
    7077             : 
    7078             : -EA--------:
    7079             : pad        : 0000     : ..
    7080             : magic      : 41545452 : ATTR
    7081             : debug_tag  : 0081714C : 8483148
    7082             : total_size : 00000EE2 : 3810
    7083             : data_start : 00000098 : 152
    7084             : data_length: 00000039 : 57
    7085             : reserved[0]: 00000000 : ....
    7086             : reserved[1]: 00000000 : ....
    7087             : reserved[2]: 00000000 : ....
    7088             : flags      : 0000     : ..
    7089             : num_attrs  : 0001     : 1
    7090             : -EA ENTRY--:
    7091             : offset     : 00000098 : 152
    7092             : length     : 00000039 : 57
    7093             : flags      : 0000     : ..
    7094             : namelen    : 15       : 21
    7095             : -EA NAME---:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    7096             : 00000000   : 63 6F 6D 2E 61 70 70 6C 65 2E 71 75 61 72 61 6E : com.apple.quaran
    7097             : 00000010   : 74 69 6E 65 00                                  : tine.
    7098             : -EA VALUE--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    7099             : 00000000   : 30 30 38 31 3B 36 32 65 61 33 37 66 64 3B 43 68 : 0081;62ea37fd;Ch
    7100             : 00000010   : 72 6F 6D 65 3B 42 35 39 46 42 39 45 44 2D 35 41 : rome;B59FB9ED-5A
    7101             : 00000020   : 32 39 2D 34 45 35 42 2D 38 35 36 43 2D 37 45 44 : 29-4E5B-856C-7ED
    7102             : 00000030   : 30 45 46 45 41 37 30 41 43                      : 0EFEA70AC
    7103             : 
    7104             : -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    7105             : 00000000   : 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 : ................
    7106             : 00000010   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7107             : 00000020   : 00 00 41 54 54 52 00 81 71 4C 00 00 0E E2 00 00 : ..ATTR..qL......
    7108             : 00000030   : 00 98 00 00 00 39 00 00 00 00 00 00 00 00 00 00 : .....9..........
    7109             : 00000040   : 00 00 00 00 00 01 00 00 00 98 00 00 00 39 00 00 : .............9..
    7110             : 00000050   : 15 63 6F 6D 2E 61 70 70 6C 65 2E 71 75 61 72 61 : .com.apple.quara
    7111             : 00000060   : 6E 74 69 6E 65 00 30 30 38 31 3B 36 32 65 61 33 : ntine.0081;62ea3
    7112             : 00000070   : 37 66 64 3B 43 68 72 6F 6D 65 3B 42 35 39 46 42 : 7fd;Chrome;B59FB
    7113             : 00000080   : 39 45 44 2D 35 41 32 39 2D 34 45 35 42 2D 38 35 : 9ED-5A29-4E5B-85
    7114             : 00000090   : 36 43 2D 37 45 44 30 45 46 45 41 37 30 41 43 00 : 6C-7ED0EFEA70AC.
    7115             : 000000A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7116             : 000000B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7117             : 000000C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7118             : 000000D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7119             : 000000E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7120             : 000000F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7121             : 00000100   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7122             : 00000110   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7123             : 00000120   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7124             : 00000130   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7125             : 00000140   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7126             : 00000150   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7127             : 00000160   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7128             : 00000170   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7129             : 00000180   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7130             : 00000190   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7131             : 000001A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7132             : 000001B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7133             : 000001C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7134             : 000001D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7135             : 000001E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7136             : 000001F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7137             : 00000200   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7138             : 00000210   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7139             : 00000220   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7140             : 00000230   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7141             : 00000240   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7142             : 00000250   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7143             : 00000260   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7144             : 00000270   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7145             : 00000280   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7146             : 00000290   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7147             : 000002A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7148             : 000002B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7149             : 000002C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7150             : 000002D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7151             : 000002E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7152             : 000002F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7153             : 00000300   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7154             : 00000310   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7155             : 00000320   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7156             : 00000330   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7157             : 00000340   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7158             : 00000350   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7159             : 00000360   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7160             : 00000370   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7161             : 00000380   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7162             : 00000390   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7163             : 000003A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7164             : 000003B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7165             : 000003C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7166             : 000003D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7167             : 000003E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7168             : 000003F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7169             : 00000400   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7170             : 00000410   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7171             : 00000420   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7172             : 00000430   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7173             : 00000440   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7174             : 00000450   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7175             : 00000460   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7176             : 00000470   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7177             : 00000480   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7178             : 00000490   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7179             : 000004A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7180             : 000004B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7181             : 000004C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7182             : 000004D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7183             : 000004E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7184             : 000004F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7185             : 00000500   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7186             : 00000510   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7187             : 00000520   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7188             : 00000530   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7189             : 00000540   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7190             : 00000550   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7191             : 00000560   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7192             : 00000570   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7193             : 00000580   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7194             : 00000590   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7195             : 000005A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7196             : 000005B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7197             : 000005C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7198             : 000005D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7199             : 000005E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7200             : 000005F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7201             : 00000600   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7202             : 00000610   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7203             : 00000620   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7204             : 00000630   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7205             : 00000640   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7206             : 00000650   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7207             : 00000660   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7208             : 00000670   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7209             : 00000680   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7210             : 00000690   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7211             : 000006A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7212             : 000006B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7213             : 000006C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7214             : 000006D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7215             : 000006E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7216             : 000006F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7217             : 00000700   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7218             : 00000710   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7219             : 00000720   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7220             : 00000730   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7221             : 00000740   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7222             : 00000750   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7223             : 00000760   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7224             : 00000770   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7225             : 00000780   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7226             : 00000790   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7227             : 000007A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7228             : 000007B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7229             : 000007C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7230             : 000007D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7231             : 000007E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7232             : 000007F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7233             : 00000800   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7234             : 00000810   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7235             : 00000820   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7236             : 00000830   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7237             : 00000840   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7238             : 00000850   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7239             : 00000860   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7240             : 00000870   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7241             : 00000880   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7242             : 00000890   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7243             : 000008A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7244             : 000008B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7245             : 000008C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7246             : 000008D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7247             : 000008E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7248             : 000008F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7249             : 00000900   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7250             : 00000910   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7251             : 00000920   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7252             : 00000930   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7253             : 00000940   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7254             : 00000950   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7255             : 00000960   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7256             : 00000970   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7257             : 00000980   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7258             : 00000990   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7259             : 000009A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7260             : 000009B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7261             : 000009C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7262             : 000009D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7263             : 000009E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7264             : 000009F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7265             : 00000A00   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7266             : 00000A10   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7267             : 00000A20   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7268             : 00000A30   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7269             : 00000A40   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7270             : 00000A50   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7271             : 00000A60   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7272             : 00000A70   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7273             : 00000A80   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7274             : 00000A90   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7275             : 00000AA0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7276             : 00000AB0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7277             : 00000AC0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7278             : 00000AD0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7279             : 00000AE0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7280             : 00000AF0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7281             : 00000B00   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7282             : 00000B10   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7283             : 00000B20   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7284             : 00000B30   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7285             : 00000B40   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7286             : 00000B50   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7287             : 00000B60   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7288             : 00000B70   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7289             : 00000B80   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7290             : 00000B90   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7291             : 00000BA0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7292             : 00000BB0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7293             : 00000BC0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7294             : 00000BD0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7295             : 00000BE0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7296             : 00000BF0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7297             : 00000C00   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7298             : 00000C10   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7299             : 00000C20   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7300             : 00000C30   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7301             : 00000C40   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7302             : 00000C50   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7303             : 00000C60   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7304             : 00000C70   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7305             : 00000C80   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7306             : 00000C90   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7307             : 00000CA0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7308             : 00000CB0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7309             : 00000CC0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7310             : 00000CD0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7311             : 00000CE0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7312             : 00000CF0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7313             : 00000D00   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7314             : 00000D10   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7315             : 00000D20   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7316             : 00000D30   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7317             : 00000D40   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7318             : 00000D50   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7319             : 00000D60   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7320             : 00000D70   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7321             : 00000D80   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7322             : 00000D90   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7323             : 00000DA0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7324             : 00000DB0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7325             : 00000DC0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7326             : 00000DD0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7327             : 00000DE0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7328             : 00000DF0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7329             : 00000E00   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7330             : 00000E10   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7331             : 00000E20   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7332             : 00000E30   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7333             : 00000E40   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7334             : 00000E50   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7335             : 00000E60   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7336             : 00000E70   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7337             : 00000E80   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7338             : 00000E90   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7339             : 00000EA0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7340             : 
    7341             : -------------------------------------------------------------------------------
    7342             : Entry ID   : 00000002 : Resource Fork
    7343             : Offset     : 00000EE2 : 3810
    7344             : Length     : 0000011E : 286
    7345             : 
    7346             : -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    7347             : 00000000   : 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1E : ................
    7348             : 00000010   : 54 68 69 73 20 72 65 73 6F 75 72 63 65 20 66 6F : This resource fo
    7349             : 00000020   : 72 6B 20 69 6E 74 65 6E 74 69 6F 6E 61 6C 6C 79 : rk intentionally
    7350             : 00000030   : 20 6C 65 66 74 20 62 6C 61 6E 6B 20 20 20 00 00 :  left blank   ..
    7351             : 00000040   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7352             : 00000050   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7353             : 00000060   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7354             : 00000070   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7355             : 00000080   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7356             : 00000090   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7357             : 000000A0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7358             : 000000B0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7359             : 000000C0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7360             : 000000D0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7361             : 000000E0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7362             : 000000F0   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    7363             : 00000100   : 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 1E : ................
    7364             : 00000110   : 00 00 00 00 00 00 00 00 00 1C 00 1E FF FF       : ..............
    7365             : */
    7366             : 
    7367             : static char osx_adouble_dir_w_xattr[] = {
    7368             :         0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00,
    7369             :         0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58,
    7370             :         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
    7371             :         0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00,
    7372             :         0x00, 0x32, 0x00, 0x00, 0x0e, 0xb0, 0x00, 0x00,
    7373             :         0x00, 0x02, 0x00, 0x00, 0x0e, 0xe2, 0x00, 0x00,
    7374             :         0x01, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7375             :         0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
    7376             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7377             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7378             :         0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x54, 0x52,
    7379             :         0x00, 0x81, 0x71, 0x4c, 0x00, 0x00, 0x0e, 0xe2,
    7380             :         0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x39,
    7381             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7382             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    7383             :         0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x39,
    7384             :         0x00, 0x00, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x61,
    7385             :         0x70, 0x70, 0x6c, 0x65, 0x2e, 0x71, 0x75, 0x61,
    7386             :         0x72, 0x61, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x00,
    7387             :         0x30, 0x30, 0x38, 0x31, 0x3b, 0x36, 0x32, 0x65,
    7388             :         0x61, 0x33, 0x37, 0x66, 0x64, 0x3b, 0x43, 0x68,
    7389             :         0x72, 0x6f, 0x6d, 0x65, 0x3b, 0x42, 0x35, 0x39,
    7390             :         0x46, 0x42, 0x39, 0x45, 0x44, 0x2d, 0x35, 0x41,
    7391             :         0x32, 0x39, 0x2d, 0x34, 0x45, 0x35, 0x42, 0x2d,
    7392             :         0x38, 0x35, 0x36, 0x43, 0x2d, 0x37, 0x45, 0x44,
    7393             :         0x30, 0x45, 0x46, 0x45, 0x41, 0x37, 0x30, 0x41,
    7394             :         0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7395             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7396             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7397             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7398             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7399             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7400             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7401             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7402             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7403             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7404             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7405             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7406             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7407             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7408             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7409             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7410             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7411             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7412             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7413             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7414             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7415             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7416             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7417             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7418             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7419             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7420             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7421             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7422             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7423             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7424             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7425             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7426             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7427             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7428             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7429             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7430             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7431             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7432             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7433             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7434             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7435             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7436             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7437             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7438             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7439             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7440             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7441             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7442             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7443             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7444             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7445             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7446             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7447             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7448             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7449             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7450             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7451             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7452             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7453             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7454             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7455             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7456             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7457             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7458             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7459             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7460             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7461             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7462             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7463             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7464             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7465             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7466             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7467             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7468             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7469             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7470             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7471             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7472             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7473             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7474             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7475             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7476             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7477             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7478             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7479             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7480             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7481             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7482             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7483             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7484             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7485             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7486             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7487             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7488             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7489             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7490             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7491             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7492             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7493             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7494             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7495             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7496             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7497             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7498             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7499             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7500             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7501             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7502             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7503             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7504             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7505             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7506             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7507             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7508             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7509             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7510             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7511             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7512             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7513             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7514             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7515             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7516             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7517             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7518             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7519             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7520             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7521             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7522             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7523             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7524             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7525             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7526             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7527             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7528             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7529             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7530             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7531             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7532             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7533             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7534             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7535             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7536             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7537             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7538             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7539             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7540             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7541             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7542             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7543             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7544             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7545             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7546             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7547             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7548             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7549             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7550             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7551             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7552             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7553             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7554             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7555             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7556             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7557             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7558             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7559             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7560             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7561             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7562             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7563             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7564             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7565             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7566             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7567             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7568             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7569             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7570             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7571             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7572             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7573             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7574             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7575             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7576             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7577             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7578             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7579             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7580             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7581             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7582             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7583             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7584             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7585             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7586             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7587             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7588             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7589             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7590             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7591             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7592             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7593             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7594             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7595             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7596             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7597             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7598             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7599             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7600             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7601             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7602             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7603             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7604             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7605             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7606             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7607             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7608             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7609             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7610             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7611             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7612             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7613             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7614             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7615             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7616             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7617             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7618             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7619             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7620             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7621             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7622             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7623             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7624             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7625             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7626             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7627             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7628             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7629             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7630             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7631             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7632             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7633             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7634             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7635             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7636             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7637             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7638             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7639             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7640             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7641             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7642             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7643             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7644             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7645             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7646             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7647             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7648             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7649             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7650             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7651             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7652             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7653             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7654             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7655             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7656             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7657             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7658             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7659             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7660             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7661             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7662             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7663             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7664             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7665             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7666             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7667             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7668             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7669             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7670             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7671             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7672             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7673             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7674             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7675             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7676             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7677             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7678             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7679             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7680             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7681             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7682             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7683             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7684             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7685             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7686             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7687             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7688             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7689             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7690             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7691             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7692             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7693             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7694             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7695             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7696             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7697             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7698             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7699             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7700             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7701             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7702             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7703             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7704             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7705             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7706             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7707             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7708             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7709             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7710             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7711             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7712             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7713             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7714             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7715             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7716             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7717             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7718             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7719             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7720             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7721             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7722             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7723             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7724             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7725             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7726             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7727             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7728             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7729             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7730             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7731             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7732             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7733             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7734             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7735             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7736             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7737             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7738             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7739             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7740             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7741             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7742             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7743             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7744             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7745             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7746             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7747             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7748             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7749             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7750             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7751             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7752             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7753             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7754             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7755             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7756             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7757             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7758             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7759             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7760             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7761             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7762             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7763             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7764             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7765             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7766             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7767             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7768             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7769             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7770             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7771             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7772             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7773             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7774             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7775             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7776             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7777             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7778             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7779             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7780             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7781             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7782             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7783             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7784             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7785             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7786             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7787             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7788             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7789             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7790             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7791             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7792             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7793             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7794             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7795             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7796             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7797             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7798             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7799             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7800             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7801             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7802             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7803             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7804             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7805             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7806             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7807             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7808             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7809             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7810             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7811             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7812             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7813             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7814             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7815             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7816             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7817             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7818             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7819             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7820             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7821             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7822             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7823             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7824             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7825             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7826             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7827             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7828             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7829             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7830             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7831             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7832             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7833             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7834             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7835             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7836             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7837             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7838             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7839             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7840             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7841             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7842             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7843             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7844             :         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    7845             :         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7846             :         0x00, 0x1e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x72,
    7847             :         0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20,
    7848             :         0x66, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x74,
    7849             :         0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
    7850             :         0x6c, 0x79, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20,
    7851             :         0x62, 0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x20, 0x20,
    7852             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7853             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7854             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7855             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7856             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7857             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7858             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7859             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7860             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7861             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7862             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7863             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7864             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7865             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7866             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7867             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7868             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7869             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7870             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7871             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7872             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7873             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7874             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7875             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7876             :         0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    7877             :         0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7878             :         0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    7879             :         0x00, 0x00, 0x00, 0x1c, 0x00, 0x1e, 0xff, 0xff
    7880             : };
    7881             : 
    7882           8 : static bool test_delete_trigger_convert_sharing_violation(
    7883             :         struct torture_context *tctx,
    7884             :         struct smb2_tree *tree1)
    7885             : {
    7886           8 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    7887           8 :         const char *dirname = BASEDIR "\\dir";
    7888           8 :         const char *adname = BASEDIR "\\._dir";
    7889           0 :         struct smb2_handle testdirh;
    7890           0 :         struct smb2_create create;
    7891           8 :         AfpInfo *info = NULL;
    7892           8 :         bool ret = true;
    7893           0 :         NTSTATUS status;
    7894             : 
    7895           8 :         smb2_deltree(tree1, BASEDIR);
    7896             : 
    7897           8 :         status = torture_smb2_testdir(tree1, BASEDIR, &testdirh);
    7898           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    7899             :                                         "torture_smb2_testdir failed\n");
    7900           8 :         smb2_util_close(tree1, testdirh);
    7901             : 
    7902           8 :         status = torture_smb2_testdir(tree1, dirname, &testdirh);
    7903           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    7904             :                                         "torture_smb2_testdir failed\n");
    7905           8 :         smb2_util_close(tree1, testdirh);
    7906             : 
    7907           8 :         ret = torture_setup_file(tctx, tree1, adname, false);
    7908           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    7909             :                             "torture_setup_file failed\n");
    7910             : 
    7911           8 :         ret = write_stream(tree1, __location__, tctx, mem_ctx,
    7912             :                            adname, NULL, 0,
    7913             :                            sizeof(osx_adouble_dir_w_xattr),
    7914             :                            osx_adouble_dir_w_xattr);
    7915           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    7916             :                             "write_stream failed\n");
    7917             : 
    7918             :         /*
    7919             :          * 1) Create a non-empty AFP_AfpInfo stream
    7920             :          */
    7921             : 
    7922           8 :         info = torture_afpinfo_new(mem_ctx);
    7923           8 :         torture_assert_goto(tctx, info != NULL, ret, done, "torture_afpinfo_new failed");
    7924             : 
    7925             :         /* Set "Inited" flag (any other would do too) */
    7926           8 :         info->afpi_FinderInfo[8] = 0x01;
    7927             : 
    7928           8 :         ret = torture_write_afpinfo(tree1, tctx, mem_ctx, dirname, info);
    7929           8 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_write_afpinfo failed");
    7930             : 
    7931           8 :         ret = write_stream(tree1, __location__, tctx, mem_ctx,
    7932             :                            adname, NULL, 0,
    7933             :                            sizeof(osx_adouble_dir_w_xattr),
    7934             :                            osx_adouble_dir_w_xattr);
    7935           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    7936             :                             "write_stream failed\n");
    7937             : 
    7938             :         /*
    7939             :          * 2) Create a second stream
    7940             :          */
    7941             : 
    7942           8 :         ret = write_stream(tree1, __location__, tctx, mem_ctx,
    7943             :                            dirname, ":org.samba.boom", 0,
    7944             :                            strlen("boom"),
    7945             :                            "boom");
    7946           8 :         torture_assert_goto(tctx, ret == true, ret, done,
    7947             :                             "write_stream failed\n");
    7948             : 
    7949           8 :         create = (struct smb2_create) {
    7950             :                 .in.desired_access = SEC_STD_DELETE,
    7951             :                 .in.create_options = NTCREATEX_OPTIONS_DIRECTORY,
    7952             :                 .in.file_attributes = FILE_ATTRIBUTE_DIRECTORY,
    7953             :                 .in.share_access = NTCREATEX_SHARE_ACCESS_READ,
    7954             :                 .in.create_disposition = NTCREATEX_DISP_OPEN,
    7955             :                 .in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS,
    7956             :                 .in.fname = dirname,
    7957             :         };
    7958             : 
    7959           8 :         status = smb2_create(tree1, tctx, &create);
    7960           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    7961             :                                         "smb2_create failed\n");
    7962             : 
    7963           8 :         status = smb2_util_close(tree1, create.out.file.handle);
    7964           8 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    7965             :                                         "smb2_util_close failed");
    7966             : 
    7967           8 : done:
    7968           8 :         smb2_deltree(tree1, BASEDIR);
    7969           8 :         talloc_free(mem_ctx);
    7970           8 :         return ret;
    7971             : }
    7972             : 
    7973             : /*
    7974             :  * Note: This test depends on "vfs objects = catia fruit streams_xattr".  For
    7975             :  * some tests torture must be run on the host it tests and takes an additional
    7976             :  * argument with the local path to the share:
    7977             :  * "--option=torture:localdir=<SHAREPATH>".
    7978             :  *
    7979             :  * When running against an OS X SMB server add "--option=torture:osx=true"
    7980             :  */
    7981        2379 : struct torture_suite *torture_vfs_fruit(TALLOC_CTX *ctx)
    7982             : {
    7983        2379 :         struct torture_suite *suite = torture_suite_create(
    7984             :                 ctx, "fruit");
    7985             : 
    7986        2379 :         suite->description = talloc_strdup(suite, "vfs_fruit tests");
    7987             : 
    7988        2379 :         torture_suite_add_1smb2_test(suite, "copyfile", test_copyfile);
    7989        2379 :         torture_suite_add_1smb2_test(suite, "read metadata", test_read_afpinfo);
    7990        2379 :         torture_suite_add_1smb2_test(suite, "write metadata", test_write_atalk_metadata);
    7991        2379 :         torture_suite_add_1smb2_test(suite, "resource fork IO", test_write_atalk_rfork_io);
    7992        2379 :         torture_suite_add_1smb2_test(suite, "SMB2/CREATE context AAPL", test_aapl);
    7993        2379 :         torture_suite_add_1smb2_test(suite, "stream names", test_stream_names);
    7994        2379 :         torture_suite_add_1smb2_test(suite, "truncate resource fork to 0 bytes", test_rfork_truncate);
    7995        2379 :         torture_suite_add_1smb2_test(suite, "opening and creating resource fork", test_rfork_create);
    7996        2379 :         torture_suite_add_1smb2_test(suite, "fsync_resource_fork", test_rfork_fsync);
    7997        2379 :         torture_suite_add_1smb2_test(suite, "rename_dir_openfile", test_rename_dir_openfile);
    7998        2379 :         torture_suite_add_1smb2_test(suite, "File without AFP_AfpInfo", test_afpinfo_enoent);
    7999        2379 :         torture_suite_add_1smb2_test(suite, "create delete-on-close AFP_AfpInfo", test_create_delete_on_close);
    8000        2379 :         torture_suite_add_1smb2_test(suite, "setinfo delete-on-close AFP_AfpInfo", test_setinfo_delete_on_close);
    8001        2379 :         torture_suite_add_1smb2_test(suite, "setinfo eof AFP_AfpInfo", test_setinfo_eof);
    8002        2379 :         torture_suite_add_1smb2_test(suite, "delete AFP_AfpInfo by writing all 0", test_afpinfo_all0);
    8003        2379 :         torture_suite_add_1smb2_test(suite, "create delete-on-close AFP_AfpResource", test_create_delete_on_close_resource);
    8004        2379 :         torture_suite_add_1smb2_test(suite, "setinfo delete-on-close AFP_AfpResource", test_setinfo_delete_on_close_resource);
    8005        2379 :         torture_suite_add_1smb2_test(suite, "setinfo eof AFP_AfpResource", test_setinfo_eof_resource);
    8006        2379 :         torture_suite_add_1smb2_test(suite, "setinfo eof stream", test_setinfo_stream_eof);
    8007        2379 :         torture_suite_add_1smb2_test(suite, "null afpinfo", test_null_afpinfo);
    8008        2379 :         torture_suite_add_1smb2_test(suite, "delete", test_delete_file_with_rfork);
    8009        2379 :         torture_suite_add_1smb2_test(suite, "read open rsrc after rename", test_rename_and_read_rsrc);
    8010        2379 :         torture_suite_add_1smb2_test(suite, "readdir_attr with names with illegal ntfs characters", test_readdir_attr_illegal_ntfs);
    8011        2379 :         torture_suite_add_2ns_smb2_test(suite, "invalid AFP_AfpInfo", test_invalid_afpinfo);
    8012        2379 :         torture_suite_add_1smb2_test(suite, "creating rsrc with read-only access", test_rfork_create_ro);
    8013        2379 :         torture_suite_add_1smb2_test(suite, "copy-chunk streams", test_copy_chunk_streams);
    8014        2379 :         torture_suite_add_1smb2_test(suite, "OS X AppleDouble file conversion", test_adouble_conversion);
    8015        2379 :         torture_suite_add_1smb2_test(suite, "NFS ACE entries", test_nfs_aces);
    8016        2379 :         torture_suite_add_1smb2_test(suite, "OS X AppleDouble file conversion without embedded xattr", test_adouble_conversion_wo_xattr);
    8017        2379 :         torture_suite_add_1smb2_test(suite, "empty_stream", test_empty_stream);
    8018        2379 :         torture_suite_add_1smb2_test(suite, "writing_afpinfo", test_writing_afpinfo);
    8019        2379 :         torture_suite_add_1smb2_test(suite, "delete_trigger_convert_sharing_violation", test_delete_trigger_convert_sharing_violation);
    8020             : 
    8021        2379 :         return suite;
    8022             : }
    8023             : 
    8024           2 : static bool test_stream_names_local(struct torture_context *tctx,
    8025             :                                     struct smb2_tree *tree)
    8026             : {
    8027           2 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    8028           0 :         NTSTATUS status;
    8029           0 :         struct smb2_create create;
    8030           0 :         struct smb2_handle h;
    8031           2 :         const char *fname = BASEDIR "\\stream_names.txt";
    8032           0 :         const char *sname1;
    8033           0 :         bool ret;
    8034             :         /* UTF8 private use are starts at 0xef 0x80 0x80 (0xf000) */
    8035           2 :         const char *streams[] = {
    8036             :                 ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */
    8037             :                 ":bar" "\xef\x80\xa2" "baz:$DATA", /* "bar:baz:$DATA" */
    8038             :                 "::$DATA"
    8039             :         };
    8040           2 :         const char *localdir = NULL;
    8041             : 
    8042           2 :         localdir = torture_setting_string(tctx, "localdir", NULL);
    8043           2 :         if (localdir == NULL) {
    8044           0 :                 torture_skip(tctx, "Need localdir for test");
    8045             :         }
    8046             : 
    8047           2 :         sname1 = talloc_asprintf(mem_ctx, "%s%s", fname, streams[0]);
    8048             : 
    8049             :         /* clean slate ...*/
    8050           2 :         smb2_util_unlink(tree, fname);
    8051           2 :         smb2_deltree(tree, fname);
    8052           2 :         smb2_deltree(tree, BASEDIR);
    8053             : 
    8054           2 :         status = torture_smb2_testdir(tree, BASEDIR, &h);
    8055           2 :         CHECK_STATUS(status, NT_STATUS_OK);
    8056           2 :         smb2_util_close(tree, h);
    8057             : 
    8058           2 :         torture_comment(tctx, "(%s) testing stream names\n", __location__);
    8059           2 :         ZERO_STRUCT(create);
    8060           2 :         create.in.desired_access = SEC_FILE_WRITE_DATA;
    8061           2 :         create.in.file_attributes = FILE_ATTRIBUTE_NORMAL;
    8062           2 :         create.in.share_access =
    8063             :                 NTCREATEX_SHARE_ACCESS_DELETE|
    8064             :                 NTCREATEX_SHARE_ACCESS_READ|
    8065             :                 NTCREATEX_SHARE_ACCESS_WRITE;
    8066           2 :         create.in.create_disposition = NTCREATEX_DISP_CREATE;
    8067           2 :         create.in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS;
    8068           2 :         create.in.fname = sname1;
    8069             : 
    8070           2 :         status = smb2_create(tree, mem_ctx, &create);
    8071           2 :         CHECK_STATUS(status, NT_STATUS_OK);
    8072             : 
    8073           2 :         status = smb2_util_write(tree, create.out.file.handle, "foo", 0, 3);
    8074           2 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8075             :                                         "smb2_util_write failed\n");
    8076             : 
    8077           2 :         smb2_util_close(tree, create.out.file.handle);
    8078             : 
    8079           2 :         ret = torture_setup_local_xattr(tctx, "localdir", BASEDIR "/stream_names.txt",
    8080             :                                         "user.DosStream.bar:baz:$DATA",
    8081             :                                         "data", strlen("data"));
    8082           2 :         CHECK_VALUE(ret, true);
    8083             : 
    8084           2 :         ret = check_stream_list(tree, tctx, fname, 3, streams, false);
    8085           2 :         CHECK_VALUE(ret, true);
    8086             : 
    8087           2 : done:
    8088           2 :         status = smb2_util_unlink(tree, fname);
    8089           2 :         smb2_deltree(tree, BASEDIR);
    8090           2 :         talloc_free(mem_ctx);
    8091             : 
    8092           2 :         return ret;
    8093             : }
    8094             : 
    8095           2 : static bool test_fruit_locking_conflict(struct torture_context *tctx,
    8096             :                                         struct smb2_tree *tree,
    8097             :                                         struct smb2_tree *tree2)
    8098             : {
    8099           0 :         TALLOC_CTX *mem_ctx;
    8100           0 :         struct smb2_create create;
    8101           0 :         struct smb2_handle h;
    8102           0 :         struct smb2_lock lck;
    8103           0 :         struct smb2_lock_element el;
    8104           2 :         const char *fname = BASEDIR "\\locking_conflict.txt";
    8105           0 :         NTSTATUS status;
    8106           2 :         bool ret = false;
    8107             : 
    8108           2 :         mem_ctx = talloc_new(tctx);
    8109           2 :         torture_assert_not_null(tctx, mem_ctx, "talloc_new failed");
    8110             : 
    8111             :         /* clean slate ...*/
    8112           2 :         smb2_util_unlink(tree, fname);
    8113           2 :         smb2_deltree(tree, fname);
    8114           2 :         smb2_deltree(tree, BASEDIR);
    8115             : 
    8116           2 :         status = torture_smb2_testdir(tree, BASEDIR, &h);
    8117           2 :         CHECK_STATUS(status, NT_STATUS_OK);
    8118           2 :         smb2_util_close(tree, h);
    8119             : 
    8120           2 :         create = (struct smb2_create) {
    8121             :                 .in.desired_access = SEC_RIGHTS_FILE_READ,
    8122             :                 .in.file_attributes = FILE_ATTRIBUTE_NORMAL,
    8123             :                 .in.share_access =
    8124             :                 NTCREATEX_SHARE_ACCESS_READ|
    8125             :                 NTCREATEX_SHARE_ACCESS_WRITE,
    8126             :                 .in.create_disposition = NTCREATEX_DISP_CREATE,
    8127             :                 .in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS,
    8128             :                 .in.fname = fname,
    8129             :         };
    8130             : 
    8131           2 :         status = smb2_create(tree, mem_ctx, &create);
    8132           2 :         CHECK_STATUS(status, NT_STATUS_OK);
    8133           2 :         h = create.out.file.handle;
    8134             : 
    8135             :         /* Add AD_FILELOCK_RSRC_DENY_WR lock. */
    8136           2 :         el = (struct smb2_lock_element) {
    8137             :                 .offset = 0xfffffffffffffffc,
    8138             :                 .length = 1,
    8139             :                 .flags = SMB2_LOCK_FLAG_EXCLUSIVE,
    8140             :         };
    8141           2 :         lck = (struct smb2_lock) {
    8142             :                 .in.lock_count = 1,
    8143             :                 .in.file.handle = h,
    8144             :                 .in.locks = &el,
    8145             :         };
    8146             : 
    8147             :         /*
    8148             :          * Lock up to and including:
    8149             :          * AD_FILELOCK_OPEN_WR
    8150             :          * AD_FILELOCK_OPEN_RD
    8151             :          * This is designed to cause a NetAtalk
    8152             :          * locking conflict on the next open,
    8153             :          * even though the share modes are
    8154             :          * compatible.
    8155             :          */
    8156           2 :         status = smb2_lock(tree, &lck);
    8157           2 :         CHECK_STATUS(status, NT_STATUS_OK);
    8158             : 
    8159           2 :         el = (struct smb2_lock_element) {
    8160             :                 .offset = 0,
    8161             :                 .length = 0x7ffffffffffffff7,
    8162             :                 .flags = SMB2_LOCK_FLAG_EXCLUSIVE,
    8163             :         };
    8164           2 :         status = smb2_lock(tree, &lck);
    8165           2 :         CHECK_STATUS(status, NT_STATUS_OK);
    8166             : 
    8167           2 :         create = (struct smb2_create) {
    8168             :                 .in.desired_access =
    8169             :                 SEC_RIGHTS_FILE_READ|SEC_RIGHTS_FILE_WRITE,
    8170             :                 .in.file_attributes = FILE_ATTRIBUTE_NORMAL,
    8171             :                 .in.share_access = NTCREATEX_SHARE_ACCESS_READ,
    8172             :                 .in.create_disposition = NTCREATEX_DISP_OPEN,
    8173             :                 .in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS,
    8174             :                 .in.fname = fname,
    8175             :         };
    8176             : 
    8177             :         /*
    8178             :          * Open on the second tree - ensure we are
    8179             :          * emulating trying to access with a NetATalk
    8180             :          * process with an existing open/deny mode.
    8181             :          */
    8182           2 :         status = smb2_create(tree2, mem_ctx, &create);
    8183           2 :         CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION);
    8184             : 
    8185             :         {
    8186           2 :                 struct smb2_close cl = {
    8187             :                         .level = RAW_CLOSE_SMB2,
    8188             :                         .in.file.handle = h,
    8189             :                 };
    8190           2 :                 smb2_close(tree, &cl);
    8191             :         }
    8192             : 
    8193           2 :         ret = true;
    8194           2 : done:
    8195           2 :         return ret;
    8196             : }
    8197             : 
    8198        2379 : struct torture_suite *torture_vfs_fruit_netatalk(TALLOC_CTX *ctx)
    8199             : {
    8200        2379 :         struct torture_suite *suite = torture_suite_create(
    8201             :                 ctx, "fruit_netatalk");
    8202             : 
    8203        2379 :         suite->description = talloc_strdup(suite, "vfs_fruit tests for Netatalk interop that require fruit:metadata=netatalk");
    8204             : 
    8205        2379 :         torture_suite_add_1smb2_test(suite, "read netatalk metadata", test_read_netatalk_metadata);
    8206        2379 :         torture_suite_add_1smb2_test(suite, "stream names with locally created xattr", test_stream_names_local);
    8207        2379 :         torture_suite_add_2smb2_test(
    8208             :                 suite, "locking conflict", test_fruit_locking_conflict);
    8209             : 
    8210        2379 :         return suite;
    8211             : }
    8212             : 
    8213        2379 : struct torture_suite *torture_vfs_fruit_file_id(TALLOC_CTX *ctx)
    8214             : {
    8215         125 :         struct torture_suite *suite =
    8216        2379 :             torture_suite_create(ctx, "fruit_file_id");
    8217             : 
    8218        2504 :         suite->description =
    8219        2379 :             talloc_strdup(suite, "vfs_fruit tests for on-disk file ID that "
    8220             :                                  "require fruit:zero_file_id=yes");
    8221             : 
    8222        2379 :         torture_suite_add_1smb2_test(suite, "zero file id if AAPL negotiated",
    8223             :                                      test_zero_file_id);
    8224             : 
    8225        2379 :         return suite;
    8226             : }
    8227             : 
    8228           2 : static bool test_timemachine_volsize(struct torture_context *tctx,
    8229             :                                      struct smb2_tree *tree)
    8230             : {
    8231           2 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    8232           2 :         struct smb2_handle h = {{0}};
    8233           0 :         union smb_fsinfo fsinfo;
    8234           0 :         NTSTATUS status;
    8235           2 :         bool ok = true;
    8236           2 :         const char *info_plist =
    8237             :                 "<dict>\n"
    8238             :                 "        <key>band-size</key>\n"
    8239             :                 "        <integer>8192</integer>\n"
    8240             :                 "</dict>\n";
    8241             : 
    8242           2 :         smb2_deltree(tree, "test.sparsebundle");
    8243             : 
    8244           2 :         ok = enable_aapl(tctx, tree);
    8245           2 :         torture_assert_goto(tctx, ok, ok, done, "enable_aapl failed");
    8246             : 
    8247           2 :         status = smb2_util_mkdir(tree, "test.sparsebundle");
    8248           2 :         torture_assert_ntstatus_ok_goto(tctx, status, ok, done,
    8249             :                                         "smb2_util_mkdir\n");
    8250             : 
    8251           2 :         ok = write_stream(tree, __location__, tctx, mem_ctx,
    8252             :                           "test.sparsebundle/Info.plist", NULL,
    8253             :                            0, strlen(info_plist), info_plist);
    8254           2 :         torture_assert_goto(tctx, ok, ok, done, "write_stream failed\n");
    8255             : 
    8256           2 :         status = smb2_util_mkdir(tree, "test.sparsebundle/bands");
    8257           2 :         torture_assert_ntstatus_ok_goto(tctx, status, ok, done,
    8258             :                                         "smb2_util_mkdir\n");
    8259             : 
    8260           2 :         ok = torture_setup_file(tctx, tree, "test.sparsebundle/bands/1", false);
    8261           2 :         torture_assert_goto(tctx, ok, ok, done, "torture_setup_file failed\n");
    8262             : 
    8263           2 :         ok = torture_setup_file(tctx, tree, "test.sparsebundle/bands/2", false);
    8264           2 :         torture_assert_goto(tctx, ok, ok, done, "torture_setup_file failed\n");
    8265             : 
    8266           2 :         status = smb2_util_roothandle(tree, &h);
    8267           2 :         torture_assert_ntstatus_ok(tctx, status, "Unable to create root handle");
    8268             : 
    8269           2 :         ZERO_STRUCT(fsinfo);
    8270           2 :         fsinfo.generic.level = RAW_QFS_SIZE_INFORMATION;
    8271           2 :         fsinfo.generic.handle = h;
    8272             : 
    8273           2 :         status = smb2_getinfo_fs(tree, tree, &fsinfo);
    8274           2 :         torture_assert_ntstatus_ok(tctx, status, "smb2_getinfo_fs failed");
    8275             : 
    8276           2 :         torture_comment(tctx, "sectors_per_unit: %" PRIu32"\n"
    8277             :                         "bytes_per_sector: %" PRIu32"\n"
    8278             :                         "total_alloc_units: %" PRIu64"\n"
    8279             :                         "avail_alloc_units: %" PRIu64"\n",
    8280             :                         fsinfo.size_info.out.sectors_per_unit,
    8281             :                         fsinfo.size_info.out.bytes_per_sector,
    8282             :                         fsinfo.size_info.out.total_alloc_units,
    8283             :                         fsinfo.size_info.out.avail_alloc_units);
    8284             : 
    8285             :         /*
    8286             :          * Let me explain the numbers:
    8287             :          *
    8288             :          * - the share is set to "fruit:time machine max size = 32K"
    8289             :          * - we've faked a bandsize of 8 K in the Info.plist file
    8290             :          * - we've created two bands files
    8291             :          * - one allocation unit is made of two sectors with 512 B each
    8292             :          * => we've consumed 16 allocation units, there should be 16 free
    8293             :          */
    8294             : 
    8295           2 :         torture_assert_goto(tctx, fsinfo.size_info.out.sectors_per_unit == 2,
    8296             :                             ok, done, "Bad sectors_per_unit");
    8297             : 
    8298           2 :         torture_assert_goto(tctx, fsinfo.size_info.out.bytes_per_sector == 512,
    8299             :                             ok, done, "Bad bytes_per_sector");
    8300             : 
    8301           2 :         torture_assert_goto(tctx, fsinfo.size_info.out.total_alloc_units == 32,
    8302             :                             ok, done, "Bad total_alloc_units");
    8303             : 
    8304           2 :         torture_assert_goto(tctx, fsinfo.size_info.out.avail_alloc_units == 16,
    8305             :                             ok, done, "Bad avail_alloc_units");
    8306             : 
    8307           2 : done:
    8308           2 :         if (!smb2_util_handle_empty(h)) {
    8309           2 :                 smb2_util_close(tree, h);
    8310             :         }
    8311           2 :         smb2_deltree(tree, "test.sparsebundle");
    8312           2 :         talloc_free(mem_ctx);
    8313           2 :         return ok;
    8314             : }
    8315             : 
    8316        2379 : struct torture_suite *torture_vfs_fruit_timemachine(TALLOC_CTX *ctx)
    8317             : {
    8318        2379 :         struct torture_suite *suite = torture_suite_create(
    8319             :                 ctx, "fruit_timemachine");
    8320             : 
    8321        2379 :         suite->description = talloc_strdup(
    8322             :                 suite, "vfs_fruit tests for TimeMachine");
    8323             : 
    8324        2379 :         torture_suite_add_1smb2_test(suite, "Timemachine-volsize",
    8325             :                                      test_timemachine_volsize);
    8326             : 
    8327        2379 :         return suite;
    8328             : }
    8329             : 
    8330           4 : static bool test_convert_xattr_and_empty_rfork_then_delete(
    8331             :         struct torture_context *tctx,
    8332             :         struct smb2_tree *tree1,
    8333             :         struct smb2_tree *tree2)
    8334             : {
    8335           4 :         TALLOC_CTX *mem_ctx = talloc_new(tctx);
    8336           4 :         const char *fname = BASEDIR "\\test_adouble_conversion";
    8337           4 :         const char *adname = BASEDIR "/._test_adouble_conversion";
    8338           4 :         const char *rfork = BASEDIR "\\test_adouble_conversion" AFPRESOURCE_STREAM_NAME;
    8339           0 :         NTSTATUS status;
    8340           0 :         struct smb2_handle testdirh;
    8341           4 :         bool ret = true;
    8342           4 :         const char *streams[] = {
    8343             :                 "::$DATA",
    8344             :                 AFPINFO_STREAM,
    8345             :                 ":com.apple.metadata" "\xef\x80\xa2" "_kMDItemUserTags:$DATA",
    8346             :                 ":foo" "\xef\x80\xa2" "bar:$DATA", /* "foo:bar:$DATA" */
    8347             :         };
    8348           0 :         struct smb2_create create;
    8349           0 :         struct smb2_find find;
    8350           0 :         unsigned int count;
    8351           0 :         union smb_search_data *d;
    8352           0 :         bool delete_empty_adfiles;
    8353           0 :         int expected_num_files;
    8354             : 
    8355           4 :         delete_empty_adfiles = torture_setting_bool(tctx,
    8356             :                                                     "delete_empty_adfiles",
    8357             :                                                     false);
    8358             : 
    8359           4 :         smb2_deltree(tree1, BASEDIR);
    8360             : 
    8361           4 :         status = torture_smb2_testdir(tree1, BASEDIR, &testdirh);
    8362           4 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8363             :                                         "torture_smb2_testdir failed\n");
    8364           4 :         smb2_util_close(tree1, testdirh);
    8365             : 
    8366           4 :         ret = torture_setup_file(tctx, tree1, fname, false);
    8367           4 :         torture_assert_goto(tctx, ret == true, ret, done,
    8368             :                             "torture_setup_file failed\n");
    8369             : 
    8370           4 :         ret = torture_setup_file(tctx, tree1, adname, false);
    8371           4 :         torture_assert_goto(tctx, ret == true, ret, done,
    8372             :                             "torture_setup_file failed\n");
    8373             : 
    8374           4 :         ret = write_stream(tree1, __location__, tctx, mem_ctx,
    8375             :                            adname, NULL,
    8376             :                            0, sizeof(osx_adouble_w_xattr), osx_adouble_w_xattr);
    8377           4 :         torture_assert_goto(tctx, ret == true, ret, done,
    8378             :                             "write_stream failed\n");
    8379             : 
    8380           4 :         ret = enable_aapl(tctx, tree2);
    8381           4 :         torture_assert_goto(tctx, ret == true, ret, done, "enable_aapl failed");
    8382             : 
    8383             :         /*
    8384             :          * Issue a smb2_find(), this triggers the server-side conversion
    8385             :          */
    8386             : 
    8387           4 :         create = (struct smb2_create) {
    8388             :                 .in.desired_access = SEC_RIGHTS_DIR_READ,
    8389             :                 .in.create_options = NTCREATEX_OPTIONS_DIRECTORY,
    8390             :                 .in.file_attributes = FILE_ATTRIBUTE_DIRECTORY,
    8391             :                 .in.share_access = NTCREATEX_SHARE_ACCESS_READ,
    8392             :                 .in.create_disposition = NTCREATEX_DISP_OPEN,
    8393             :                 .in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS,
    8394             :                 .in.fname = BASEDIR,
    8395             :         };
    8396             : 
    8397           4 :         status = smb2_create(tree2, tctx, &create);
    8398           4 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8399             :                                         "smb2_create failed\n");
    8400             : 
    8401           4 :         find = (struct smb2_find) {
    8402             :                 .in.file.handle = create.out.file.handle,
    8403             :                 .in.pattern = "*",
    8404             :                 .in.max_response_size = 0x1000,
    8405             :                 .in.level = SMB2_FIND_ID_BOTH_DIRECTORY_INFO,
    8406             :         };
    8407             : 
    8408           4 :         status = smb2_find_level(tree2, tree2, &find, &count, &d);
    8409           4 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8410             :                                         "smb2_find_level failed\n");
    8411             : 
    8412           4 :         status = smb2_util_close(tree2, create.out.file.handle);
    8413           4 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8414             :                                         "smb2_util_close failed");
    8415             : 
    8416             :         /*
    8417             :          * Check number of streams
    8418             :          */
    8419             : 
    8420           4 :         ret = check_stream_list(tree2, tctx, fname, 4, streams, false);
    8421           4 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream_list");
    8422             : 
    8423             :         /*
    8424             :          * Check Resource Fork is gone
    8425             :          */
    8426             : 
    8427           4 :         create = (struct smb2_create) {
    8428             :                 .in.desired_access = SEC_RIGHTS_FILE_READ|SEC_RIGHTS_FILE_WRITE,
    8429             :                 .in.file_attributes = FILE_ATTRIBUTE_NORMAL,
    8430             :                 .in.share_access = NTCREATEX_SHARE_ACCESS_READ,
    8431             :                 .in.create_disposition = NTCREATEX_DISP_OPEN,
    8432             :                 .in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS,
    8433             :                 .in.fname = rfork,
    8434             :         };
    8435             : 
    8436           4 :         status = smb2_create(tree2, mem_ctx, &create);
    8437           4 :         torture_assert_ntstatus_equal_goto(
    8438             :                 tctx, status, NT_STATUS_OBJECT_NAME_NOT_FOUND,
    8439             :                 ret, done, "Bad smb2_create return\n");
    8440             : 
    8441             :         /*
    8442             :          * Check xattr data has been migrated from the AppleDouble file to
    8443             :          * streams.
    8444             :          */
    8445             : 
    8446           4 :         ret = check_stream(tree2, __location__, tctx, mem_ctx,
    8447             :                            fname, AFPINFO_STREAM,
    8448             :                            0, 60, 16, 8, "TESTSLOW");
    8449           4 :         torture_assert_goto(tctx, ret == true, ret, done,
    8450             :                             "check AFPINFO_STREAM failed\n");
    8451             : 
    8452           4 :         ret = check_stream(tree2, __location__, tctx, mem_ctx,
    8453             :                            fname, ":foo" "\xef\x80\xa2" "bar", /* foo:bar */
    8454             :                            0, 3, 0, 3, "baz");
    8455           4 :         torture_assert_goto(tctx, ret == true, ret, done,
    8456             :                             "check foo stream failed\n");
    8457             : 
    8458             :         /*
    8459             :          * Now check number of files. If delete_empty_adfiles is set, the
    8460             :          * AppleDouble files should have been deleted.
    8461             :          */
    8462             : 
    8463           4 :         create = (struct smb2_create) {
    8464             :                 .in.desired_access = SEC_RIGHTS_DIR_READ,
    8465             :                 .in.create_options = NTCREATEX_OPTIONS_DIRECTORY,
    8466             :                 .in.file_attributes = FILE_ATTRIBUTE_DIRECTORY,
    8467             :                 .in.share_access = NTCREATEX_SHARE_ACCESS_READ,
    8468             :                 .in.create_disposition = NTCREATEX_DISP_OPEN,
    8469             :                 .in.impersonation_level = SMB2_IMPERSONATION_ANONYMOUS,
    8470             :                 .in.fname = BASEDIR,
    8471             :         };
    8472             : 
    8473           4 :         status = smb2_create(tree2, tctx, &create);
    8474           4 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8475             :                                         "smb2_create failed\n");
    8476             : 
    8477           4 :         find = (struct smb2_find) {
    8478             :                 .in.file.handle = create.out.file.handle,
    8479             :                 .in.pattern = "*",
    8480             :                 .in.max_response_size = 0x1000,
    8481             :                 .in.level = SMB2_FIND_ID_BOTH_DIRECTORY_INFO,
    8482             :         };
    8483             : 
    8484           4 :         status = smb2_find_level(tree2, tree2, &find, &count, &d);
    8485           4 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8486             :                                         "smb2_find_level failed\n");
    8487             : 
    8488           4 :         status = smb2_util_close(tree2, create.out.file.handle);
    8489           4 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8490             :                                         "smb2_util_close failed");
    8491             : 
    8492           4 :         if (delete_empty_adfiles) {
    8493           2 :                 expected_num_files = 3;
    8494             :         } else {
    8495           2 :                 expected_num_files = 4;
    8496             :         }
    8497           4 :         torture_assert_int_equal_goto(tctx, count, expected_num_files, ret, done,
    8498             :                                       "Wrong number of files\n");
    8499             : 
    8500           4 : done:
    8501           4 :         smb2_deltree(tree1, BASEDIR);
    8502           4 :         talloc_free(mem_ctx);
    8503           4 :         return ret;
    8504             : }
    8505             : 
    8506        2379 : struct torture_suite *torture_vfs_fruit_conversion(TALLOC_CTX *ctx)
    8507             : {
    8508        2379 :         struct torture_suite *suite = torture_suite_create(
    8509             :                 ctx, "fruit_conversion");
    8510             : 
    8511        2379 :         suite->description = talloc_strdup(
    8512             :                 suite, "vfs_fruit conversion tests");
    8513             : 
    8514        2379 :         torture_suite_add_2ns_smb2_test(
    8515             :                 suite, "convert_xattr_and_empty_rfork_then_delete",
    8516             :                 test_convert_xattr_and_empty_rfork_then_delete);
    8517             : 
    8518        2379 :         return suite;
    8519             : }
    8520             : 
    8521             : /*
    8522             :  * The buf below contains the following AppleDouble encoded data:
    8523             :  *
    8524             :  * -----------------------------------------------------------------------------
    8525             :  * MagicNumber: 00051607                                        : AppleDouble
    8526             :  * Version    : 00020000                                        : Version 2
    8527             :  * Filler     : 4D 61 63 20 4F 53 20 58 20 20 20 20 20 20 20 20 : Mac OS X
    8528             :  * Num. of ent: 0002                                            : 2
    8529             :  *
    8530             :  * -----------------------------------------------------------------------------
    8531             :  * Entry ID   : 00000002 : Resource Fork
    8532             :  * Offset     : 0000009A : 154
    8533             :  * Length     : 00000004 : 4
    8534             :  *
    8535             :  * -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    8536             :  * 00000000   : 62 61 72 00                                     : bar.
    8537             :  *
    8538             :  * -----------------------------------------------------------------------------
    8539             :  * Entry ID   : 00000009 : Finder Info
    8540             :  * Offset     : 00000032 : 50
    8541             :  * Length     : 00000068 : 104
    8542             :  *
    8543             :  * -FInfo-----:
    8544             :  * Type       : 464F4F20 : FOO
    8545             :  * Creator    : 42415220 : BAR
    8546             :  * isAlias    : 0
    8547             :  * Invisible  : 0
    8548             :  * hasBundle  : 0
    8549             :  * nameLocked : 0
    8550             :  * Stationery : 0
    8551             :  * CustomIcon : 0
    8552             :  * Reserved   : 0
    8553             :  * Inited     : 0
    8554             :  * NoINITS    : 0
    8555             :  * Shared     : 0
    8556             :  * SwitchLaunc: 0
    8557             :  * Hidden Ext : 0
    8558             :  * color      : 000      : none
    8559             :  * isOnDesk   : 0
    8560             :  * Location v : 0000     : 0
    8561             :  * Location h : 0000     : 0
    8562             :  * Fldr       : 0000     : ..
    8563             :  *
    8564             :  * -FXInfo----:
    8565             :  * Rsvd|IconID: 0000     : 0
    8566             :  * Rsvd       : 0000     : ..
    8567             :  * Rsvd       : 0000     : ..
    8568             :  * Rsvd       : 0000     : ..
    8569             :  * AreInvalid : 0
    8570             :  * unknown bit: 0
    8571             :  * unknown bit: 0
    8572             :  * unknown bit: 0
    8573             :  * unknown bit: 0
    8574             :  * unknown bit: 0
    8575             :  * unknown bit: 0
    8576             :  * CustomBadge: 0
    8577             :  * ObjctIsBusy: 0
    8578             :  * unknown bit: 0
    8579             :  * unknown bit: 0
    8580             :  * unknown bit: 0
    8581             :  * unknown bit: 0
    8582             :  * RoutingInfo: 0
    8583             :  * unknown bit: 0
    8584             :  * unknown bit: 0
    8585             :  * Rsvd|commnt: 0000     : 0
    8586             :  * PutAway    : 00000000 : 0
    8587             :  *
    8588             :  * -EA--------:
    8589             :  * pad        : 0000     :
    8590             :  * magic      : 41545452 : ATTR
    8591             :  * debug_tag  : 00000000 : 0
    8592             :  * total_size : 0000009A : 154
    8593             :  * data_start : 00000096 : 150
    8594             :  * data_length: 00000004 : 4
    8595             :  * reserved[0]: 00000000 : ....
    8596             :  * reserved[1]: 00000000 : ....
    8597             :  * reserved[2]: 00000000 : ....
    8598             :  * flags      : 0000     : ..
    8599             :  * num_attrs  : 0001     : 1
    8600             :  * -EA ENTRY--:
    8601             :  * offset     : 00000096 : 150
    8602             :  * length     : 00000004 : 4
    8603             :  * flags      : 0000     : ..
    8604             :  * namelen    : 13       : 19
    8605             :  * -EA NAME---:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    8606             :  * 00000000   : 6F 72 67 2E 73 61 6D 62 61 EF 80 A2 77 6F 6F 68 : org.samba...wooh
    8607             :  * 00000010   : 6F 6F 00                                        : oo.
    8608             :  * -EA VALUE--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    8609             :  * 00000000   : 62 61 72 00                                     : bar.
    8610             :  *
    8611             :  * -RAW DUMP--:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F : (ASCII)
    8612             :  * 00000000   : 46 4F 4F 20 42 41 52 20 00 00 00 00 00 00 00 00 : FOO BAR ........
    8613             :  * 00000010   : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................
    8614             :  * 00000020   : 00 00 41 54 54 52 00 00 00 00 00 00 00 9A 00 00 : baATTR..........
    8615             :  * 00000030   : 00 96 00 00 00 04 00 00 00 00 00 00 00 00 00 00 : ................
    8616             :  * 00000040   : 00 00 00 00 00 01 00 00 00 96 00 00 00 04 00 00 : ................
    8617             :  * 00000050   : 13 6F 72 67 2E 73 61 6D 62 61 EF 80 A2 77 6F 6F : .org.samba...woo
    8618             :  * 00000060   : 68 6F 6F 00 62 61 72 00                         : hoo.bar.
    8619             :  *
    8620             :  * It was created with:
    8621             :  *
    8622             :  * $ hexdump -ve '"\t" 7/1 "0x%02x, " 1/1 " 0x%02x," "\n"'
    8623             :  */
    8624             : static char unconvert_adfile_data[] = {
    8625             :         0x00, 0x05, 0x16, 0x07, 0x00, 0x02, 0x00, 0x00,
    8626             :         0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58,
    8627             :         0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
    8628             :         0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
    8629             :         0x00, 0x98, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
    8630             :         0x00, 0x09, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00,
    8631             :         0x00, 0x66, 0x46, 0x4f, 0x4f, 0x20, 0x42, 0x41,
    8632             :         0x52, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    8633             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    8634             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    8635             :         0x00, 0x00, 0x00, 0x00, 0x41, 0x54, 0x54, 0x52,
    8636             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
    8637             :         0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x04,
    8638             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    8639             :         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
    8640             :         0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x04,
    8641             :         0x00, 0x00, 0x11, 0x6f, 0x72, 0x67, 0x2e, 0x73,
    8642             :         0x61, 0x6d, 0x62, 0x61, 0x3a, 0x77, 0x6f, 0x6f,
    8643             :         0x68, 0x6f, 0x6f, 0x00, 0x62, 0x61, 0x72, 0x00,
    8644             :         0x62, 0x61, 0x72, 0x00
    8645             : };
    8646             : 
    8647           6 : static bool test_unconvert(struct torture_context *tctx,
    8648             :                            struct smb2_tree *tree1,
    8649             :                            struct smb2_tree *tree2)
    8650             : {
    8651           6 :         const char *fname = BASEDIR "\\unconvert";
    8652           6 :         const char *adname = BASEDIR "\\._unconvert";
    8653           6 :         const char *net = NULL;
    8654           6 :         const char *share = NULL;
    8655           6 :         AfpInfo *afpi = NULL;
    8656           6 :         char *cmd = NULL;
    8657           0 :         struct smb2_handle h1;
    8658           0 :         union smb_fileinfo finfo;
    8659           0 :         size_t adsize;
    8660           0 :         NTSTATUS status;
    8661           0 :         int result;
    8662           6 :         bool ret = true;
    8663             : 
    8664           6 :         torture_assert_not_null_goto(tctx, tree2, ret, done,
    8665             :                                      "Need a second share without fruit\n");
    8666             : 
    8667           6 :         net = torture_setting_string(tctx, "net", NULL);
    8668           6 :         torture_assert_not_null_goto(tctx, net, ret, done,
    8669             :                                      "Need path to 'net'");
    8670             : 
    8671           6 :         share = torture_setting_string(tctx, "sharename", NULL);
    8672           6 :         torture_assert_not_null_goto(tctx, share, ret, done,
    8673             :                                      "Need sharename");
    8674             : 
    8675           6 :         torture_comment(tctx, "Testing unconvert\n");
    8676             : 
    8677           6 :         smb2_deltree(tree1, BASEDIR);
    8678             : 
    8679           6 :         status = torture_smb2_testdir(tree1, BASEDIR, &h1);
    8680           6 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8681             :                                         "torture_smb2_testdir\n");
    8682           6 :         smb2_util_close(tree1, h1);
    8683             : 
    8684           6 :         ret = torture_setup_file(tctx, tree1, fname, false);
    8685           6 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file");
    8686             : 
    8687           6 :         afpi = torture_afpinfo_new(tctx);
    8688           6 :         torture_assert_not_null_goto(tctx, afpi, ret, done,
    8689             :                                      "torture_afpinfo_new failed\n");
    8690             : 
    8691           6 :         memcpy(afpi->afpi_FinderInfo, "FOO BAR ", 8);
    8692             : 
    8693           6 :         ret = torture_write_afpinfo(tree1, tctx, tctx, fname, afpi);
    8694           6 :         torture_assert_goto(tctx, ret == true, ret, done,
    8695             :                             "torture_write_afpinfo failed\n");
    8696             : 
    8697           6 :         ret = write_stream(tree1, __location__, tctx, tctx,
    8698             :                            fname,
    8699             :                            /*
    8700             :                             * \xef\x80\xa2 is ':' mapped to Unicoe private range
    8701             :                             */
    8702             :                            ":org.samba" "\xef\x80\xa2" "woohoo",
    8703             :                            0, 4, "bar");
    8704           6 :         torture_assert_goto(tctx, ret == true, ret, done,
    8705             :                             "write_stream failed\n");
    8706             : 
    8707           6 :         ret = write_stream(tree1, __location__, tctx, tctx,
    8708             :                            fname, AFPRESOURCE_STREAM_NAME,
    8709             :                            0, 4, "bar");
    8710           6 :         torture_assert_goto(tctx, ret == true, ret, done,
    8711             :                             "write_stream failed\n");
    8712             : 
    8713           6 :         cmd = talloc_asprintf(tctx,
    8714             :                               "%s --recursive vfs stream2adouble %s %s/",
    8715             :                               net,
    8716             :                               share,
    8717             :                               BASEDIR);
    8718           6 :         torture_assert_not_null_goto(tctx, cmd, ret, done,
    8719             :                                      "talloc_asprintf failed\n");
    8720             : 
    8721           6 :         torture_comment(tctx, "cmd: %s\n", cmd);
    8722             : 
    8723           6 :         result = system(cmd);
    8724           6 :         torture_assert_int_equal_goto(tctx, result, 0, ret, done,
    8725             :                             "command failed\n");
    8726             : 
    8727           6 :         status = torture_smb2_testfile(tree2, adname, &h1);
    8728           6 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8729             :                                         "torture_smb2_testfile failed\n");
    8730             : 
    8731           6 :         finfo = (union smb_fileinfo) {
    8732             :                 .generic.level = RAW_FILEINFO_ALL_INFORMATION,
    8733             :                 .generic.in.file.handle = h1,
    8734             :         };
    8735             : 
    8736           6 :         status = smb2_getinfo_file(tree2, tctx, &finfo);
    8737           6 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8738             :                                         "torture_smb2_testdir\n");
    8739           6 :         smb2_util_close(tree2, h1);
    8740             : 
    8741           6 :         adsize = finfo.all_info.out.size;
    8742           6 :         torture_assert_int_equal_goto(tctx, adsize,
    8743             :                                       sizeof(unconvert_adfile_data),
    8744             :                                       ret, done, "wrong size\n");
    8745             : 
    8746           6 :         ret = check_stream(tree2, __location__, tctx, tctx,
    8747             :                            adname, "", 0, adsize, 0, adsize,
    8748             :                            unconvert_adfile_data);
    8749           6 :         torture_assert_goto(tctx, ret == true, ret, done,
    8750             :                             "check_stream failed\n");
    8751             : 
    8752           6 : done:
    8753             : //      smb2_deltree(tree1, BASEDIR);
    8754           6 :         return ret;
    8755             : }
    8756             : 
    8757        2379 : struct torture_suite *torture_vfs_fruit_unfruit(TALLOC_CTX *ctx)
    8758             : {
    8759        2379 :         struct torture_suite *suite = torture_suite_create(
    8760             :                 ctx, "unfruit");
    8761             : 
    8762        2379 :         suite->description = talloc_strdup(
    8763             :                 suite, "test converting back to AppleDouble");
    8764             : 
    8765        2379 :         torture_suite_add_2ns_smb2_test(suite,
    8766             :                                         "unconvert",
    8767             :                                         test_unconvert);
    8768             : 
    8769        2379 :         return suite;
    8770             : }
    8771             : 
    8772             : /*
    8773             :  * Write an invalid AFP_AfpInfo stream header
    8774             :  */
    8775           6 : bool test_fruit_validate_afpinfo(struct torture_context *tctx,
    8776             :                                  struct smb2_tree *tree)
    8777             : {
    8778           6 :         bool expect_invalid_param = torture_setting_bool(tctx, "validate_afpinfo", true);
    8779           6 :         const char *fname = "test_fruit_validate_afpinfo";
    8780           6 :         const char *sname = "test_fruit_validate_afpinfo" AFPINFO_STREAM_NAME;
    8781           0 :         struct smb2_handle handle;
    8782           6 :         AfpInfo *afpinfo = NULL;
    8783           6 :         char *afpinfo_buf = NULL;
    8784           0 :         uint8_t valbuf[8];
    8785           0 :         NTSTATUS status;
    8786           6 :         bool ret = true;
    8787             : 
    8788           6 :         torture_comment(tctx, "Checking create of AfpInfo stream\n");
    8789             : 
    8790           6 :         smb2_util_unlink(tree, fname);
    8791             : 
    8792           6 :         ret = torture_setup_file(tctx, tree, fname, false);
    8793           6 :         torture_assert_goto(tctx, ret == true, ret, done, "torture_setup_file failed");
    8794             : 
    8795           6 :         afpinfo = torture_afpinfo_new(tctx);
    8796           6 :         torture_assert_not_null_goto(tctx, afpinfo, ret, done,
    8797             :                                      "torture_afpinfo_new failed\n");
    8798             : 
    8799           6 :         memcpy(afpinfo->afpi_FinderInfo, "FOO BAR ", 8);
    8800             : 
    8801           6 :         ret = torture_write_afpinfo(tree, tctx, tctx, fname, afpinfo);
    8802           6 :         torture_assert_goto(tctx, ret == true, ret, done,
    8803             :                             "torture_write_afpinfo failed\n");
    8804             : 
    8805           6 :         afpinfo_buf = talloc_zero_size(tctx, 60);
    8806           6 :         torture_assert_goto(tctx, afpinfo_buf != NULL, ret, done,
    8807             :                             "torture_afpinfo_new failed");
    8808           6 :         memcpy(afpinfo_buf + 16, "FOO ", 4);
    8809             : 
    8810           6 :         status = torture_smb2_testfile_access(
    8811             :                 tree, sname, &handle, SEC_FILE_ALL);
    8812           6 :         torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8813             :                                         "smb2_create failed\n");
    8814             : 
    8815           6 :         status = smb2_util_write(tree, handle, afpinfo_buf, 0, AFP_INFO_SIZE);
    8816           6 :         if (expect_invalid_param) {
    8817           3 :                 torture_assert_ntstatus_equal_goto(
    8818             :                         tctx, status, NT_STATUS_INVALID_PARAMETER, ret, done,
    8819             :                         "write didn't fail as expected\n");
    8820             :         } else {
    8821           3 :                 torture_assert_ntstatus_ok_goto(tctx, status, ret, done,
    8822             :                                                 "smb2_util_write failed");
    8823             :         }
    8824             : 
    8825           6 :         smb2_util_close(tree, handle);
    8826             : 
    8827             :         /*
    8828             :          * Verify the server fixed the header
    8829             :          */
    8830           6 :         PUSH_BE_U32(valbuf, 0, AFP_Signature);
    8831           6 :         PUSH_BE_U32(valbuf + 4, 0, AFP_Version);
    8832           6 :         ret = check_stream(tree, __location__, tctx, tctx, fname,
    8833             :                            AFPINFO_STREAM, 0, 60, 0, 8, (char *)valbuf);
    8834           6 :         torture_assert_goto(tctx, ret == true, ret, done, "check_stream failed");
    8835             : 
    8836           6 : done:
    8837           6 :         smb2_util_unlink(tree, fname);
    8838           6 :         return ret;
    8839             : }

Generated by: LCOV version 1.14