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

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