]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
pager: use ul_strfconcat() instead of fixed-size buffer
authorYuriyRyabikov <22548029+kurok@users.noreply.github.com>
Fri, 13 Mar 2026 17:28:36 +0000 (17:28 +0000)
committerYuriyRyabikov <22548029+kurok@users.noreply.github.com>
Fri, 13 Mar 2026 17:28:36 +0000 (17:28 +0000)
Replace char less_val[256] with dynamically allocated ul_strfconcat()
to avoid silent truncation when LESS env is already long.

lib/pager.c

index c2efb91bcff5d14d3debf16c0d27a638b47a9fd8..b24fa2f645948fc97a86396b86f5ee4670171709 100644 (file)
@@ -23,6 +23,7 @@
 #include "c.h"
 #include "xalloc.h"
 #include "nls.h"
+#include "strutils.h"
 #include "ttyutils.h"
 #include "pager.h"
 
@@ -59,33 +60,30 @@ static inline void close_pair(int fd[2])
 static void pager_preexec(void)
 {
        const char *less_env = getenv("LESS");
-       char less_val[256];
+       const char *base = less_env ? less_env : "FRSX";
        int header_lines = pager_process.header_lines;
        int header_width = pager_process.header_width;
+       char *less_val = NULL;
 
        if (header_lines > 0 && header_width > 0)
-               snprintf(less_val, sizeof(less_val),
-                        "%s --header %d,%d",
-                        less_env ? less_env : "FRSX",
-                        header_lines, header_width);
+               less_val = ul_strfconcat(base, " --header %d,%d",
+                                        header_lines, header_width);
        else if (header_width > 0)
-               snprintf(less_val, sizeof(less_val),
-                        "%s --header 0,%d",
-                        less_env ? less_env : "FRSX",
-                        header_width);
+               less_val = ul_strfconcat(base, " --header 0,%d",
+                                        header_width);
        else if (header_lines > 0)
-               snprintf(less_val, sizeof(less_val),
-                        "%s --header %d",
-                        less_env ? less_env : "FRSX",
-                        header_lines);
-       else if (less_env == NULL)
-               snprintf(less_val, sizeof(less_val), "FRSX");
-       else
-               goto skip_less;
-
-       if (setenv("LESS", less_val, 1) != 0)
-               warn(_("failed to set the %s environment variable"), "LESS");
-skip_less:
+               less_val = ul_strfconcat(base, " --header %d",
+                                        header_lines);
+
+       if (less_val) {
+               if (setenv("LESS", less_val, 1) != 0)
+                       warn(_("failed to set the %s environment variable"), "LESS");
+               free(less_val);
+       } else if (less_env == NULL) {
+               if (setenv("LESS", "FRSX", 0) != 0)
+                       warn(_("failed to set the %s environment variable"), "LESS");
+       }
+
        if (getenv("LV") == NULL && setenv("LV", "-c", 0) != 0)
                warn(_("failed to set the %s environment variable"), "LV");
 }