Instead of using UTS_RELEASE, use uts_release, which means that we don't
need to rebuild the code just for the git head commit changing.

Since UTS_RELEASE was used for fw_path and this points to const data,
append uts_release dynamically to an intermediate string.

Signed-off-by: John Garry <john.g.ga...@oracle.com>
---
 drivers/base/firmware_loader/main.c | 39 +++++++++++++++++++++++------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/drivers/base/firmware_loader/main.c 
b/drivers/base/firmware_loader/main.c
index ea28102d421e..87da7be61a29 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -38,7 +38,7 @@
 #include <linux/zstd.h>
 #include <linux/xz.h>
 
-#include <generated/utsrelease.h>
+#include <linux/utsname.h>
 
 #include "../base.h"
 #include "firmware.h"
@@ -471,9 +471,9 @@ static int fw_decompress_xz(struct device *dev, struct 
fw_priv *fw_priv,
 static char fw_path_para[256];
 static const char * const fw_path[] = {
        fw_path_para,
-       "/lib/firmware/updates/" UTS_RELEASE,
+       "/lib/firmware/updates/", /* UTS_RELEASE is appended later */
        "/lib/firmware/updates",
-       "/lib/firmware/" UTS_RELEASE,
+       "/lib/firmware/", /* UTS_RELEASE is appended later */
        "/lib/firmware"
 };
 
@@ -496,7 +496,7 @@ fw_get_filesystem_firmware(struct device *device, struct 
fw_priv *fw_priv,
        size_t size;
        int i, len, maxlen = 0;
        int rc = -ENOENT;
-       char *path, *nt = NULL;
+       char *path, *fw_path_string, *nt = NULL;
        size_t msize = INT_MAX;
        void *buffer = NULL;
 
@@ -510,6 +510,12 @@ fw_get_filesystem_firmware(struct device *device, struct 
fw_priv *fw_priv,
        if (!path)
                return -ENOMEM;
 
+       fw_path_string = __getname();
+       if (!fw_path_string) {
+               __putname(path);
+               return -ENOMEM;
+       }
+
        wait_for_initramfs();
        for (i = 0; i < ARRAY_SIZE(fw_path); i++) {
                size_t file_size = 0;
@@ -519,16 +525,32 @@ fw_get_filesystem_firmware(struct device *device, struct 
fw_priv *fw_priv,
                if (!fw_path[i][0])
                        continue;
 
+               len = snprintf(fw_path_string, PATH_MAX, "%s", fw_path[i]);
+               if (len >= PATH_MAX) {
+                       rc = -ENAMETOOLONG;
+                       break;
+               }
+
+               /* Special handling to append UTS_RELEASE */
+               if (fw_path[i][len - 1] == '/') {
+                       len = snprintf(fw_path_string, PATH_MAX, "%s%s",
+                                       fw_path[i], uts_release);
+                       if (len >= PATH_MAX) {
+                               rc = -ENAMETOOLONG;
+                               break;
+                       }
+               }
+
                /* strip off \n from customized path */
-               maxlen = strlen(fw_path[i]);
+               maxlen = strlen(fw_path_string);
                if (i == 0) {
-                       nt = strchr(fw_path[i], '\n');
+                       nt = strchr(fw_path_string, '\n');
                        if (nt)
-                               maxlen = nt - fw_path[i];
+                               maxlen = nt - fw_path_string;
                }
 
                len = snprintf(path, PATH_MAX, "%.*s/%s%s",
-                              maxlen, fw_path[i],
+                              maxlen, fw_path_string,
                               fw_priv->fw_name, suffix);
                if (len >= PATH_MAX) {
                        rc = -ENAMETOOLONG;
@@ -585,6 +607,7 @@ fw_get_filesystem_firmware(struct device *device, struct 
fw_priv *fw_priv,
                break;
        }
        __putname(path);
+       __putname(fw_path_string);
 
        return rc;
 }
-- 
2.35.3


Reply via email to