在getxattr系统调用期间,“无可用数据(61)”的含义是什么?

时间:2015-01-22 08:41:11

标签: android kernel system-calls cts

Daer all。 我在尝试使用Android CTS(4.4 R3)时遇到问题。

整个错误日志如下所示:

01-22 17:19:44.844 D/        (22802): isPermittedCapBitSet():     getxattr("/system/bin/run-as") call failed: return -1 (error: No data available (61))
01-22 17:19:44.844 I/TestRunner(22802): failed: testRunAsHasCorrectCapabilities(android.permission.cts.FileSystemPermissionTest)
01-22 17:19:44.844 I/TestRunner(22802): ----- begin exception -----
01-22 17:19:44.844 I/TestRunner(22802): 
01-22 17:19:44.844 I/TestRunner(22802): junit.framework.AssertionFailedError
01-22 17:19:44.844 I/TestRunner(22802):         at junit.framework.Assert.fail(Assert.java:48)
01-22 17:19:44.844 I/TestRunner(22802):         at junit.framework.Assert.assertTrue(Assert.java:20)
01-22 17:19:44.844 I/TestRunner(22802):         at junit.framework.Assert.assertTrue(Assert.java:27)
01-22 17:19:44.844 I/TestRunner(22802):         at android.permission.cts.FileSystemPermissionTest.testRunAsHasCorrectCapabilities(FileSystemPermissionTest.java:828)
01-22 17:19:44.844 I/TestRunner(22802):         at java.lang.reflect.Method.invokeNative(Native Method)
01-22 17:19:44.844 I/TestRunner(22802):         at java.lang.reflect.Method.invoke(Method.java:515)
01-22 17:19:44.844 I/TestRunner(22802):         at junit.framework.TestCase.runTest(TestCase.java:168)
01-22 17:19:44.844 I/TestRunner(22802):         at junit.framework.TestCase.runBare(TestCase.java:134)
01-22 17:19:44.844 I/TestRunner(22802):         at junit.framework.TestResult$1.protect(TestResult.java:115)
01-22 17:19:44.844 I/TestRunner(22802):         at junit.framework.TestResult.runProtected(TestResult.java:133)
01-22 17:19:44.844 I/TestRunner(22802):         at junit.framework.TestResult.run(TestResult.java:118)
01-22 17:19:44.844 I/TestRunner(22802):         at junit.framework.TestCase.run(TestCase.java:124)
01-22 17:19:44.844 I/TestRunner(22802):         at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
01-22 17:19:44.844 I/TestRunner(22802):         at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
01-22 17:19:44.844 I/TestRunner(22802):         at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
01-22 17:19:44.844 I/TestRunner(22802):         at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)
01-22 17:19:44.844 I/TestRunner(22802): ----- end exceptbinder: release 22792:22801 transaction 150222 in, still active

我追踪了导致这些错误的函数

/cts/tests/tests/permission/jni/android_permission_cts_FileUtils.cpp

 95 static jboolean isPermittedCapBitSet(JNIEnv* env, jstring path, size_t capId)
 96 {
 97     const char* pathStr = env->GetStringUTFChars(path, NULL);
 98     jboolean ret = false;
 99 
100     struct vfs_cap_data capData;
101     memset(&capData, 0, sizeof(capData));
102 
103     ssize_t result = getxattr(pathStr, XATTR_NAME_CAPS, &capData,
104                               sizeof(capData));
105     if (result > 0) {
106       ret = (capData.data[CAP_TO_INDEX(capId)].permitted &
107              CAP_TO_MASK(capId)) != 0;
108       ALOGD("isPermittedCapBitSet(): getxattr(\"%s\") call succeeded, "
109             "cap bit %u %s",
110             pathStr, capId, ret ? "set" : "unset");
111     } else {
112       ALOGD("isPermittedCapBitSet(): getxattr(\"%s\") call failed: "
113             "return %d (error: %s (%d))\n",
114             pathStr, result, strerror(errno), errno);
115     }
116 
117     env->ReleaseStringUTFChars(path, pathStr);
118     return ret;
119 }
120 

getxattr()发生的错误。

我不知道该怎么办。 我已经检查过/ system / bin / run-as。它存在且具有连接权限和所有权

root@123:/ # ls -al /system/bin/run-as                                     
-rwxr-x--- root     shell        9500 2015-01-21 14:54 run-as

请让我教我应该检查什么? 感谢

1 个答案:

答案 0 :(得分:0)

我认为您可能需要在启用了eXtended ATTRibutes(xattr)的情况下重新编译内核。对于ext3文件系统,.config中的配置值为:

CONFIG_EXT3_FS_XATTR

但是,在你的linux源代码树中输入

make menuconfig

并使用该接口为您正在使用的文件系统启用扩展属性。然后在那之后重新编译你的内核。