Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Aug 2012 17:25:53 +0300
From:      Andriy Gapon <avg@FreeBSD.org>
To:        Trent Nelson <trent@snakebite.org>
Cc:        freebsd-fs@FreeBSD.org
Subject:   Re: chmod -h 000x against symlink has bizarre results on ZFS
Message-ID:  <503CD4F1.6060001@FreeBSD.org>
In-Reply-To: <20120824011517.GJ42732@snakebite.org>
References:  <20120824011517.GJ42732@snakebite.org>

next in thread | previous in thread | raw e-mail | index | archive | help
on 24/08/2012 04:15 Trent Nelson said the following:
> Hi folks,
> 
>     I recently set up a FreeBSD build slave for the Python project,
>     and noticed some symlink tests were failing in a very strange way
>     (http://bugs.python.org/issue15748).
> 
>     When chmod -h 000x is done against a file/link of length less than
>     24, the target seems to get padded out to 24 with 0s.  If it's
>     longer than 24, it'll get truncated.  'x' can be 7, 6, 5 or 4 and
>     the behaviour is the same.
> 
>     Here's the output from the attached test_readlink.sh, also available
>     at http://bugs.python.org/file26979/test_readlink.sh:
> 
> % ./test_readlink.sh
> 
> ****** TEST 1: link/target length less than 24 ******
> before chmod -h 0007:
> -rw-r----- /tmp/lt24
> lrwxr-x--- /tmp/lt24.lnk->/tmp/lt24
> python os.readlink(/tmp/lt24.lnk): 
> '/tmp/lt24'
> after chmod -h 0007:
> -rw-r----- /tmp/lt24
> l------rwx /tmp/lt24.lnk->/tmp/lt24
> python os.readlink(/tmp/lt24.lnk): 
> '/tmp/lt24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>  target is padded out with NULLs to 24
> 
> 
> 
> 
>  ****** TEST 2: link/target length longer than 24 ******
>  before chmod -h 0007:
>  -rw-r----- /tmp/definitelywaylongerthantwentyfour
>  lrwxr-x---
>  /tmp/definitelywaylongerthantwentyfour.lnk->/tmp/definitelywaylongerthantwentyfour
>  python os.readlink(/tmp/definitelywaylongerthantwentyfour.lnk): 
>  '/tmp/definitelywaylongerthantwentyfour'
>  after chmod -h 0007:
>  -rw-r----- /tmp/definitelywaylongerthantwentyfour
>  l------rwx
>  /tmp/definitelywaylongerthantwentyfour.lnk->/tmp/definitelywaylonger
>  python os.readlink(/tmp/definitelywaylongerthantwentyfour.lnk): 
>  '/tmp/definitelywaylonger'
>   ^^^^^^^^^^^^^^^^^^^^^^^^
>   target gets truncated to 24
> 
> 
> 
>   ****** Other modes... ******
>   after chmod -h 0006:
>   l------rw-
>   /tmp/definitelywaylongerthantwentyfour.lnk->/tmp/definitelywaylonger
>   after chmod -h 0005:
>   l------r-x
>   /tmp/definitelywaylongerthantwentyfour.lnk->/tmp/definitelywaylonger
>   after chmod -h 0004:
>   l------r--
>   /tmp/definitelywaylongerthantwentyfour.lnk->/tmp/definitelywaylonger
>   after chmod -h 0000:
>   l---------
>   /tmp/definitelywaylongerthantwentyfour.lnk->/tmp/definitelywaylongerthantwentyfour
> 
> 
>     This only happens on ZFS.  I'm on v28, don't have any v15s lying
>     around.
> 
>     I'm perplexed.  Can others reproduce it?
> 

I can reproduce this problem
I can also provide some additional bits of information using a modified version of
zdb:

$ ln -fs definitelywaylongerthantwentyfour definitelywaylongerthantwentyfour.lnk
$ stat -s definitelywaylongerthantwentyfour.lnk
st_dev=3895460379 st_ino=27165 st_mode=0120755 st_nlink=1 st_uid=0 st_gid=0
st_rdev=4294967295 st_size=33 st_atime=1346161009 st_mtime=1346161009
st_ctime=1346161009 st_birthtime=1346161009 st_blksize=131072 st_blocks=1 st_flags=0
$ zdb -ddddddd tank/tmp 27165
Dataset tank/tmp [ZPL], ID 69, cr_txg 31, 4.57G, 24910 objects, rootbp
DVA[0]=<0:5c5375e000:200> DVA[1]=<0:4c1a80ce00:200> [L0 DMU objset] fletcher4 lzjb
LE contiguous unique double size=800L/200P birth=70882769L/70882769P fill=24910
cksum=1c72e8f065:89bbdf9d575:1732432c541ff:2d672d98b0ff66

    Object  lvl   iblk   dblk  dsize  lsize   %full  type
     27165    1    16K    512      0    512    0.00  ZFS plain file (K=inherit)
(Z=inherit)
                                        209   bonus  System attributes
        dnode flags: USERUSED_ACCOUNTED
        dnode maxblkid: 0
        path    /definitelywaylongerthantwentyfour.lnk
        uid     0
        gid     0
        atime   Tue Aug 28 16:36:49 2012
        mtime   Tue Aug 28 16:36:49 2012
        ctime   Tue Aug 28 16:36:49 2012
        crtime  Tue Aug 28 16:36:49 2012
        gen     70882769
        mode    120755
        size    33
        parent  3
        links   1
        pflags  40800000104
        symlink definitelywaylongerthantwentyfour
        symlink size    33
Indirect blocks:

$ chmod -h 0007 definitelywaylongerthantwentyfour.lnk
$ stat -s definitelywaylongerthantwentyfour.lnk
st_dev=3895460379 st_ino=27165 st_mode=0120007 st_nlink=1 st_uid=0 st_gid=0
st_rdev=4294967295 st_size=33 st_atime=1346161009 st_mtime=1346161009
st_ctime=1346161227 st_birthtime=1346161227 st_blksize=131072 st_blocks=1 st_flags=0
$ zdb -ddddddd tank/tmp 27165
Dataset tank/tmp [ZPL], ID 69, cr_txg 31, 4.57G, 24910 objects, rootbp
DVA[0]=<0:5c556b4400:200> DVA[1]=<0:4c1a989600:200> [L0 DMU objset] fletcher4 lzjb
LE contiguous unique double size=800L/200P birth=70882812L/70882812P fill=24910
cksum=170e778d58:737e87307d3:140a45f4106a6:283187f7da9de7

    Object  lvl   iblk   dblk  dsize  lsize   %full  type
     27165    1    16K    512      0    512    0.00  ZFS plain file (K=inherit)
(Z=inherit)
                                        216   bonus  System attributes
        dnode flags: USERUSED_ACCOUNTED
        dnode maxblkid: 0
        path    /definitelywaylongerthantwentyfour.lnk
        uid     0
        gid     0
        atime   Tue Aug 28 16:36:49 2012
        mtime   Tue Aug 28 16:36:49 2012
        ctime   Tue Aug 28 16:40:27 2012
        crtime  Tue Aug 28 16:36:49 2012
        gen     70882769
        mode    120007
        size    33
        parent  3
        links   1
        pflags  40800000004
        symlink definitelywaylongerthant
        symlink size    24
Indirect blocks:

Note how the file/object size remains 33, but size of ZPL_SYMLINK attribute is
changed to 24.

-- 
Andriy Gapon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?503CD4F1.6060001>