diff options
| author | Paul Eggert | 2015-04-24 22:39:47 -0700 |
|---|---|---|
| committer | Paul Eggert | 2015-04-24 22:41:56 -0700 |
| commit | 27e6afeb6fe1f0b9f083fdfeacf6d69c6936a34a (patch) | |
| tree | a1bdf790a993c537044305912d3d4796789dccb0 /lib | |
| parent | 52ba851db188de47b303120df00c77e3aad7e542 (diff) | |
| download | emacs-27e6afeb6fe1f0b9f083fdfeacf6d69c6936a34a.tar.gz emacs-27e6afeb6fe1f0b9f083fdfeacf6d69c6936a34a.zip | |
Merge from gnulib
This incorporates:
2015-04-24 file-has-acl: new module, split from acl
2015-04-24 manywarnings: add GCC 5.1 warnings
2015-04-21 lstat: fix cross-compilation 'ln -s' problem
2015-04-15 qacl: Simplify HP-UX acl_nontrivial check
2015-04-15 acl: On Linux, check for acls without libacl
2015-04-14 tempname: avoid unused parameter warnings (trivial)
* lib/acl-internal.c: New file, from gnulib.
* lib/file-has-acl.c: Remove; no longer imported from gnulib.
* lib/acl-internal.h, lib/gnulib.mk, lib/qcopy-acl.c, lib/tempname.c:
* m4/acl.m4, m4/gnulib-comp.m4, m4/lstat.m4, m4/manywarnings.m4:
Update from gnulib.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/acl-internal.c (renamed from lib/file-has-acl.c) | 462 | ||||
| -rw-r--r-- | lib/acl-internal.h | 2 | ||||
| -rw-r--r-- | lib/gnulib.mk | 2 | ||||
| -rw-r--r-- | lib/qcopy-acl.c | 17 | ||||
| -rw-r--r-- | lib/tempname.c | 4 |
5 files changed, 13 insertions, 474 deletions
diff --git a/lib/file-has-acl.c b/lib/acl-internal.c index 2ef4e8bdefd..d9bd4461ea6 100644 --- a/lib/file-has-acl.c +++ b/lib/acl-internal.c | |||
| @@ -17,19 +17,12 @@ | |||
| 17 | 17 | ||
| 18 | Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */ | 18 | Written by Paul Eggert, Andreas Grünbacher, and Bruno Haible. */ |
| 19 | 19 | ||
| 20 | /* Without this pragma, gcc 4.7.0 20120126 may suggest that the | ||
| 21 | file_has_acl function might be candidate for attribute 'const' */ | ||
| 22 | #if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__ | ||
| 23 | # pragma GCC diagnostic ignored "-Wsuggest-attribute=const" | ||
| 24 | #endif | ||
| 25 | |||
| 26 | #include <config.h> | 20 | #include <config.h> |
| 27 | 21 | ||
| 28 | #include "acl.h" | 22 | #include "acl.h" |
| 29 | 23 | ||
| 30 | #include "acl-internal.h" | 24 | #include "acl-internal.h" |
| 31 | 25 | ||
| 32 | |||
| 33 | #if USE_ACL && HAVE_ACL_GET_FILE | 26 | #if USE_ACL && HAVE_ACL_GET_FILE |
| 34 | 27 | ||
| 35 | # if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */ | 28 | # if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */ |
| @@ -124,7 +117,6 @@ acl_access_nontrivial (acl_t acl) | |||
| 124 | 117 | ||
| 125 | # endif | 118 | # endif |
| 126 | 119 | ||
| 127 | |||
| 128 | #elif USE_ACL && HAVE_FACL && defined GETACL /* Solaris, Cygwin, not HP-UX */ | 120 | #elif USE_ACL && HAVE_FACL && defined GETACL /* Solaris, Cygwin, not HP-UX */ |
| 129 | 121 | ||
| 130 | /* Test an ACL retrieved with GETACL. | 122 | /* Test an ACL retrieved with GETACL. |
| @@ -344,18 +336,19 @@ acl_ace_nontrivial (int count, ace_t *entries) | |||
| 344 | /* Return 1 if the given ACL is non-trivial. | 336 | /* Return 1 if the given ACL is non-trivial. |
| 345 | Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ | 337 | Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ |
| 346 | int | 338 | int |
| 347 | acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb) | 339 | acl_nontrivial (int count, struct acl_entry *entries) |
| 348 | { | 340 | { |
| 349 | int i; | 341 | int i; |
| 350 | 342 | ||
| 343 | if (count > 3) | ||
| 344 | return 1; | ||
| 345 | |||
| 351 | for (i = 0; i < count; i++) | 346 | for (i = 0; i < count; i++) |
| 352 | { | 347 | { |
| 353 | struct acl_entry *ace = &entries[i]; | 348 | struct acl_entry *ace = &entries[i]; |
| 354 | 349 | ||
| 355 | if (!((ace->uid == sb->st_uid && ace->gid == ACL_NSGROUP) | 350 | if (ace->uid != ACL_NSUSER && ace->gid != ACL_NSGROUP) |
| 356 | || (ace->uid == ACL_NSUSER && ace->gid == sb->st_gid) | 351 | return 1; |
| 357 | || (ace->uid == ACL_NSUSER && ace->gid == ACL_NSGROUP))) | ||
| 358 | return 1; | ||
| 359 | } | 352 | } |
| 360 | return 0; | 353 | return 0; |
| 361 | } | 354 | } |
| @@ -474,446 +467,3 @@ acl_nontrivial (int count, struct acl *entries) | |||
| 474 | } | 467 | } |
| 475 | 468 | ||
| 476 | #endif | 469 | #endif |
| 477 | |||
| 478 | |||
| 479 | /* Return 1 if NAME has a nontrivial access control list, 0 if NAME | ||
| 480 | only has no or a base access control list, and -1 (setting errno) | ||
| 481 | on error. SB must be set to the stat buffer of NAME, obtained | ||
| 482 | through stat() or lstat(). */ | ||
| 483 | |||
| 484 | int | ||
| 485 | file_has_acl (char const *name, struct stat const *sb) | ||
| 486 | { | ||
| 487 | #if USE_ACL | ||
| 488 | if (! S_ISLNK (sb->st_mode)) | ||
| 489 | { | ||
| 490 | # if HAVE_ACL_GET_FILE | ||
| 491 | |||
| 492 | /* POSIX 1003.1e (draft 17 -- abandoned) specific version. */ | ||
| 493 | /* Linux, FreeBSD, Mac OS X, IRIX, Tru64 */ | ||
| 494 | int ret; | ||
| 495 | |||
| 496 | if (HAVE_ACL_EXTENDED_FILE) /* Linux */ | ||
| 497 | { | ||
| 498 | /* On Linux, acl_extended_file is an optimized function: It only | ||
| 499 | makes two calls to getxattr(), one for ACL_TYPE_ACCESS, one for | ||
| 500 | ACL_TYPE_DEFAULT. */ | ||
| 501 | ret = acl_extended_file (name); | ||
| 502 | } | ||
| 503 | else /* FreeBSD, Mac OS X, IRIX, Tru64 */ | ||
| 504 | { | ||
| 505 | # if HAVE_ACL_TYPE_EXTENDED /* Mac OS X */ | ||
| 506 | /* On Mac OS X, acl_get_file (name, ACL_TYPE_ACCESS) | ||
| 507 | and acl_get_file (name, ACL_TYPE_DEFAULT) | ||
| 508 | always return NULL / EINVAL. There is no point in making | ||
| 509 | these two useless calls. The real ACL is retrieved through | ||
| 510 | acl_get_file (name, ACL_TYPE_EXTENDED). */ | ||
| 511 | acl_t acl = acl_get_file (name, ACL_TYPE_EXTENDED); | ||
| 512 | if (acl) | ||
| 513 | { | ||
| 514 | ret = acl_extended_nontrivial (acl); | ||
| 515 | acl_free (acl); | ||
| 516 | } | ||
| 517 | else | ||
| 518 | ret = -1; | ||
| 519 | # else /* FreeBSD, IRIX, Tru64 */ | ||
| 520 | acl_t acl = acl_get_file (name, ACL_TYPE_ACCESS); | ||
| 521 | if (acl) | ||
| 522 | { | ||
| 523 | int saved_errno; | ||
| 524 | |||
| 525 | ret = acl_access_nontrivial (acl); | ||
| 526 | saved_errno = errno; | ||
| 527 | acl_free (acl); | ||
| 528 | errno = saved_errno; | ||
| 529 | # if HAVE_ACL_FREE_TEXT /* Tru64 */ | ||
| 530 | /* On OSF/1, acl_get_file (name, ACL_TYPE_DEFAULT) always | ||
| 531 | returns NULL with errno not set. There is no point in | ||
| 532 | making this call. */ | ||
| 533 | # else /* FreeBSD, IRIX */ | ||
| 534 | /* On Linux, FreeBSD, IRIX, acl_get_file (name, ACL_TYPE_ACCESS) | ||
| 535 | and acl_get_file (name, ACL_TYPE_DEFAULT) on a directory | ||
| 536 | either both succeed or both fail; it depends on the | ||
| 537 | file system. Therefore there is no point in making the second | ||
| 538 | call if the first one already failed. */ | ||
| 539 | if (ret == 0 && S_ISDIR (sb->st_mode)) | ||
| 540 | { | ||
| 541 | acl = acl_get_file (name, ACL_TYPE_DEFAULT); | ||
| 542 | if (acl) | ||
| 543 | { | ||
| 544 | ret = (0 < acl_entries (acl)); | ||
| 545 | acl_free (acl); | ||
| 546 | } | ||
| 547 | else | ||
| 548 | ret = -1; | ||
| 549 | } | ||
| 550 | # endif | ||
| 551 | } | ||
| 552 | else | ||
| 553 | ret = -1; | ||
| 554 | # endif | ||
| 555 | } | ||
| 556 | if (ret < 0) | ||
| 557 | return - acl_errno_valid (errno); | ||
| 558 | return ret; | ||
| 559 | |||
| 560 | # elif HAVE_FACL && defined GETACL /* Solaris, Cygwin, not HP-UX */ | ||
| 561 | |||
| 562 | # if defined ACL_NO_TRIVIAL | ||
| 563 | |||
| 564 | /* Solaris 10 (newer version), which has additional API declared in | ||
| 565 | <sys/acl.h> (acl_t) and implemented in libsec (acl_set, acl_trivial, | ||
| 566 | acl_fromtext, ...). */ | ||
| 567 | return acl_trivial (name); | ||
| 568 | |||
| 569 | # else /* Solaris, Cygwin, general case */ | ||
| 570 | |||
| 571 | /* Solaris 2.5 through Solaris 10, Cygwin, and contemporaneous versions | ||
| 572 | of Unixware. The acl() call returns the access and default ACL both | ||
| 573 | at once. */ | ||
| 574 | { | ||
| 575 | /* Initially, try to read the entries into a stack-allocated buffer. | ||
| 576 | Use malloc if it does not fit. */ | ||
| 577 | enum | ||
| 578 | { | ||
| 579 | alloc_init = 4000 / sizeof (aclent_t), /* >= 3 */ | ||
| 580 | alloc_max = MIN (INT_MAX, SIZE_MAX / sizeof (aclent_t)) | ||
| 581 | }; | ||
| 582 | aclent_t buf[alloc_init]; | ||
| 583 | size_t alloc = alloc_init; | ||
| 584 | aclent_t *entries = buf; | ||
| 585 | aclent_t *malloced = NULL; | ||
| 586 | int count; | ||
| 587 | |||
| 588 | for (;;) | ||
| 589 | { | ||
| 590 | count = acl (name, GETACL, alloc, entries); | ||
| 591 | if (count < 0 && errno == ENOSPC) | ||
| 592 | { | ||
| 593 | /* Increase the size of the buffer. */ | ||
| 594 | free (malloced); | ||
| 595 | if (alloc > alloc_max / 2) | ||
| 596 | { | ||
| 597 | errno = ENOMEM; | ||
| 598 | return -1; | ||
| 599 | } | ||
| 600 | alloc = 2 * alloc; /* <= alloc_max */ | ||
| 601 | entries = malloced = | ||
| 602 | (aclent_t *) malloc (alloc * sizeof (aclent_t)); | ||
| 603 | if (entries == NULL) | ||
| 604 | { | ||
| 605 | errno = ENOMEM; | ||
| 606 | return -1; | ||
| 607 | } | ||
| 608 | continue; | ||
| 609 | } | ||
| 610 | break; | ||
| 611 | } | ||
| 612 | if (count < 0) | ||
| 613 | { | ||
| 614 | if (errno == ENOSYS || errno == ENOTSUP) | ||
| 615 | ; | ||
| 616 | else | ||
| 617 | { | ||
| 618 | int saved_errno = errno; | ||
| 619 | free (malloced); | ||
| 620 | errno = saved_errno; | ||
| 621 | return -1; | ||
| 622 | } | ||
| 623 | } | ||
| 624 | else if (count == 0) | ||
| 625 | ; | ||
| 626 | else | ||
| 627 | { | ||
| 628 | /* Don't use MIN_ACL_ENTRIES: It's set to 4 on Cygwin, but Cygwin | ||
| 629 | returns only 3 entries for files with no ACL. But this is safe: | ||
| 630 | If there are more than 4 entries, there cannot be only the | ||
| 631 | "user::", "group::", "other:", and "mask:" entries. */ | ||
| 632 | if (count > 4) | ||
| 633 | { | ||
| 634 | free (malloced); | ||
| 635 | return 1; | ||
| 636 | } | ||
| 637 | |||
| 638 | if (acl_nontrivial (count, entries)) | ||
| 639 | { | ||
| 640 | free (malloced); | ||
| 641 | return 1; | ||
| 642 | } | ||
| 643 | } | ||
| 644 | free (malloced); | ||
| 645 | } | ||
| 646 | |||
| 647 | # ifdef ACE_GETACL | ||
| 648 | /* Solaris also has a different variant of ACLs, used in ZFS and NFSv4 | ||
| 649 | file systems (whereas the other ones are used in UFS file systems). */ | ||
| 650 | { | ||
| 651 | /* Initially, try to read the entries into a stack-allocated buffer. | ||
| 652 | Use malloc if it does not fit. */ | ||
| 653 | enum | ||
| 654 | { | ||
| 655 | alloc_init = 4000 / sizeof (ace_t), /* >= 3 */ | ||
| 656 | alloc_max = MIN (INT_MAX, SIZE_MAX / sizeof (ace_t)) | ||
| 657 | }; | ||
| 658 | ace_t buf[alloc_init]; | ||
| 659 | size_t alloc = alloc_init; | ||
| 660 | ace_t *entries = buf; | ||
| 661 | ace_t *malloced = NULL; | ||
| 662 | int count; | ||
| 663 | |||
| 664 | for (;;) | ||
| 665 | { | ||
| 666 | count = acl (name, ACE_GETACL, alloc, entries); | ||
| 667 | if (count < 0 && errno == ENOSPC) | ||
| 668 | { | ||
| 669 | /* Increase the size of the buffer. */ | ||
| 670 | free (malloced); | ||
| 671 | if (alloc > alloc_max / 2) | ||
| 672 | { | ||
| 673 | errno = ENOMEM; | ||
| 674 | return -1; | ||
| 675 | } | ||
| 676 | alloc = 2 * alloc; /* <= alloc_max */ | ||
| 677 | entries = malloced = (ace_t *) malloc (alloc * sizeof (ace_t)); | ||
| 678 | if (entries == NULL) | ||
| 679 | { | ||
| 680 | errno = ENOMEM; | ||
| 681 | return -1; | ||
| 682 | } | ||
| 683 | continue; | ||
| 684 | } | ||
| 685 | break; | ||
| 686 | } | ||
| 687 | if (count < 0) | ||
| 688 | { | ||
| 689 | if (errno == ENOSYS || errno == EINVAL) | ||
| 690 | ; | ||
| 691 | else | ||
| 692 | { | ||
| 693 | int saved_errno = errno; | ||
| 694 | free (malloced); | ||
| 695 | errno = saved_errno; | ||
| 696 | return -1; | ||
| 697 | } | ||
| 698 | } | ||
| 699 | else if (count == 0) | ||
| 700 | ; | ||
| 701 | else | ||
| 702 | { | ||
| 703 | /* In the old (original Solaris 10) convention: | ||
| 704 | If there are more than 3 entries, there cannot be only the | ||
| 705 | ACE_OWNER, ACE_GROUP, ACE_OTHER entries. | ||
| 706 | In the newer Solaris 10 and Solaris 11 convention: | ||
| 707 | If there are more than 6 entries, there cannot be only the | ||
| 708 | ACE_OWNER, ACE_GROUP, ACE_EVERYONE entries, each once with | ||
| 709 | NEW_ACE_ACCESS_ALLOWED_ACE_TYPE and once with | ||
| 710 | NEW_ACE_ACCESS_DENIED_ACE_TYPE. */ | ||
| 711 | if (count > 6) | ||
| 712 | { | ||
| 713 | free (malloced); | ||
| 714 | return 1; | ||
| 715 | } | ||
| 716 | |||
| 717 | if (acl_ace_nontrivial (count, entries)) | ||
| 718 | { | ||
| 719 | free (malloced); | ||
| 720 | return 1; | ||
| 721 | } | ||
| 722 | } | ||
| 723 | free (malloced); | ||
| 724 | } | ||
| 725 | # endif | ||
| 726 | |||
| 727 | return 0; | ||
| 728 | # endif | ||
| 729 | |||
| 730 | # elif HAVE_GETACL /* HP-UX */ | ||
| 731 | |||
| 732 | { | ||
| 733 | struct acl_entry entries[NACLENTRIES]; | ||
| 734 | int count; | ||
| 735 | |||
| 736 | count = getacl (name, NACLENTRIES, entries); | ||
| 737 | |||
| 738 | if (count < 0) | ||
| 739 | { | ||
| 740 | /* ENOSYS is seen on newer HP-UX versions. | ||
| 741 | EOPNOTSUPP is typically seen on NFS mounts. | ||
| 742 | ENOTSUP was seen on Quantum StorNext file systems (cvfs). */ | ||
| 743 | if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP) | ||
| 744 | ; | ||
| 745 | else | ||
| 746 | return -1; | ||
| 747 | } | ||
| 748 | else if (count == 0) | ||
| 749 | return 0; | ||
| 750 | else /* count > 0 */ | ||
| 751 | { | ||
| 752 | if (count > NACLENTRIES) | ||
| 753 | /* If NACLENTRIES cannot be trusted, use dynamic memory | ||
| 754 | allocation. */ | ||
| 755 | abort (); | ||
| 756 | |||
| 757 | /* If there are more than 3 entries, there cannot be only the | ||
| 758 | (uid,%), (%,gid), (%,%) entries. */ | ||
| 759 | if (count > 3) | ||
| 760 | return 1; | ||
| 761 | |||
| 762 | { | ||
| 763 | struct stat statbuf; | ||
| 764 | |||
| 765 | if (stat (name, &statbuf) < 0) | ||
| 766 | return -1; | ||
| 767 | |||
| 768 | return acl_nontrivial (count, entries, &statbuf); | ||
| 769 | } | ||
| 770 | } | ||
| 771 | } | ||
| 772 | |||
| 773 | # if HAVE_ACLV_H /* HP-UX >= 11.11 */ | ||
| 774 | |||
| 775 | { | ||
| 776 | struct acl entries[NACLVENTRIES]; | ||
| 777 | int count; | ||
| 778 | |||
| 779 | count = acl ((char *) name, ACL_GET, NACLVENTRIES, entries); | ||
| 780 | |||
| 781 | if (count < 0) | ||
| 782 | { | ||
| 783 | /* EOPNOTSUPP is seen on NFS in HP-UX 11.11, 11.23. | ||
| 784 | EINVAL is seen on NFS in HP-UX 11.31. */ | ||
| 785 | if (errno == ENOSYS || errno == EOPNOTSUPP || errno == EINVAL) | ||
| 786 | ; | ||
| 787 | else | ||
| 788 | return -1; | ||
| 789 | } | ||
| 790 | else if (count == 0) | ||
| 791 | return 0; | ||
| 792 | else /* count > 0 */ | ||
| 793 | { | ||
| 794 | if (count > NACLVENTRIES) | ||
| 795 | /* If NACLVENTRIES cannot be trusted, use dynamic memory | ||
| 796 | allocation. */ | ||
| 797 | abort (); | ||
| 798 | |||
| 799 | /* If there are more than 4 entries, there cannot be only the | ||
| 800 | four base ACL entries. */ | ||
| 801 | if (count > 4) | ||
| 802 | return 1; | ||
| 803 | |||
| 804 | return aclv_nontrivial (count, entries); | ||
| 805 | } | ||
| 806 | } | ||
| 807 | |||
| 808 | # endif | ||
| 809 | |||
| 810 | # elif HAVE_ACLX_GET && defined ACL_AIX_WIP /* AIX */ | ||
| 811 | |||
| 812 | acl_type_t type; | ||
| 813 | char aclbuf[1024]; | ||
| 814 | void *acl = aclbuf; | ||
| 815 | size_t aclsize = sizeof (aclbuf); | ||
| 816 | mode_t mode; | ||
| 817 | |||
| 818 | for (;;) | ||
| 819 | { | ||
| 820 | /* The docs say that type being 0 is equivalent to ACL_ANY, but it | ||
| 821 | is not true, in AIX 5.3. */ | ||
| 822 | type.u64 = ACL_ANY; | ||
| 823 | if (aclx_get (name, 0, &type, aclbuf, &aclsize, &mode) >= 0) | ||
| 824 | break; | ||
| 825 | if (errno == ENOSYS) | ||
| 826 | return 0; | ||
| 827 | if (errno != ENOSPC) | ||
| 828 | { | ||
| 829 | if (acl != aclbuf) | ||
| 830 | { | ||
| 831 | int saved_errno = errno; | ||
| 832 | free (acl); | ||
| 833 | errno = saved_errno; | ||
| 834 | } | ||
| 835 | return -1; | ||
| 836 | } | ||
| 837 | aclsize = 2 * aclsize; | ||
| 838 | if (acl != aclbuf) | ||
| 839 | free (acl); | ||
| 840 | acl = malloc (aclsize); | ||
| 841 | if (acl == NULL) | ||
| 842 | { | ||
| 843 | errno = ENOMEM; | ||
| 844 | return -1; | ||
| 845 | } | ||
| 846 | } | ||
| 847 | |||
| 848 | if (type.u64 == ACL_AIXC) | ||
| 849 | { | ||
| 850 | int result = acl_nontrivial ((struct acl *) acl); | ||
| 851 | if (acl != aclbuf) | ||
| 852 | free (acl); | ||
| 853 | return result; | ||
| 854 | } | ||
| 855 | else if (type.u64 == ACL_NFS4) | ||
| 856 | { | ||
| 857 | int result = acl_nfs4_nontrivial ((nfs4_acl_int_t *) acl); | ||
| 858 | if (acl != aclbuf) | ||
| 859 | free (acl); | ||
| 860 | return result; | ||
| 861 | } | ||
| 862 | else | ||
| 863 | { | ||
| 864 | /* A newer type of ACL has been introduced in the system. | ||
| 865 | We should better support it. */ | ||
| 866 | if (acl != aclbuf) | ||
| 867 | free (acl); | ||
| 868 | errno = EINVAL; | ||
| 869 | return -1; | ||
| 870 | } | ||
| 871 | |||
| 872 | # elif HAVE_STATACL /* older AIX */ | ||
| 873 | |||
| 874 | union { struct acl a; char room[4096]; } u; | ||
| 875 | |||
| 876 | if (statacl (name, STX_NORMAL, &u.a, sizeof (u)) < 0) | ||
| 877 | return -1; | ||
| 878 | |||
| 879 | return acl_nontrivial (&u.a); | ||
| 880 | |||
| 881 | # elif HAVE_ACLSORT /* NonStop Kernel */ | ||
| 882 | |||
| 883 | { | ||
| 884 | struct acl entries[NACLENTRIES]; | ||
| 885 | int count; | ||
| 886 | |||
| 887 | count = acl ((char *) name, ACL_GET, NACLENTRIES, entries); | ||
| 888 | |||
| 889 | if (count < 0) | ||
| 890 | { | ||
| 891 | if (errno == ENOSYS || errno == ENOTSUP) | ||
| 892 | ; | ||
| 893 | else | ||
| 894 | return -1; | ||
| 895 | } | ||
| 896 | else if (count == 0) | ||
| 897 | return 0; | ||
| 898 | else /* count > 0 */ | ||
| 899 | { | ||
| 900 | if (count > NACLENTRIES) | ||
| 901 | /* If NACLENTRIES cannot be trusted, use dynamic memory | ||
| 902 | allocation. */ | ||
| 903 | abort (); | ||
| 904 | |||
| 905 | /* If there are more than 4 entries, there cannot be only the | ||
| 906 | four base ACL entries. */ | ||
| 907 | if (count > 4) | ||
| 908 | return 1; | ||
| 909 | |||
| 910 | return acl_nontrivial (count, entries); | ||
| 911 | } | ||
| 912 | } | ||
| 913 | |||
| 914 | # endif | ||
| 915 | } | ||
| 916 | #endif | ||
| 917 | |||
| 918 | return 0; | ||
| 919 | } | ||
diff --git a/lib/acl-internal.h b/lib/acl-internal.h index 243ca32b822..9b9fae2e9e0 100644 --- a/lib/acl-internal.h +++ b/lib/acl-internal.h | |||
| @@ -220,7 +220,7 @@ extern int acl_ace_nontrivial (int count, ace_t *entries) _GL_ATTRIBUTE_PURE; | |||
| 220 | 220 | ||
| 221 | /* Return 1 if the given ACL is non-trivial. | 221 | /* Return 1 if the given ACL is non-trivial. |
| 222 | Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ | 222 | Return 0 if it is trivial, i.e. equivalent to a simple stat() mode. */ |
| 223 | extern int acl_nontrivial (int count, struct acl_entry *entries, struct stat *sb); | 223 | extern int acl_nontrivial (int count, struct acl_entry *entries); |
| 224 | 224 | ||
| 225 | # if HAVE_ACLV_H /* HP-UX >= 11.11 */ | 225 | # if HAVE_ACLV_H /* HP-UX >= 11.11 */ |
| 226 | 226 | ||
diff --git a/lib/gnulib.mk b/lib/gnulib.mk index 273b018bdb8..bec0d3bb19b 100644 --- a/lib/gnulib.mk +++ b/lib/gnulib.mk | |||
| @@ -698,7 +698,7 @@ EXTRA_libgnu_a_SOURCES += putenv.c | |||
| 698 | 698 | ||
| 699 | ## begin gnulib module qacl | 699 | ## begin gnulib module qacl |
| 700 | 700 | ||
| 701 | libgnu_a_SOURCES += acl-errno-valid.c file-has-acl.c qcopy-acl.c qset-acl.c | 701 | libgnu_a_SOURCES += acl-errno-valid.c acl-internal.c qcopy-acl.c qset-acl.c |
| 702 | 702 | ||
| 703 | EXTRA_DIST += acl-internal.h acl.h acl_entries.c | 703 | EXTRA_DIST += acl-internal.h acl.h acl_entries.c |
| 704 | 704 | ||
diff --git a/lib/qcopy-acl.c b/lib/qcopy-acl.c index aac76a12432..bc258ba560b 100644 --- a/lib/qcopy-acl.c +++ b/lib/qcopy-acl.c | |||
| @@ -437,20 +437,9 @@ qcopy_acl (const char *src_name, int source_desc, const char *dst_name, | |||
| 437 | if (ret < 0 && saved_errno == 0) | 437 | if (ret < 0 && saved_errno == 0) |
| 438 | { | 438 | { |
| 439 | saved_errno = errno; | 439 | saved_errno = errno; |
| 440 | if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP) | 440 | if (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTSUP |
| 441 | { | 441 | && !acl_nontrivial (count, entries)) |
| 442 | struct stat source_statbuf; | 442 | saved_errno = 0; |
| 443 | |||
| 444 | if ((source_desc != -1 | ||
| 445 | ? fstat (source_desc, &source_statbuf) | ||
| 446 | : stat (src_name, &source_statbuf)) == 0) | ||
| 447 | { | ||
| 448 | if (!acl_nontrivial (count, entries, &source_statbuf)) | ||
| 449 | saved_errno = 0; | ||
| 450 | } | ||
| 451 | else | ||
| 452 | saved_errno = errno; | ||
| 453 | } | ||
| 454 | } | 443 | } |
| 455 | else | 444 | else |
| 456 | did_chmod = 1; | 445 | did_chmod = 1; |
diff --git a/lib/tempname.c b/lib/tempname.c index 8e6d26cc485..69c572fbcb4 100644 --- a/lib/tempname.c +++ b/lib/tempname.c | |||
| @@ -269,13 +269,13 @@ try_file (char *tmpl, void *flags) | |||
| 269 | } | 269 | } |
| 270 | 270 | ||
| 271 | static int | 271 | static int |
| 272 | try_dir (char *tmpl, void *flags) | 272 | try_dir (char *tmpl, void *flags _GL_UNUSED) |
| 273 | { | 273 | { |
| 274 | return __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR); | 274 | return __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR); |
| 275 | } | 275 | } |
| 276 | 276 | ||
| 277 | static int | 277 | static int |
| 278 | try_nocreate (char *tmpl, void *flags) | 278 | try_nocreate (char *tmpl, void *flags _GL_UNUSED) |
| 279 | { | 279 | { |
| 280 | struct_stat64 st; | 280 | struct_stat64 st; |
| 281 | 281 | ||