powerpc/pseries: fix plpks_read_var() code for different consumers
authorNayna Jain <nayna@linux.ibm.com>
Sun, 6 Nov 2022 20:58:39 +0000 (15:58 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:32:50 +0000 (13:32 +0100)
[ Upstream commit 1f622f3f80cbf8999ff5955a2fcfbd801a1f32e0 ]

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 <nayna@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221106205839.600442-7-nayna@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/powerpc/platforms/pseries/plpks.c

index cbea447..63a1e1f 100644 (file)
@@ -366,22 +366,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);
@@ -390,9 +392,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) {
                pr_err("Failed to read variable %s for component %s with error %d\n",