Imported Upstream version 1.6.7
[platform/upstream/cryptsetup.git] / lib / utils.c
index bd80348..a5aec70 100644 (file)
@@ -1,13 +1,15 @@
 /*
  * utils - miscellaneous device utilities for cryptsetup
  *
- * Copyright (C) 2004, Christophe Saout <christophe@saout.de>
+ * Copyright (C) 2004, Jana Saout <jana@saout.de>
  * Copyright (C) 2004-2007, Clemens Fruhwirth <clemens@endorphin.org>
  * Copyright (C) 2009-2012, Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2009-2012, Milan Broz
  *
  * 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
@@ -30,7 +32,8 @@
 
 unsigned crypt_getpagesize(void)
 {
-       return (unsigned)sysconf(_SC_PAGESIZE);
+       long r = sysconf(_SC_PAGESIZE);
+       return r < 0 ? DEFAULT_MEM_ALIGNMENT : r;
 }
 
 static int get_alignment(int fd)
@@ -96,16 +99,19 @@ ssize_t write_blockwise(int fd, int bsize, void *orig_buf, size_t count)
                        goto out;
 
                r = read(fd, hangover_buf, bsize);
-               if (r < 0 || r != bsize)
+               if (r < 0 || r < hangover)
                        goto out;
 
+               if (r < bsize)
+                       bsize = r;
+
                r = lseek(fd, -bsize, SEEK_CUR);
                if (r < 0)
                        goto out;
                memcpy(hangover_buf, (char*)buf + solid, hangover);
 
                r = write(fd, hangover_buf, bsize);
-               if (r < 0 || r != bsize)
+               if (r < 0 || r < hangover)
                        goto out;
        }
        ret = count;
@@ -145,7 +151,7 @@ ssize_t read_blockwise(int fd, int bsize, void *orig_buf, size_t count) {
                if (!hangover_buf)
                        goto out;
                r = read(fd, hangover_buf, bsize);
-               if (r <  0 || r != bsize)
+               if (r <  0 || r < hangover)
                        goto out;
 
                memcpy((char *)buf + solid, hangover_buf, hangover);
@@ -229,7 +235,7 @@ int crypt_memlock_inc(struct crypt_device *ctx)
        if (!_memlock_count++) {
                log_dbg("Locking memory.");
                if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1) {
-                       log_err(ctx, _("WARNING!!! Possibly insecure memory. Are you root?\n"));
+                       log_dbg("Cannot lock memory with mlockall.");
                        _memlock_count--;
                        return 0;
                }
@@ -238,7 +244,7 @@ int crypt_memlock_inc(struct crypt_device *ctx)
                        log_err(ctx, _("Cannot get process priority.\n"));
                else
                        if (setpriority(PRIO_PROCESS, 0, DEFAULT_PROCESS_PRIORITY))
-                               log_err(ctx, _("setpriority %d failed: %s\n"),
+                               log_dbg("setpriority %d failed: %s",
                                        DEFAULT_PROCESS_PRIORITY, strerror(errno));
        }
        return _memlock_count ? 1 : 0;
@@ -251,7 +257,7 @@ int crypt_memlock_dec(struct crypt_device *ctx)
                if (munlockall() == -1)
                        log_err(ctx, _("Cannot unlock memory.\n"));
                if (setpriority(PRIO_PROCESS, 0, _priority))
-                       log_err(ctx, _("setpriority %d failed: %s\n"), _priority, strerror(errno));
+                       log_dbg("setpriority %d failed: %s", _priority, strerror(errno));
        }
        return _memlock_count ? 1 : 0;
 }