Fix status of device if path argument is used. Fix double path prefix for non-existen...
[platform/upstream/cryptsetup.git] / src / veritysetup.c
index abd8a98..cc2095d 100644 (file)
@@ -5,7 +5,8 @@
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -78,17 +79,15 @@ static int action_format(int arg)
        struct crypt_device *cd = NULL;
        struct crypt_params_verity params = {};
        uint32_t flags = CRYPT_VERITY_CREATE_HASH;
-       struct stat st;
        int r;
 
        /* Try to create hash image if doesn't exist */
-       if (stat(action_argv[1], &st) < 0) {
-               log_dbg("Creating hash image %s.", action_argv[1]);
-               r = open(action_argv[1], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
-               if (r < 0) {
-                       log_err(_("Cannot create hash image %s for writing.\n"), action_argv[1]);
-                       return -EINVAL;
-               }
+       r = open(action_argv[1], O_WRONLY | O_EXCL | O_CREAT, S_IRUSR | S_IWUSR);
+       if (r < 0 && errno != EEXIST) {
+               log_err(_("Cannot create hash image %s for writing.\n"), action_argv[1]);
+               return -EINVAL;
+       } else if (r >= 0) {
+               log_dbg("Created hash image %s.", action_argv[1]);
                close(r);
        }