The avb_ops.h header file, which has been imported from the upstream
libavb, says:

   /* Reads a persistent value corresponding to the given |name|. The value is
    * returned in |out_buffer| which must point to |buffer_size| bytes. On
    * success |out_num_bytes_read| contains the number of bytes read into
    * |out_buffer|. If AVB_IO_RESULT_ERROR_INSUFFICIENT_SPACE is returned,
    * |out_num_bytes_read| contains the number of bytes that would have been 
read
    * which can be used to allocate a buffer.

The invoke_func() wrapper does translate a TEE_ERROR_STORAGE_NO_SPACE
return to AVB_IO_RESULT_ERROR_INSUFFICIENT_SPACE. However, this
implementation of the read_persistent_value method currently never
updates *out_num_bytes_read in case of an error.

Also note that currently, at least the upstream optee-os
implementation of TA_AVB_CMD_READ_PERSIST_VALUE never returns
TEE_ERROR_STORAGE_NO_SPACE, but instead silently returns a truncated
value, with no way for the caller to know that happened. A fix has
been proposed (https://github.com/OP-TEE/optee_os/pull/7959).

Signed-off-by: Rasmus Villemoes <[email protected]>
---
 common/avb_verify.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/common/avb_verify.c b/common/avb_verify.c
index 76c523fd0ba..af166e7dfba 100644
--- a/common/avb_verify.c
+++ b/common/avb_verify.c
@@ -963,8 +963,11 @@ static AvbIOResult read_persistent_value(AvbOps *ops,
 
        rc = invoke_func(ops->user_data, TA_AVB_CMD_READ_PERSIST_VALUE,
                         2, param);
-       if (rc)
+       if (rc) {
+               if (rc == AVB_IO_RESULT_ERROR_INSUFFICIENT_SPACE)
+                       *out_num_bytes_read = param[1].u.memref.size;
                goto out;
+       }
 
        if (param[1].u.memref.size > buffer_size) {
                rc = AVB_IO_RESULT_ERROR_NO_SUCH_VALUE;
-- 
2.55.0

Reply via email to