Blame SOURCES/resize-proc-cmdline-buffer.patch

01552a
From 6e15c8b20b2ff852fcc638948eb88ea5dfa4a916 Mon Sep 17 00:00:00 2001
01552a
From: Ray Strode <rstrode@redhat.com>
01552a
Date: Fri, 10 Oct 2014 16:11:01 -0400
01552a
Subject: [PATCH] main: fix incorrectly sized buffer for /proc/cmdline
01552a
01552a
We assume /proc/cmdline will be no more than 512 bytes (including NUL).
01552a
It can actually be 4096 bytes (excluding NUL).
01552a
01552a
This commit makes sure we allocate enough space for it and its NUL.
01552a
---
01552a
 src/main.c | 5 ++---
01552a
 1 file changed, 2 insertions(+), 3 deletions(-)
01552a
01552a
diff --git a/src/main.c b/src/main.c
01552a
index 4101550..d5f4f4d 100644
01552a
--- a/src/main.c
01552a
+++ b/src/main.c
01552a
@@ -30,61 +30,61 @@
01552a
 #include <fcntl.h>
01552a
 #include <stdlib.h>
01552a
 #include <stdio.h>
01552a
 #include <sysexits.h>
01552a
 #include <sys/ioctl.h>
01552a
 #include <unistd.h>
01552a
 #include <wchar.h>
01552a
 #include <paths.h>
01552a
 #include <assert.h>
01552a
 #include <values.h>
01552a
 
01552a
 #include <linux/kd.h>
01552a
 #include <linux/vt.h>
01552a
 
01552a
 #include "ply-buffer.h"
01552a
 #include "ply-command-parser.h"
01552a
 #include "ply-boot-server.h"
01552a
 #include "ply-boot-splash.h"
01552a
 #include "ply-device-manager.h"
01552a
 #include "ply-event-loop.h"
01552a
 #include "ply-hashtable.h"
01552a
 #include "ply-list.h"
01552a
 #include "ply-logger.h"
01552a
 #include "ply-renderer.h"
01552a
 #include "ply-terminal-session.h"
01552a
 #include "ply-trigger.h"
01552a
 #include "ply-utils.h"
01552a
 #include "ply-progress.h"
01552a
 
01552a
 #ifndef PLY_MAX_COMMAND_LINE_SIZE
01552a
-#define PLY_MAX_COMMAND_LINE_SIZE 512
01552a
+#define PLY_MAX_COMMAND_LINE_SIZE 4097
01552a
 #endif
01552a
 
01552a
 #define BOOT_DURATION_FILE     PLYMOUTH_TIME_DIRECTORY "/boot-duration"
01552a
 #define SHUTDOWN_DURATION_FILE PLYMOUTH_TIME_DIRECTORY "/shutdown-duration"
01552a
 
01552a
 typedef enum {
01552a
   PLY_MODE_BOOT,
01552a
   PLY_MODE_SHUTDOWN,
01552a
   PLY_MODE_UPDATES
01552a
 } ply_mode_t;
01552a
 
01552a
 typedef struct 
01552a
 {
01552a
   const char    *keys;
01552a
   ply_trigger_t *trigger;
01552a
 } ply_keystroke_watch_t;
01552a
 
01552a
 typedef struct 
01552a
 {
01552a
   enum {PLY_ENTRY_TRIGGER_TYPE_PASSWORD,
01552a
         PLY_ENTRY_TRIGGER_TYPE_QUESTION}
01552a
         type;
01552a
   const char    *prompt;
01552a
   ply_trigger_t *trigger;
01552a
 } ply_entry_trigger_t;
01552a
 
01552a
 typedef struct
01552a
 {
01552a
   ply_event_loop_t *loop;
01552a
   ply_boot_server_t *boot_server;
01552a
@@ -1782,68 +1782,67 @@ detach_from_running_session (state_t *state)
01552a
 
01552a
   if (!state->is_attached)
01552a
     return;
01552a
 
01552a
   ply_trace ("detaching from terminal session");
01552a
   ply_terminal_session_detach (state->session);
01552a
   state->is_redirected = false;
01552a
   state->is_attached = false;
01552a
 }
01552a
 
01552a
 static bool
01552a
 get_kernel_command_line (state_t *state)
01552a
 {
01552a
   int fd;
01552a
   const char *remaining_command_line;
01552a
   char *key;
01552a
 
01552a
   if (state->kernel_command_line_is_set)
01552a
     return true;
01552a
 
01552a
   ply_trace ("opening /proc/cmdline");
01552a
   fd = open ("/proc/cmdline", O_RDONLY);
01552a
 
01552a
   if (fd < 0)
01552a
     {
01552a
       ply_trace ("couldn't open it: %m");
01552a
       return false;
01552a
     }
01552a
 
01552a
   ply_trace ("reading kernel command line");
01552a
-  if (read (fd, state->kernel_command_line, sizeof (state->kernel_command_line)) < 0)
01552a
+  if (read (fd, state->kernel_command_line, sizeof (state->kernel_command_line) - 1) < 0)
01552a
     {
01552a
       ply_trace ("couldn't read it: %m");
01552a
       close (fd);
01552a
       return false;
01552a
     }
01552a
 
01552a
-
01552a
   /* we now use plymouth.argument for kernel commandline arguments.
01552a
    * It used to be plymouth:argument. This bit just rewrites all : to be .
01552a
    */
01552a
   remaining_command_line = state->kernel_command_line;
01552a
   while ((key = strstr (remaining_command_line, "plymouth:")) != NULL)
01552a
     {
01552a
       char *colon;
01552a
 
01552a
       colon = key + strlen ("plymouth");
01552a
       *colon = '.';
01552a
 
01552a
       remaining_command_line = colon + 1;
01552a
     }
01552a
   ply_trace ("Kernel command line is: '%s'", state->kernel_command_line);
01552a
 
01552a
   close (fd);
01552a
 
01552a
   state->kernel_command_line_is_set = true;
01552a
   return true;
01552a
 }
01552a
 
01552a
 static void
01552a
 check_verbosity (state_t *state)
01552a
 {
01552a
   const char *stream;
01552a
   const char *path;
01552a
 
01552a
   ply_trace ("checking if tracing should be enabled");
01552a
 
01552a
   stream = command_line_get_string_after_prefix (state->kernel_command_line,
01552a
-- 
01552a
1.8.3.1
01552a