Signed-off-by: MORITA Kazutaka <[email protected]>
---
 collie/vdi.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/collie/vdi.c b/collie/vdi.c
index 6ac73cf..6343207 100644
--- a/collie/vdi.c
+++ b/collie/vdi.c
@@ -971,10 +971,18 @@ static int vdi_read(int argc, char **argv)
                ret = parse_option_size(argv[optind++], &offset);
                if (ret < 0)
                        return EXIT_USAGE;
+               if (offset % 512 != 0) {
+                       fprintf(stderr, "offset must be block-aligned\n");
+                       return EXIT_USAGE;
+               }
                if (argv[optind]) {
                        ret = parse_option_size(argv[optind++], &total);
                        if (ret < 0)
                                return EXIT_USAGE;
+                       if (total % 512 != 0) {
+                               fprintf(stderr, "len must be block-aligned\n");
+                               return EXIT_USAGE;
+                       }
                }
        }
 
@@ -1007,6 +1015,7 @@ static int vdi_read(int argc, char **argv)
        }
 
        total = min(total, inode->vdi_size - offset);
+       total = roundup(total, 512);
        idx = offset / SD_DATA_OBJ_SIZE;
        while (done < total) {
                len = min(total - done, SD_DATA_OBJ_SIZE - offset);
@@ -1057,10 +1066,18 @@ static int vdi_write(int argc, char **argv)
                ret = parse_option_size(argv[optind++], &offset);
                if (ret < 0)
                        return EXIT_USAGE;
+               if (offset % 512 != 0) {
+                       fprintf(stderr, "offset must be block-aligned\n");
+                       return EXIT_USAGE;
+               }
                if (argv[optind]) {
                        ret = parse_option_size(argv[optind++], &total);
                        if (ret < 0)
                                return EXIT_USAGE;
+                       if (total % 512 != 0) {
+                               fprintf(stderr, "len must be block-aligned\n");
+                               return EXIT_USAGE;
+                       }
                }
        }
 
@@ -1092,6 +1109,7 @@ static int vdi_write(int argc, char **argv)
        }
 
        total = min(total, inode->vdi_size - offset);
+       total = roundup(total, 512);
        idx = offset / SD_DATA_OBJ_SIZE;
        while (done < total) {
                create = 0;
-- 
1.7.2.5

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to