Even though plpks_read_var() is currently called to read variables
owned by different consumers, it internally supports only OS consumer.

Fix plpks_read_var() to handle different consumers correctly.

Fixes: 2454a7af0f2a ("powerpc/pseries: define driver for Platform KeyStore")
Signed-off-by: Nayna Jain <na...@linux.ibm.com>
---
 arch/powerpc/platforms/pseries/plpks.c | 28 +++++++++++++++++---------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/plpks.c 
b/arch/powerpc/platforms/pseries/plpks.c
index e8c02735b702..4edd1585e245 100644
--- a/arch/powerpc/platforms/pseries/plpks.c
+++ b/arch/powerpc/platforms/pseries/plpks.c
@@ -354,22 +354,24 @@ static int plpks_read_var(u8 consumer, struct plpks_var 
*var)
 {
        unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = { 0 };
        struct plpks_auth *auth;
-       struct label *label;
+       struct label *label = NULL;
        u8 *output;
        int rc;
 
        if (var->namelen > MAX_NAME_SIZE)
                return -EINVAL;
 
-       auth = construct_auth(PKS_OS_OWNER);
+       auth = construct_auth(consumer);
        if (IS_ERR(auth))
                return PTR_ERR(auth);
 
-       label = construct_label(var->component, var->os, var->name,
-                               var->namelen);
-       if (IS_ERR(label)) {
-               rc = PTR_ERR(label);
-               goto out_free_auth;
+       if (consumer == PKS_OS_OWNER) {
+               label = construct_label(var->component, var->os, var->name,
+                                       var->namelen);
+               if (IS_ERR(label)) {
+                       rc = PTR_ERR(label);
+                       goto out_free_auth;
+               }
        }
 
        output = kzalloc(maxobjsize, GFP_KERNEL);
@@ -378,9 +380,15 @@ static int plpks_read_var(u8 consumer, struct plpks_var 
*var)
                goto out_free_label;
        }
 
-       rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
-                        virt_to_phys(label), label->size, virt_to_phys(output),
-                        maxobjsize);
+       if (consumer == PKS_OS_OWNER)
+               rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
+                                virt_to_phys(label), label->size, 
virt_to_phys(output),
+                                maxobjsize);
+       else
+               rc = plpar_hcall(H_PKS_READ_OBJECT, retbuf, virt_to_phys(auth),
+                                virt_to_phys(var->name), var->namelen, 
virt_to_phys(output),
+                                maxobjsize);
+
 
        if (rc != H_SUCCESS) {
                rc = pseries_status_to_err(rc);
-- 
2.31.1

Reply via email to