umount: Enable device name translation for device parameter.
[libguestfs.git] / daemon / sfdisk.c
index f512e26..8a5a46b 100644 (file)
 #include "actions.h"
 
 static int
-sfdisk (char *device, int n, int cyls, int heads, int sectors,
-       const char *extra_flag,
-       char * const* const lines)
+sfdisk (const char *device, int n, int cyls, int heads, int sectors,
+        const char *extra_flag,
+        char * const* const lines)
 {
   FILE *fp;
   char buf[256];
   int i;
 
-  IS_DEVICE (device, -1);
-
   strcpy (buf, "/sbin/sfdisk");
 
   if (n > 0)
@@ -50,10 +48,23 @@ sfdisk (char *device, int n, int cyls, int heads, int sectors,
     sprintf (buf + strlen (buf), " -H %d", heads);
   if (sectors)
     sprintf (buf + strlen (buf), " -S %d", sectors);
-  if (extra_flag)
+
+  /* The above are all guaranteed to fit in the fixed-size buffer.
+     However, extra_flag and device have no restrictions,
+     so we must check.  */
+
+  if (extra_flag) {
+    if (strlen (buf) + 1 + strlen (extra_flag) >= sizeof buf) {
+      reply_with_error ("internal buffer overflow: sfdisk extra_flag too long");
+      return -1;
+    }
     sprintf (buf + strlen (buf), " %s", extra_flag);
+  }
 
-  /* Safe because of IS_DEVICE above: */
+  if (strlen (buf) + 1 + strlen (device) >= sizeof buf) {
+    reply_with_error ("internal buffer overflow: sfdisk device name too long");
+    return -1;
+  }
   sprintf (buf + strlen (buf), " %s", device);
 
   if (verbose)
@@ -84,15 +95,15 @@ sfdisk (char *device, int n, int cyls, int heads, int sectors,
 }
 
 int
-do_sfdisk (char *device, int cyls, int heads, int sectors,
-          char **lines)
+do_sfdisk (const char *device, int cyls, int heads, int sectors,
+           char **lines)
 {
   return sfdisk (device, 0, cyls, heads, sectors, NULL, lines);
 }
 
 int
-do_sfdisk_N (char *device, int n, int cyls, int heads, int sectors,
-            char *line)
+do_sfdisk_N (const char *device, int n, int cyls, int heads, int sectors,
+             const char *line)
 {
   const char *lines[2] = { line, NULL };
 
@@ -100,19 +111,17 @@ do_sfdisk_N (char *device, int n, int cyls, int heads, int sectors,
 }
 
 int
-do_sfdiskM (char *device, char **lines)
+do_sfdiskM (const char *device, char **lines)
 {
   return sfdisk (device, 0, 0, 0, 0, "-uM", lines);
 }
 
 static char *
-sfdisk_flag (char *device, const char *flag)
+sfdisk_flag (const char *device, const char *flag)
 {
   char *out, *err;
   int r;
 
-  IS_DEVICE (device, NULL);
-
   r = command (&out, &err, "/sbin/sfdisk", flag, device, NULL);
   if (r == -1) {
     reply_with_error ("sfdisk: %s: %s", device, err);
@@ -129,19 +138,19 @@ sfdisk_flag (char *device, const char *flag)
 }
 
 char *
-do_sfdisk_l (char *device)
+do_sfdisk_l (const char *device)
 {
   return sfdisk_flag (device, "-l");
 }
 
 char *
-do_sfdisk_kernel_geometry (char *device)
+do_sfdisk_kernel_geometry (const char *device)
 {
   return sfdisk_flag (device, "-g");
 }
 
 char *
-do_sfdisk_disk_geometry (char *device)
+do_sfdisk_disk_geometry (const char *device)
 {
   return sfdisk_flag (device, "-G");
 }