From: Keith Busch Date: Tue, 17 May 2016 22:59:29 +0000 (-0600) Subject: Align and clear user buffers X-Git-Tag: v0.7~1 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=35ff90cce41b985afeeb4ad0ac72e2cd1b16f8ea;p=users%2Fsagi%2Fnvme-cli.git Align and clear user buffers Avoid the bounce buffers a kernel may allocate by using aligned memory, and clear the memory in case the user's input doesn't fill the entire buffer. Signed-off-by: Keith Busch --- diff --git a/nvme.c b/nvme.c index ab469af5..6626ed1c 100644 --- a/nvme.c +++ b/nvme.c @@ -1044,8 +1044,11 @@ static int get_feature(int argc, char **argv) break; } - if (cfg.data_len) - buf = malloc(cfg.data_len); + if (cfg.data_len) { + if (posix_memalign(&buf, getpagesize(), cfg.data_len)) + exit(ENOMEM); + memset(buf, 0, cfg.data_len); + } err = nvme_get_feature(fd, cfg.namespace_id, cfg.feature_id, cfg.sel, cfg.cdw11, cfg.data_len, buf, &result); @@ -1423,8 +1426,12 @@ static int set_feature(int argc, char **argv) } if (cfg.feature_id == NVME_FEAT_LBA_RANGE) cfg.data_len = 4096; - if (cfg.data_len) - buf = malloc(cfg.data_len); + if (cfg.data_len) { + if (posix_memalign(&buf, getpagesize(), cfg.data_len)) + exit(ENOMEM); + memset(buf, 0, cfg.data_len); + } + if (buf) { if (strlen(cfg.file)) { ffd = open(cfg.file, O_RDONLY); @@ -2136,9 +2143,9 @@ static int submit_io(int opcode, char *command, const char *desc, return EINVAL; } - buffer = malloc(cfg.data_size); - if (!buffer) + if (posix_memalign(&buffer, getpagesize(), cfg.data_size)) return ENOMEM; + memset(buffer, 0, cfg.data_size); if (cfg.metadata_size) { mbuffer = malloc(cfg.metadata_size);