Change:
+        return TSS2_TCTI_RC_BAD_VALUE; +    } +    *handle = dlopen(file_xfrm, RTLD_NOW); <del> if (*handle != NULL) { return TSS2_RC_SUCCESS; } else { @@ -94,7 +102,7 @@ handle_from_name(const char *file, /* 'name' alone didn't work, try libtss2-tcti-<name>.so.0 */ size = snprintf(file_xfrm, sizeof (file_xfrm), -                    TCTI_NAME_TEMPLATE_0, </del> <ins> +    if (*handle != NULL) { +        return TSS2_RC_SUCCESS; +    } else { +        LOG_DEBUG("Could not load TCTI file: "%s": %s", file, dlerror()); +    } +    /* 'name' alone didn't work, try libtss2-tcti-<name>.so.0 */ +    size = snprintf(file_xfrm, +                    sizeof (file_xfrm), </ins> +                    "@PREFIX@" TCTI_NAME_TEMPLATE_0, <del> file); if (size >= sizeof (file_xfrm)) { LOG_ERROR("TCTI name truncated in transform."); @@ -109,7 +117,7 @@ handle_from_name(const char *file, /* libtss2-tcti-<name>.so.0 didn't work, try libtss2-tcti-<name>.so */ size = snprintf(file_xfrm, sizeof (file_xfrm), -                    TCTI_NAME_TEMPLATE, </del> <ins> +                    file); +    if (size >= sizeof (file_xfrm)) { +        LOG_ERROR("TCTI name truncated in transform."); +        return TSS2_TCTI_RC_BAD_VALUE; +    } +    *handle = dlopen(file_xfrm, RTLD_NOW); +    if (*handle != NULL) { +        return TSS2_RC_SUCCESS; +    } else { +        LOG_DEBUG("Could not load TCTI file "%s": %s", file, dlerror()); +    } +    /* libtss2-tcti-<name>.so.0 didn't work, try libtss2-tcti-<name>.so */ +    size = snprintf(file_xfrm, +                    sizeof (file_xfrm), </ins> +                    "@PREFIX@" TCTI_NAME_TEMPLATE, <del> file); if (size >= sizeof (file_xfrm)) { LOG_ERROR("TCTI name truncated in transform."); </del> <ins> +                    file); +    if (size >= sizeof (file_xfrm)) { +        LOG_ERROR("TCTI name truncated in transform."); +        return TSS2_TCTI_RC_BAD_VALUE; +    } +    *handle = dlopen(file_xfrm, RTLD_NOW); if (*handle == NULL) { LOG_DEBUG("Failed to load TCTI for name "%s": %s", file, dlerror()); return TSS2_TCTI_RC_NOT_SUPPORTED; diff --git a/test/unit/tctildr-dl.c b/test/unit/tctildr-dl.c index 873a4531..c17b939e 100644 --- a/test/unit/tctildr-dl.c +++ b/test/unit/tctildr-dl.c @@ -223,6 +223,18 @@ test_get_info_default_success (void **state) expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-default.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); + +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-default.so.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); + +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-default.so.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); + expect_string(__wrap_dlopen, filename, "libtss2-tcti-tabrmd.so.0"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, HANDLE); @@ -255,6 +267,18 @@ test_get_info_default_info_fail (void **state) expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-default.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); + +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-default.so.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); + +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-default.so.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); + expect_string(__wrap_dlopen, filename, "libtss2-tcti-tabrmd.so.0"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, HANDLE); @@ -407,6 +431,15 @@ test_tcti_fail_all (void **state) expect_string(__wrap_dlopen, filename, "libtss2-tcti-libtss2-tcti-default.so.so"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-default.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-default.so.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-default.so.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); /* Skip over libtss2-tcti-tabrmd.so */ expect_string(__wrap_dlopen, filename, "libtss2-tcti-tabrmd.so.0"); @@ -418,6 +451,15 @@ test_tcti_fail_all (void **state) expect_string(__wrap_dlopen, filename, "libtss2-tcti-libtss2-tcti-tabrmd.so.0.so"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-tabrmd.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-tabrmd.so.0.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-tabrmd.so.0.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); /* Skip over libtss2-tcti-device.so, /dev/tpmrm0 */ expect_string(__wrap_dlopen, filename, "libtss2-tcti-device.so.0"); @@ -429,6 +471,15 @@ test_tcti_fail_all (void **state) expect_string(__wrap_dlopen, filename, "libtss2-tcti-libtss2-tcti-device.so.0.so"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-device.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-device.so.0.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-device.so.0.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); /* Skip over libtss2-tcti-device.so, /dev/tpm0 */ expect_string(__wrap_dlopen, filename, "libtss2-tcti-device.so.0"); @@ -440,6 +491,15 @@ test_tcti_fail_all (void **state) expect_string(__wrap_dlopen, filename, "libtss2-tcti-libtss2-tcti-device.so.0.so"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-device.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-device.so.0.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-device.so.0.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); /* Skip over libtss2-tcti-swtpm.so */ expect_string(__wrap_dlopen, filename, "libtss2-tcti-swtpm.so.0"); @@ -451,6 +511,15 @@ test_tcti_fail_all (void **state) expect_string(__wrap_dlopen, filename, "libtss2-tcti-libtss2-tcti-swtpm.so.0.so"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-swtpm.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-swtpm.so.0.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-swtpm.so.0.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); /* Skip over libtss2-tcti-mssim.so */ expect_string(__wrap_dlopen, filename, "libtss2-tcti-mssim.so.0"); @@ -462,6 +531,15 @@ test_tcti_fail_all (void **state) expect_string(__wrap_dlopen, filename, "libtss2-tcti-libtss2-tcti-mssim.so.0.so"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-mssim.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-mssim.so.0.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-libtss2-tcti-mssim.so.0.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); TSS2_RC r; TSS2_TCTI_CONTEXT *tcti; @@ -490,6 +568,15 @@ test_info_from_name_handle_fail (void **state) expect_string(__wrap_dlopen, filename, "libtss2-tcti-foo.so"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/foo"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-foo.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-foo.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); TSS2_RC rc = info_from_name ("foo", &info, &data); assert_int_equal (rc, TSS2_TCTI_RC_NOT_SUPPORTED); @@ -606,6 +693,15 @@ test_tctildr_get_info_from_name (void **state) expect_string(__wrap_dlopen, filename, "libtss2-tcti-foo.so"); expect_value(__wrap_dlopen, flags, RTLD_NOW); will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/foo"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-foo.so.0"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); +    expect_string(__wrap_dlopen, filename, "@PREFIX@/libtss2-tcti-foo.so"); +    expect_value(__wrap_dlopen, flags, RTLD_NOW); +    will_return(__wrap_dlopen, NULL); TSS2_RC rc = tctildr_get_info ("foo", &info, &data); assert_int_equal (rc, TSS2_TCTI_RC_NOT_SUPPORTED); </ins>

Discussion:
tpm2-tss is unable to resolve the tabrmd loader located in the tpm2-abrmd package throwing this error when Steps to reproduce the behavior: the abrmd daemon and set the tcti environment interface to tabrmd tool or package using the tpm2-tss library It resolves the loader dynamically and works. I have narrowed down the cause to this commit making the dynamic loader only resolve locally from the library output. Reverting this in an overlay seems to have fixed the issue, but I am unsure if this would cause regressions as I am unsure why the dynamic loading got patched in the first place.
I patched the tpm2-tss because when using tpm2 as a library, the modules would not be up in the dlopen load path which would break modules loading. A couple more details here:
This was a bit more tricky than I expected, while other python packages gets the dlopen library name patched with the exact path this is not possible in this case due to tpm2-tss doing the loading as far I understand. Unless I remember wrong I think it might be possible to dlopen with the exact path in python before calling tpm2-tss init and ld might be able to resolve the already library loaded library, but I might remember wrong. But this would also be undesirable since you cannot dynamically resolve loaders this way I assume.
Ha! So the issue would be that tabmd tries to look up libtss2-tcti- and this is provided by tpm2-abrmd. I completely missed that.