Revision 30297b55

b/linux-user/syscall.c
7796 7796
#endif
7797 7797
#ifdef CONFIG_ATTR
7798 7798
#ifdef TARGET_NR_setxattr
7799
    case TARGET_NR_lsetxattr:
7800
    case TARGET_NR_fsetxattr:
7801
    case TARGET_NR_lgetxattr:
7802
    case TARGET_NR_fgetxattr:
7803 7799
    case TARGET_NR_listxattr:
7804 7800
    case TARGET_NR_llistxattr:
7805 7801
    case TARGET_NR_flistxattr:
7806
    case TARGET_NR_lremovexattr:
7807
    case TARGET_NR_fremovexattr:
7808 7802
        ret = -TARGET_EOPNOTSUPP;
7809 7803
        break;
7810 7804
    case TARGET_NR_setxattr:
7805
    case TARGET_NR_lsetxattr:
7811 7806
        {
7812 7807
            void *p, *n, *v = 0;
7813 7808
            if (arg3) {
......
7820 7815
            p = lock_user_string(arg1);
7821 7816
            n = lock_user_string(arg2);
7822 7817
            if (p && n) {
7823
                ret = get_errno(setxattr(p, n, v, arg4, arg5));
7818
                if (num == TARGET_NR_setxattr) {
7819
                    ret = get_errno(setxattr(p, n, v, arg4, arg5));
7820
                } else {
7821
                    ret = get_errno(lsetxattr(p, n, v, arg4, arg5));
7822
                }
7824 7823
            } else {
7825 7824
                ret = -TARGET_EFAULT;
7826 7825
            }
......
7829 7828
            unlock_user(v, arg3, 0);
7830 7829
        }
7831 7830
        break;
7831
    case TARGET_NR_fsetxattr:
7832
        {
7833
            void *n, *v = 0;
7834
            if (arg3) {
7835
                v = lock_user(VERIFY_READ, arg3, arg4, 1);
7836
                if (!v) {
7837
                    ret = -TARGET_EFAULT;
7838
                    break;
7839
                }
7840
            }
7841
            n = lock_user_string(arg2);
7842
            if (n) {
7843
                ret = get_errno(fsetxattr(arg1, n, v, arg4, arg5));
7844
            } else {
7845
                ret = -TARGET_EFAULT;
7846
            }
7847
            unlock_user(n, arg2, 0);
7848
            unlock_user(v, arg3, 0);
7849
        }
7850
        break;
7832 7851
    case TARGET_NR_getxattr:
7852
    case TARGET_NR_lgetxattr:
7833 7853
        {
7834 7854
            void *p, *n, *v = 0;
7835 7855
            if (arg3) {
......
7842 7862
            p = lock_user_string(arg1);
7843 7863
            n = lock_user_string(arg2);
7844 7864
            if (p && n) {
7845
                ret = get_errno(getxattr(p, n, v, arg4));
7865
                if (num == TARGET_NR_getxattr) {
7866
                    ret = get_errno(getxattr(p, n, v, arg4));
7867
                } else {
7868
                    ret = get_errno(lgetxattr(p, n, v, arg4));
7869
                }
7846 7870
            } else {
7847 7871
                ret = -TARGET_EFAULT;
7848 7872
            }
......
7851 7875
            unlock_user(v, arg3, arg4);
7852 7876
        }
7853 7877
        break;
7878
    case TARGET_NR_fgetxattr:
7879
        {
7880
            void *n, *v = 0;
7881
            if (arg3) {
7882
                v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
7883
                if (!v) {
7884
                    ret = -TARGET_EFAULT;
7885
                    break;
7886
                }
7887
            }
7888
            n = lock_user_string(arg2);
7889
            if (n) {
7890
                ret = get_errno(fgetxattr(arg1, n, v, arg4));
7891
            } else {
7892
                ret = -TARGET_EFAULT;
7893
            }
7894
            unlock_user(n, arg2, 0);
7895
            unlock_user(v, arg3, arg4);
7896
        }
7897
        break;
7854 7898
    case TARGET_NR_removexattr:
7899
    case TARGET_NR_lremovexattr:
7855 7900
        {
7856 7901
            void *p, *n;
7857 7902
            p = lock_user_string(arg1);
7858 7903
            n = lock_user_string(arg2);
7859 7904
            if (p && n) {
7860
                ret = get_errno(removexattr(p, n));
7905
                if (num == TARGET_NR_removexattr) {
7906
                    ret = get_errno(removexattr(p, n));
7907
                } else {
7908
                    ret = get_errno(lremovexattr(p, n));
7909
                }
7861 7910
            } else {
7862 7911
                ret = -TARGET_EFAULT;
7863 7912
            }
......
7865 7914
            unlock_user(n, arg2, 0);
7866 7915
        }
7867 7916
        break;
7917
    case TARGET_NR_fremovexattr:
7918
        {
7919
            void *n;
7920
            n = lock_user_string(arg2);
7921
            if (n) {
7922
                ret = get_errno(fremovexattr(arg1, n));
7923
            } else {
7924
                ret = -TARGET_EFAULT;
7925
            }
7926
            unlock_user(n, arg2, 0);
7927
        }
7928
        break;
7868 7929
#endif
7869 7930
#endif /* CONFIG_ATTR */
7870 7931
#ifdef TARGET_NR_set_thread_area

Also available in: Unified diff