summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-06-03 14:01:18 +0100
committerRichard Jones <rjones@redhat.com>2010-06-03 14:33:59 +0100
commit0606cb54671e10f104b4eba1c70378ef8725322b (patch)
tree56cc777c30d8f721ad1ba2fb073321a70d6a827e
parentf9d08600c52dc0730e7dad8d9259b59e32aeece2 (diff)
downloadlibguestfs-0606cb54671e10f104b4eba1c70378ef8725322b.tar.gz
libguestfs-0606cb54671e10f104b4eba1c70378ef8725322b.tar.xz
libguestfs-0606cb54671e10f104b4eba1c70378ef8725322b.zip
mkfs-b: Check that blocksize parameter is > 0 and a power of 2.
-rw-r--r--daemon/daemon.h2
-rw-r--r--daemon/guestfsd.c7
-rw-r--r--daemon/mkfs.c5
3 files changed, 14 insertions, 0 deletions
diff --git a/daemon/daemon.h b/daemon/daemon.h
index d90b65cd..55f7b08a 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -48,6 +48,8 @@ extern void sort_strings (char **argv, int len);
extern void free_strings (char **argv);
extern void free_stringslen (char **argv, int len);
+extern int is_power_of_2 (unsigned long v);
+
#define command(out,err,name,...) commandf((out),(err),0,(name),__VA_ARGS__)
#define commandr(out,err,name,...) commandrf((out),(err),0,(name),__VA_ARGS__)
#define commandv(out,err,argv) commandvf((out),(err),0,(argv))
diff --git a/daemon/guestfsd.c b/daemon/guestfsd.c
index f9e5a682..49aca08d 100644
--- a/daemon/guestfsd.c
+++ b/daemon/guestfsd.c
@@ -554,6 +554,13 @@ count_strings (char *const *argv)
return argc;
}
+/* http://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2 */
+int
+is_power_of_2 (unsigned long v)
+{
+ return v && ((v & (v - 1)) == 0);
+}
+
static int
compare (const void *vp1, const void *vp2)
{
diff --git a/daemon/mkfs.c b/daemon/mkfs.c
index 6735d24d..2c3a3cd9 100644
--- a/daemon/mkfs.c
+++ b/daemon/mkfs.c
@@ -104,6 +104,11 @@ do_mkfs_b (const char *fstype, int blocksize, const char *device)
const char *extra[2];
char blocksize_s[32];
+ if (blocksize <= 0 || !is_power_of_2 (blocksize)) {
+ reply_with_error ("block size must be > 0 and a power of 2");
+ return -1;
+ }
+
snprintf (blocksize_s, sizeof blocksize_s, "%d", blocksize);
extra[0] = "-b";