Hi Paul,
On 2017-11-18 03:46 PM, Paul Eggert wrote:
Assaf Gordon wrote:
set_permissions uses the USE_ACL #define to either call "set_acls"
or call chmod/fchmod directly [4].
It vaguely sounds like a Gnulib bug if set_permissions isn't calling
set_acls when it should. However, your summary of what goes wrong is a
bit sketchy; I can't tell which lines of set-permissions.c are being
executed in what order.
Thanks for looking into this.
Here's a better flow using gdb (running in an NTFS-mounted directory, as
before)
====
$ gdb ~/projects/sed/sed/sed
(gdb) b set_acls
(gdb) r -i.bak 1ifoo world
[....]
Breakpoint 1, set_acls (ctx=0x7fffffffdbb0, name=0x623c30 "./sedmmglZZ",
desc=4, from_mode=0, must_chmod=0x7fffffffdb6e, acls_set=0x7fffffffdb6f)
at lib/set-permissions.c:488
488 int ret = 0;
(gdb) bt
#0 set_acls (ctx=0x7fffffffdbb0, name=0x623c30 "./sedmmglZZ", desc=4,
from_mode=0, must_chmod=0x7fffffffdb6e, acls_set=0x7fffffffdb6f)
at lib/set-permissions.c:488
#1 0x0000000000417ecc in set_permissions (ctx=0x7fffffffdbb0,
name=0x623c30 "./sedmmglZZ", desc=4) at lib/set-permissions.c:812
#2 0x0000000000414b6b in qcopy_acl (src_name=0x7fffffffe2de "world",
source_desc=3, dst_name=0x623c30 "./sedmmglZZ", dest_desc=4, mode=33204)
at lib/qcopy-acl.c:48
#3 0x000000000040b8b0 in copy_acl (src_name=0x7fffffffe2de "world",
source_desc=3, dst_name=0x623c30 "./sedmmglZZ", dest_desc=4, mode=33204)
at lib/copy-acl.c:46
#4 0x00000000004076ae in closedown (input=0x7fffffffdcc0) at
sed/execute.c:677
#5 0x0000000000407847 in read_pattern_space (input=0x7fffffffdcc0,
the_program=0x622260, append=0) at sed/execute.c:730
#6 0x0000000000409576 in process_files (the_program=0x622260,
argv=0x7fffffffdf10) at sed/execute.c:1685
#7 0x000000000040a83b in main (argc=4, argv=0x7fffffffdef8) at
sed/sed.c:377
====
Stepping through "set_acls", acl_set_fd returns 0,
but didn't actually set the permissions:
===
(gdb) n
503 if (! ctx->acls_not_supported)
(gdb)
505 if (ret == 0 && from_mode)
(gdb)
514 if (ret == 0 && ctx->acl)
(gdb) n
516 if (HAVE_ACL_SET_FD && desc != -1)
(gdb) n
517 ret = acl_set_fd (desc, ctx->acl);
(gdb) n
520 if (ret != 0)
(gdb) p ret
$3 = 0
(gdb) n
531 *acls_set = true;
(gdb)
532 if (S_ISDIR(ctx->mode))
(gdb)
749 return ret;
(gdb) !ls -l ./sedmmglZZ
---------- 1 gordon gordon 10 Nov 18 16:14 ./sedmmglZZ
===
And from here all functions just return success:
===
(gdb) n
750 }
(gdb)
set_permissions (ctx=0x7fffffffdbb0, name=0x623c30 "./sedmmglZZ",
desc=4) at lib/set-permissions.c:813
813 if (! acls_set)
(gdb)
833 if (must_chmod && ! early_chmod)
(gdb)
846 return ret;
(gdb)
847 }
(gdb)
qcopy_acl (src_name=0x7fffffffe2de "world", source_desc=3,
dst_name=0x623c30 "./sedmmglZZ", dest_desc=4, mode=33204) at
lib/qcopy-acl.c:49
49 free_permission_context (&ctx);
(gdb)
50 return ret;
(gdb)
51 }
(gdb)
copy_acl (src_name=0x7fffffffe2de "world", source_desc=3,
dst_name=0x623c30 "./sedmmglZZ", dest_desc=4, mode=33204) at
lib/copy-acl.c:47
47 switch (ret)
(gdb)
58 break;
(gdb)
60 return ret;
(gdb)
61 }
(gdb)
closedown (input=0x7fffffffdcc0) at sed/execute.c:681
681 ck_fclose (input->fp);
(gdb)
===
regards,
- assaf