Unverified Commit dae29309 by Stéphane Graber Committed by GitHub

Merge pull request #2244 from brauner/2018-03-29/fixup

bugfixes
parents 68c084cb 59ecb672
...@@ -55,7 +55,7 @@ static inline void dump_stacktrace(void) ...@@ -55,7 +55,7 @@ static inline void dump_stacktrace(void)
strings = backtrace_symbols(array, size); strings = backtrace_symbols(array, size);
/* Using fprintf here as our logging module is not thread safe. */ /* Using fprintf here as our logging module is not thread safe. */
fprintf(stderr, "\tObtained %zu stack frames.\n", size); fprintf(stderr, "\tObtained %zu stack frames\n", size);
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
fprintf(stderr, "\t\t%s\n", strings[i]); fprintf(stderr, "\t\t%s\n", strings[i]);
...@@ -195,7 +195,7 @@ int lxclock(struct lxc_lock *l, int timeout) ...@@ -195,7 +195,7 @@ int lxclock(struct lxc_lock *l, int timeout)
case LXC_LOCK_ANON_SEM: case LXC_LOCK_ANON_SEM:
if (!timeout) { if (!timeout) {
ret = sem_wait(l->u.sem); ret = sem_wait(l->u.sem);
if (ret == -1) if (ret < 0)
saved_errno = errno; saved_errno = errno;
} else { } else {
struct timespec ts; struct timespec ts;
...@@ -205,7 +205,7 @@ int lxclock(struct lxc_lock *l, int timeout) ...@@ -205,7 +205,7 @@ int lxclock(struct lxc_lock *l, int timeout)
} }
ts.tv_sec += timeout; ts.tv_sec += timeout;
ret = sem_timedwait(l->u.sem, &ts); ret = sem_timedwait(l->u.sem, &ts);
if (ret == -1) if (ret < 0)
saved_errno = errno; saved_errno = errno;
} }
break; break;
...@@ -220,21 +220,22 @@ int lxclock(struct lxc_lock *l, int timeout) ...@@ -220,21 +220,22 @@ int lxclock(struct lxc_lock *l, int timeout)
goto out; goto out;
} }
if (l->u.f.fd == -1) { if (l->u.f.fd == -1) {
l->u.f.fd = open(l->u.f.fname, O_RDWR|O_CREAT, l->u.f.fd = open(l->u.f.fname, O_CREAT | O_RDWR | O_NOFOLLOW | O_CLOEXEC | O_NOCTTY, S_IWUSR | S_IRUSR);
S_IWUSR | S_IRUSR);
if (l->u.f.fd == -1) { if (l->u.f.fd == -1) {
ERROR("Error opening %s", l->u.f.fname); ERROR("Error opening %s", l->u.f.fname);
saved_errno = errno; saved_errno = errno;
goto out; goto out;
} }
} }
memset(&lk, 0, sizeof(struct flock));
lk.l_type = F_WRLCK; lk.l_type = F_WRLCK;
lk.l_whence = SEEK_SET; lk.l_whence = SEEK_SET;
lk.l_start = 0; ret = fcntl(l->u.f.fd, F_OFD_SETLKW, &lk);
lk.l_len = 0; if (ret < 0) {
ret = fcntl(l->u.f.fd, F_SETLKW, &lk); if (errno == EINVAL)
if (ret == -1) ret = flock(l->u.f.fd, LOCK_EX);
saved_errno = errno; saved_errno = errno;
}
break; break;
} }
...@@ -259,13 +260,15 @@ int lxcunlock(struct lxc_lock *l) ...@@ -259,13 +260,15 @@ int lxcunlock(struct lxc_lock *l)
break; break;
case LXC_LOCK_FLOCK: case LXC_LOCK_FLOCK:
if (l->u.f.fd != -1) { if (l->u.f.fd != -1) {
memset(&lk, 0, sizeof(struct flock));
lk.l_type = F_UNLCK; lk.l_type = F_UNLCK;
lk.l_whence = SEEK_SET; lk.l_whence = SEEK_SET;
lk.l_start = 0; ret = fcntl(l->u.f.fd, F_OFD_SETLK, &lk);
lk.l_len = 0; if (ret < 0) {
ret = fcntl(l->u.f.fd, F_SETLK, &lk); if (errno == EINVAL)
if (ret < 0) ret = flock(l->u.f.fd, LOCK_EX | LOCK_NB);
saved_errno = errno; saved_errno = errno;
}
close(l->u.f.fd); close(l->u.f.fd);
l->u.f.fd = -1; l->u.f.fd = -1;
} else } else
......
...@@ -23,12 +23,25 @@ ...@@ -23,12 +23,25 @@
#ifndef __LXC_LXCLOCK_H #ifndef __LXC_LXCLOCK_H
#define __LXC_LXCLOCK_H #define __LXC_LXCLOCK_H
#include <fcntl.h> /* For O_* constants */ #include <fcntl.h>
#include <sys/stat.h> /* For mode constants */
#include <sys/file.h>
#include <semaphore.h> #include <semaphore.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <time.h> #include <time.h>
#include <unistd.h>
#ifndef F_OFD_GETLK
#define F_OFD_GETLK 36
#endif
#ifndef F_OFD_SETLK
#define F_OFD_SETLK 37
#endif
#ifndef F_OFD_SETLKW
#define F_OFD_SETLKW 38
#endif
#define LXC_LOCK_ANON_SEM 1 /*!< Anonymous semaphore lock */ #define LXC_LOCK_ANON_SEM 1 /*!< Anonymous semaphore lock */
#define LXC_LOCK_FLOCK 2 /*!< flock(2) lock */ #define LXC_LOCK_FLOCK 2 /*!< flock(2) lock */
......
...@@ -324,7 +324,7 @@ static int lvm_snapshot_create_new_uuid_wrapper(void *data) ...@@ -324,7 +324,7 @@ static int lvm_snapshot_create_new_uuid_wrapper(void *data)
if (strcmp(args->fstype, "btrfs") == 0) if (strcmp(args->fstype, "btrfs") == 0)
execlp("btrfstune", "btrfstune", "-f", "-u", args->lv, (char *)NULL); execlp("btrfstune", "btrfstune", "-f", "-u", args->lv, (char *)NULL);
return -1; return 0;
} }
static int lvm_snapshot(struct lxc_storage *orig, const char *path, uint64_t size) static int lvm_snapshot(struct lxc_storage *orig, const char *path, uint64_t size)
......
...@@ -745,7 +745,7 @@ static char *mount_tmpfs(const char *oldname, const char *newname, ...@@ -745,7 +745,7 @@ static char *mount_tmpfs(const char *oldname, const char *newname,
int ret, fd; int ret, fd;
size_t len; size_t len;
char *premount = NULL; char *premount = NULL;
FILE *fp; FILE *fp = NULL;
if (arg->tmpfs && arg->keepdata) { if (arg->tmpfs && arg->keepdata) {
fprintf(stderr, "%s\n", fprintf(stderr, "%s\n",
...@@ -810,7 +810,7 @@ static char *mount_tmpfs(const char *oldname, const char *newname, ...@@ -810,7 +810,7 @@ static char *mount_tmpfs(const char *oldname, const char *newname,
err_close: err_close:
if (fd > 0) if (fd > 0)
close(fd); close(fd);
else else if (fp)
fclose(fp); fclose(fp);
err_free: err_free:
free(premount); free(premount);
......
...@@ -76,7 +76,7 @@ static void test_two_locks(void) ...@@ -76,7 +76,7 @@ static void test_two_locks(void)
if (WIFEXITED(status)) { if (WIFEXITED(status)) {
printf("%d exited normally with exit code %d\n", pid, printf("%d exited normally with exit code %d\n", pid,
WEXITSTATUS(status)); WEXITSTATUS(status));
if (WEXITSTATUS(status) == 0) if (WEXITSTATUS(status) != 0)
exit(1); exit(1);
} else } else
printf("%d did not exit normally\n", pid); printf("%d did not exit normally\n", pid);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment