Whamcloud - gitweb
LU-11049 ssk: correctly handle null byte by lgss_sk
[fs/lustre-release.git] / lustre / utils / gss / lgss_sk.c
index fffa011..cfefb30 100644 (file)
 /*
  * Copyright (C) 2015, Trustees of Indiana University
  *
+ * Copyright (c) 2016, Intel Corporation.
+ *
  * Author: Jeremy Filizetti <jfilizet@iu.edu>
  */
 
+#include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
@@ -332,30 +335,29 @@ int main(int argc, char **argv)
        bool generate_prime = false;
        DH *dh;
 
-       static struct option long_opt[] = {
-               {"crypt", 1, 0, 'c'},
-               {"data", 1, 0, 'd'},
-               {"expire", 1, 0, 'e'},
-               {"fsname", 1, 0, 'f'},
-               {"mgsnids", 1, 0, 'g'},
-               {"help", 0, 0, 'h'},
-               {"hmac", 1, 0, 'i'},
-               {"integrity", 1, 0, 'i'},
-               {"key-bits", 1, 0, 'k'},
-               {"shared", 1, 0, 'k'},
-               {"load", 1, 0, 'l'},
-               {"modify", 1, 0, 'm'},
-               {"nodemap", 1, 0, 'n'},
-               {"prime-bits", 1, 0, 'p'},
-               {"read", 1, 0, 'r'},
-               {"type", 1, 0, 't'},
-               {"verbose", 0, 0, 'v'},
-               {"write", 1, 0, 'w'},
-               {0, 0, 0, 0},
-       };
+       static struct option long_opts[] = {
+       { .name = "crypt",      .has_arg = required_argument, .val = 'c'},
+       { .name = "data",       .has_arg = required_argument, .val = 'd'},
+       { .name = "expire",     .has_arg = required_argument, .val = 'e'},
+       { .name = "fsname",     .has_arg = required_argument, .val = 'f'},
+       { .name = "mgsnids",    .has_arg = required_argument, .val = 'g'},
+       { .name = "help",       .has_arg = no_argument,       .val = 'h'},
+       { .name = "hmac",       .has_arg = required_argument, .val = 'i'},
+       { .name = "integrity",  .has_arg = required_argument, .val = 'i'},
+       { .name = "key-bits",   .has_arg = required_argument, .val = 'k'},
+       { .name = "shared",     .has_arg = required_argument, .val = 'k'},
+       { .name = "load",       .has_arg = required_argument, .val = 'l'},
+       { .name = "modify",     .has_arg = required_argument, .val = 'm'},
+       { .name = "nodemap",    .has_arg = required_argument, .val = 'n'},
+       { .name = "prime-bits", .has_arg = required_argument, .val = 'p'},
+       { .name = "read",       .has_arg = required_argument, .val = 'r'},
+       { .name = "type",       .has_arg = required_argument, .val = 't'},
+       { .name = "verbose",    .has_arg = no_argument,       .val = 'v'},
+       { .name = "write",      .has_arg = required_argument, .val = 'w'},
+       { .name = NULL, } };
 
        while ((opt = getopt_long(argc, argv,
-                                 "c:d:e:f:g:hi:l:m:n:p:r:s:k:t:w:v", long_opt,
+                                 "c:d:e:f:g:hi:l:m:n:p:r:s:k:t:w:v", long_opts,
                                  NULL)) != EOF) {
                switch (opt) {
                case 'c':
@@ -541,8 +543,8 @@ int main(int argc, char **argv)
                config->skc_type = type;
                generate_prime = type & SK_TYPE_CLIENT;
 
-               strncpy(config->skc_nodemap, SK_DEFAULT_NODEMAP,
-                       strlen(SK_DEFAULT_NODEMAP));
+               /* SK_DEFAULT_NODEMAP is made to fit in skc_nodemap */
+               strcpy(config->skc_nodemap, SK_DEFAULT_NODEMAP);
 
                if (!datafile)
                        datafile = "/dev/random";
@@ -559,9 +561,15 @@ int main(int argc, char **argv)
        if (prime_bits != -1)
                config->skc_prime_bits = prime_bits;
        if (fsname)
-               strncpy(config->skc_fsname, fsname, strlen(fsname));
+               /* fsname string length was checked when parsing
+                * command-line options
+                */
+               strcpy(config->skc_fsname, fsname);
        if (nodemap)
-               strncpy(config->skc_nodemap, nodemap, strlen(nodemap));
+               /* nodemap string length was checked when parsing
+                * command-line options
+                */
+               strcpy(config->skc_nodemap, nodemap);
        if (mgsnids && parse_mgsnids(mgsnids, config))
                goto error;
        if (sk_validate_config(config)) {