Merge "liblog: adb: move security interfaces to private"
diff --git a/debuggerd/client/debuggerd_client.cpp b/debuggerd/client/debuggerd_client.cpp
index cf37701..c67d747 100644
--- a/debuggerd/client/debuggerd_client.cpp
+++ b/debuggerd/client/debuggerd_client.cpp
@@ -31,6 +31,7 @@
#include <errno.h>
#include <inttypes.h>
#include <pthread.h>
+#include <sched.h>
#include <signal.h>
#include <stddef.h>
#include <stdio.h>
@@ -41,6 +42,7 @@
#include <sys/socket.h>
#include <sys/syscall.h>
#include <sys/un.h>
+#include <sys/wait.h>
#include <unistd.h>
#include "private/libc_logging.h"
@@ -56,6 +58,13 @@
static debuggerd_callbacks_t g_callbacks;
+// Don't use __libc_fatal because it exits via abort, which might put us back into a signal handler.
+#define fatal(...) \
+ do { \
+ __libc_format_log(ANDROID_LOG_FATAL, "libc", __VA_ARGS__); \
+ _exit(1); \
+ } while (0)
+
static int socket_abstract_client(const char* name, int type) {
sockaddr_un addr;
@@ -188,7 +197,7 @@
return result;
}
-static void send_debuggerd_packet() {
+static void send_debuggerd_packet(pid_t crashing_tid, pid_t pseudothread_tid) {
// Mutex to prevent multiple crashing threads from trying to talk
// to debuggerd at the same time.
static pthread_mutex_t crash_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -218,7 +227,8 @@
// that's actually in our process.
debugger_msg_t msg;
msg.action = DEBUGGER_ACTION_CRASH;
- msg.tid = gettid();
+ msg.tid = crashing_tid;
+ msg.ignore_tid = pseudothread_tid;
msg.abort_msg_address = 0;
if (g_callbacks.get_abort_message) {
@@ -229,11 +239,9 @@
if (ret == sizeof(msg)) {
char debuggerd_ack;
ret = TEMP_FAILURE_RETRY(read(s, &debuggerd_ack, 1));
- int saved_errno = errno;
if (g_callbacks.post_dump) {
g_callbacks.post_dump();
}
- errno = saved_errno;
} else {
// read or write failed -- broken connection?
__libc_format_log(ANDROID_LOG_FATAL, "libc", "Failed while talking to debuggerd: %s",
@@ -243,6 +251,33 @@
close(s);
}
+struct debugger_thread_info {
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ pid_t crashing_tid;
+ pid_t pseudothread_tid;
+ int signal_number;
+ siginfo_t* info;
+};
+
+// Logging and contacting debuggerd requires free file descriptors, which we might not have.
+// Work around this by spawning a "thread" that shares its parent's address space, but not its file
+// descriptor table, so that we can close random file descriptors without affecting the original
+// process. Note that this doesn't go through pthread_create, so TLS is shared with the spawning
+// process.
+static void* pseudothread_stack;
+static int debuggerd_dispatch_pseudothread(void* arg) {
+ debugger_thread_info* thread_info = static_cast<debugger_thread_info*>(arg);
+
+ for (int i = 3; i < 1024; ++i) {
+ close(i);
+ }
+
+ log_signal_summary(thread_info->signal_number, thread_info->info);
+ send_debuggerd_packet(thread_info->crashing_tid, thread_info->pseudothread_tid);
+ pthread_mutex_unlock(&thread_info->mutex);
+ return 0;
+}
+
/*
* Catches fatal signals so we can ask debuggerd to ptrace us before
* we crash.
@@ -254,9 +289,25 @@
info = nullptr;
}
- log_signal_summary(signal_number, info);
+ debugger_thread_info thread_info = {
+ .crashing_tid = gettid(),
+ .signal_number = signal_number,
+ .info = info
+ };
- send_debuggerd_packet();
+ pthread_mutex_lock(&thread_info.mutex);
+ pid_t child_pid = clone(debuggerd_dispatch_pseudothread, pseudothread_stack,
+ CLONE_THREAD | CLONE_SIGHAND | CLONE_VM | CLONE_CHILD_SETTID,
+ &thread_info, nullptr, nullptr, &thread_info.pseudothread_tid);
+
+ if (child_pid == -1) {
+ fatal("failed to spawn debuggerd dispatch thread: %s", strerror(errno));
+ }
+
+ // Wait for the child to finish and unlock the mutex.
+ // This relies on bionic behavior that isn't guaranteed by the standard.
+ pthread_mutex_lock(&thread_info.mutex);
+
// We need to return from the signal handler so that debuggerd can dump the
// thread that crashed, but returning here does not guarantee that the signal
@@ -281,9 +332,7 @@
int rc = syscall(SYS_rt_tgsigqueueinfo, getpid(), gettid(), signal_number, info);
if (rc != 0) {
- __libc_format_log(ANDROID_LOG_FATAL, "libc", "failed to resend signal during crash: %s",
- strerror(errno));
- _exit(0);
+ fatal("failed to resend signal during crash: %s", strerror(errno));
}
}
@@ -292,6 +341,23 @@
g_callbacks = *callbacks;
}
+ void* thread_stack_allocation =
+ mmap(nullptr, PAGE_SIZE * 3, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ if (thread_stack_allocation == MAP_FAILED) {
+ fatal("failed to allocate debuggerd thread stack");
+ }
+
+ char* stack = static_cast<char*>(thread_stack_allocation) + PAGE_SIZE;
+ if (mprotect(stack, PAGE_SIZE, PROT_READ | PROT_WRITE) != 0) {
+ fatal("failed to mprotect debuggerd thread stack");
+ }
+
+ // Stack grows negatively, set it to the last byte in the page...
+ stack = (stack + PAGE_SIZE - 1);
+ // and align it.
+ stack -= 15;
+ pseudothread_stack = stack;
+
struct sigaction action;
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
diff --git a/debuggerd/crasher.cpp b/debuggerd/crasher.cpp
index 7d3509c..cfcc26e 100644
--- a/debuggerd/crasher.cpp
+++ b/debuggerd/crasher.cpp
@@ -1,5 +1,6 @@
#include <assert.h>
#include <errno.h>
+#include <fcntl.h>
#include <pthread.h>
#include <sched.h>
#include <signal.h>
@@ -141,7 +142,13 @@
{
fprintf(stderr, "%s: init pid=%d tid=%d\n", __progname, getpid(), gettid());
- if (!strncmp(arg, "thread-", strlen("thread-"))) {
+ if (!strncmp(arg, "exhaustfd-", strlen("exhaustfd-"))) {
+ errno = 0;
+ while (errno != EMFILE) {
+ open("/dev/null", O_RDONLY);
+ }
+ return do_action(arg + strlen("exhaustfd-"));
+ } else if (!strncmp(arg, "thread-", strlen("thread-"))) {
return do_action_on_thread(arg + strlen("thread-"));
} else if (!strcmp(arg, "SIGSEGV-non-null")) {
sigsegv_non_null();
@@ -208,6 +215,8 @@
fprintf(stderr, " SIGTRAP cause a SIGTRAP\n");
fprintf(stderr, "prefix any of the above with 'thread-' to not run\n");
fprintf(stderr, "on the process' main thread.\n");
+ fprintf(stderr, "prefix any of the above with 'exhaustfd-' to exhaust\n");
+ fprintf(stderr, "all available file descriptors before crashing.\n");
return EXIT_SUCCESS;
}
diff --git a/debuggerd/debuggerd.cpp b/debuggerd/debuggerd.cpp
index a6d3d38..b8a62a5 100644
--- a/debuggerd/debuggerd.cpp
+++ b/debuggerd/debuggerd.cpp
@@ -69,6 +69,7 @@
debugger_action_t action;
pid_t pid, tid;
uid_t uid, gid;
+ pid_t ignore_tid;
uintptr_t abort_msg_address;
};
@@ -215,6 +216,7 @@
out_request->action = static_cast<debugger_action_t>(msg.action);
out_request->tid = msg.tid;
+ out_request->ignore_tid = msg.ignore_tid;
out_request->pid = cr.pid;
out_request->uid = cr.uid;
out_request->gid = cr.gid;
@@ -408,7 +410,7 @@
}
#endif
-static void ptrace_siblings(pid_t pid, pid_t main_tid, std::set<pid_t>& tids) {
+static void ptrace_siblings(pid_t pid, pid_t main_tid, pid_t ignore_tid, std::set<pid_t>& tids) {
char task_path[64];
snprintf(task_path, sizeof(task_path), "/proc/%d/task", pid);
@@ -434,7 +436,7 @@
continue;
}
- if (tid == main_tid) {
+ if (tid == main_tid || tid == ignore_tid) {
continue;
}
@@ -583,7 +585,7 @@
std::set<pid_t> siblings;
if (!attach_gdb) {
- ptrace_siblings(request.pid, request.tid, siblings);
+ ptrace_siblings(request.pid, request.tid, request.ignore_tid, siblings);
}
// Generate the backtrace map before dropping privileges.
diff --git a/debuggerd/include/debuggerd/client.h b/debuggerd/include/debuggerd/client.h
index 8225c73..aeb723b 100644
--- a/debuggerd/include/debuggerd/client.h
+++ b/debuggerd/include/debuggerd/client.h
@@ -43,6 +43,7 @@
typedef struct __attribute__((packed)) {
int32_t action;
pid_t tid;
+ pid_t ignore_tid;
uint64_t abort_msg_address;
} debugger_msg_t;
diff --git a/fastboot/Android.mk b/fastboot/Android.mk
index 7112d1d..d69a81f 100644
--- a/fastboot/Android.mk
+++ b/fastboot/Android.mk
@@ -21,7 +21,6 @@
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../adb \
$(LOCAL_PATH)/../mkbootimg \
- $(LOCAL_PATH)/../../extras/ext4_utils \
$(LOCAL_PATH)/../../extras/f2fs_utils \
LOCAL_SRC_FILES := \
diff --git a/fastboot/fs.cpp b/fastboot/fs.cpp
index 8539e23..9b73165 100644
--- a/fastboot/fs.cpp
+++ b/fastboot/fs.cpp
@@ -1,7 +1,6 @@
#include "fs.h"
#include "fastboot.h"
-#include "make_ext4fs.h"
#include "make_f2fs.h"
#include <errno.h>
@@ -12,6 +11,7 @@
#include <sys/types.h>
#include <unistd.h>
+#include <ext4_utils/make_ext4fs.h>
#include <sparse/sparse.h>
static int generate_ext4_image(int fd, long long partSize, const std::string& initial_dir)
diff --git a/fs_mgr/fs_mgr.c b/fs_mgr/fs_mgr.c
index b11ce75..2ed6b91 100644
--- a/fs_mgr/fs_mgr.c
+++ b/fs_mgr/fs_mgr.c
@@ -30,20 +30,18 @@
#include <time.h>
#include <unistd.h>
-#include <ext4.h>
-#include <ext4_crypt_init_extensions.h>
-#include <ext4_sb.h>
-
#include <cutils/android_reboot.h>
#include <cutils/partition_utils.h>
#include <cutils/properties.h>
+#include <ext4_utils/ext4.h>
+#include <ext4_utils/ext4_crypt_init_extensions.h>
+#include <ext4_utils/ext4_sb.h>
+#include <ext4_utils/ext4_utils.h>
+#include <ext4_utils/wipe.h>
#include <linux/loop.h>
#include <logwrap/logwrap.h>
#include <private/android_filesystem_config.h>
-#include "ext4_utils.h"
-#include "wipe.h"
-
#include "fs_mgr_priv.h"
#include "fs_mgr_priv_verity.h"
diff --git a/fs_mgr/fs_mgr_format.c b/fs_mgr/fs_mgr_format.c
index 7ee5832..7c3b1ed 100644
--- a/fs_mgr/fs_mgr_format.c
+++ b/fs_mgr/fs_mgr_format.c
@@ -24,13 +24,13 @@
#include <cutils/partition_utils.h>
#include <sys/mount.h>
+#include <ext4_utils/ext4_utils.h>
+#include <ext4_utils/ext4.h>
+#include <ext4_utils/make_ext4fs.h>
#include <selinux/selinux.h>
#include <selinux/label.h>
#include <selinux/android.h>
-#include "ext4_utils.h"
-#include "ext4.h"
-#include "make_ext4fs.h"
#include "fs_mgr_priv.h"
#include "cryptfs.h"
diff --git a/init/Android.mk b/init/Android.mk
index 4a8df32..704304e 100644
--- a/init/Android.mk
+++ b/init/Android.mk
@@ -74,7 +74,6 @@
LOCAL_MODULE:= init
LOCAL_C_INCLUDES += \
- system/extras/ext4_utils \
system/core/mkbootimg
LOCAL_FORCE_STATIC_EXECUTABLE := true
diff --git a/init/builtins.cpp b/init/builtins.cpp
index 200b723..f4ba018 100644
--- a/init/builtins.cpp
+++ b/init/builtins.cpp
@@ -37,8 +37,6 @@
#include <unistd.h>
#include <linux/loop.h>
#include <linux/module.h>
-#include <ext4_crypt.h>
-#include <ext4_crypt_init_extensions.h>
#include <selinux/selinux.h>
#include <selinux/label.h>
@@ -51,6 +49,8 @@
#include <bootloader_message_writer.h>
#include <cutils/partition_utils.h>
#include <cutils/android_reboot.h>
+#include <ext4_utils/ext4_crypt.h>
+#include <ext4_utils/ext4_crypt_init_extensions.h>
#include <logwrap/logwrap.h>
#include "action.h"
diff --git a/sdcard/fuse.cpp b/sdcard/fuse.cpp
index f549606..d4c51fd 100644
--- a/sdcard/fuse.cpp
+++ b/sdcard/fuse.cpp
@@ -14,6 +14,10 @@
* limitations under the License.
*/
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+
#define LOG_TAG "sdcard"
#include "fuse.h"
@@ -223,7 +227,8 @@
}
static int touch(char* path, mode_t mode) {
- int fd = open(path, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, mode);
+ int fd = TEMP_FAILURE_RETRY(open(path, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW | O_CLOEXEC,
+ mode));
if (fd == -1) {
if (errno == EEXIST) {
return 0;
@@ -469,27 +474,34 @@
hdr.len = sizeof(hdr);
hdr.error = err;
hdr.unique = unique;
- write(fuse->fd, &hdr, sizeof(hdr));
+ ssize_t ret = TEMP_FAILURE_RETRY(write(fuse->fd, &hdr, sizeof(hdr)));
+ if (ret == -1) {
+ PLOG(ERROR) << "*** STATUS FAILED ***";
+ } else if (static_cast<size_t>(ret) != sizeof(hdr)) {
+ LOG(ERROR) << "*** STATUS FAILED: written " << ret << " expected "
+ << sizeof(hdr) << " ***";
+ }
}
static void fuse_reply(struct fuse *fuse, __u64 unique, void *data, int len)
{
struct fuse_out_header hdr;
- struct iovec vec[2];
- int res;
-
hdr.len = len + sizeof(hdr);
hdr.error = 0;
hdr.unique = unique;
+ struct iovec vec[2];
vec[0].iov_base = &hdr;
vec[0].iov_len = sizeof(hdr);
vec[1].iov_base = data;
vec[1].iov_len = len;
- res = writev(fuse->fd, vec, 2);
- if (res < 0) {
+ ssize_t ret = TEMP_FAILURE_RETRY(writev(fuse->fd, vec, 2));
+ if (ret == -1) {
PLOG(ERROR) << "*** REPLY FAILED ***";
+ } else if (static_cast<size_t>(ret) != sizeof(hdr) + len) {
+ LOG(ERROR) << "*** REPLY FAILED: written " << ret << " expected "
+ << sizeof(hdr) + len << " ***";
}
}
@@ -501,7 +513,7 @@
struct fuse_entry_out out;
struct stat s;
- if (lstat(path, &s) < 0) {
+ if (lstat(path, &s) == -1) {
return -errno;
}
@@ -528,7 +540,7 @@
struct fuse_attr_out out;
struct stat s;
- if (lstat(path, &s) < 0) {
+ if (lstat(path, &s) == -1) {
return -errno;
}
memset(&out, 0, sizeof(out));
@@ -542,10 +554,7 @@
const __u64 child, const char* name) {
struct fuse_out_header hdr;
struct fuse_notify_delete_out data;
- struct iovec vec[3];
size_t namelen = strlen(name);
- int res;
-
hdr.len = sizeof(hdr) + sizeof(data) + namelen + 1;
hdr.error = FUSE_NOTIFY_DELETE;
hdr.unique = 0;
@@ -555,6 +564,7 @@
data.namelen = namelen;
data.padding = 0;
+ struct iovec vec[3];
vec[0].iov_base = &hdr;
vec[0].iov_len = sizeof(hdr);
vec[1].iov_base = &data;
@@ -562,10 +572,15 @@
vec[2].iov_base = (void*) name;
vec[2].iov_len = namelen + 1;
- res = writev(fuse->fd, vec, 3);
+ ssize_t ret = TEMP_FAILURE_RETRY(writev(fuse->fd, vec, 3));
/* Ignore ENOENT, since other views may not have seen the entry */
- if (res < 0 && errno != ENOENT) {
- PLOG(ERROR) << "*** NOTIFY FAILED ***";
+ if (ret == -1) {
+ if (errno != ENOENT) {
+ PLOG(ERROR) << "*** NOTIFY FAILED ***";
+ }
+ } else if (static_cast<size_t>(ret) != sizeof(hdr) + sizeof(data) + namelen + 1) {
+ LOG(ERROR) << "*** NOTIFY FAILED: written " << ret << " expected "
+ << sizeof(hdr) + sizeof(data) + namelen + 1 << " ***";
}
}
@@ -665,7 +680,7 @@
/* XXX: incomplete implementation on purpose.
* chmod/chown should NEVER be implemented.*/
- if ((req->valid & FATTR_SIZE) && truncate64(path, req->size) < 0) {
+ if ((req->valid & FATTR_SIZE) && TEMP_FAILURE_RETRY(truncate64(path, req->size)) == -1) {
return -errno;
}
@@ -727,7 +742,7 @@
return -EACCES;
}
__u32 mode = (req->mode & (~0777)) | 0664;
- if (mknod(child_path, mode, req->rdev) < 0) {
+ if (mknod(child_path, mode, req->rdev) == -1) {
return -errno;
}
return fuse_reply_entry(fuse, hdr->unique, parent_node, name, actual_name, child_path);
@@ -757,7 +772,7 @@
return -EACCES;
}
__u32 mode = (req->mode & (~0777)) | 0775;
- if (mkdir(child_path, mode) < 0) {
+ if (mkdir(child_path, mode) == -1) {
return -errno;
}
@@ -804,7 +819,7 @@
if (!check_caller_access_to_name(fuse, hdr, parent_node, name, W_OK)) {
return -EACCES;
}
- if (unlink(child_path) < 0) {
+ if (unlink(child_path) == -1) {
return -errno;
}
pthread_mutex_lock(&fuse->global->lock);
@@ -854,7 +869,7 @@
if (!check_caller_access_to_name(fuse, hdr, parent_node, name, W_OK)) {
return -EACCES;
}
- if (rmdir(child_path) < 0) {
+ if (rmdir(child_path) == -1) {
return -errno;
}
pthread_mutex_lock(&fuse->global->lock);
@@ -942,7 +957,7 @@
DLOG(INFO) << "[" << handler->token << "] RENAME " << old_child_path << "->" << new_child_path;
res = rename(old_child_path, new_child_path);
- if (res < 0) {
+ if (res == -1) {
res = -errno;
goto io_error;
}
@@ -1004,8 +1019,8 @@
return -ENOMEM;
}
DLOG(INFO) << "[" << handler->token << "] OPEN " << path;
- h->fd = open(path, req->flags);
- if (h->fd < 0) {
+ h->fd = TEMP_FAILURE_RETRY(open(path, req->flags));
+ if (h->fd == -1) {
free(h);
return -errno;
}
@@ -1035,8 +1050,8 @@
if (size > MAX_READ) {
return -EINVAL;
}
- res = pread64(h->fd, read_buffer, size, offset);
- if (res < 0) {
+ res = TEMP_FAILURE_RETRY(pread64(h->fd, read_buffer, size, offset));
+ if (res == -1) {
return -errno;
}
fuse_reply(fuse, unique, read_buffer, res);
@@ -1059,8 +1074,8 @@
DLOG(INFO) << "[" << handler->token << "] WRITE " << std::hex << h << std::dec
<< "(" << h->fd << ") " << req->size << "@" << req->offset;
- res = pwrite64(h->fd, buffer, req->size, req->offset);
- if (res < 0) {
+ res = TEMP_FAILURE_RETRY(pwrite64(h->fd, buffer, req->size, req->offset));
+ if (res == -1) {
return -errno;
}
out.size = res;
@@ -1084,7 +1099,7 @@
if (res < 0) {
return -ENOENT;
}
- if (statfs(fuse->global->root.name, &stat) < 0) {
+ if (TEMP_FAILURE_RETRY(statfs(fuse->global->root.name, &stat)) == -1) {
return -errno;
}
memset(&out, 0, sizeof(out));
@@ -1293,7 +1308,6 @@
return NO_STATUS;
}
-
static int handle_fuse_request(struct fuse *fuse, struct fuse_handler* handler,
const struct fuse_in_header *hdr, const void *data, size_t data_len)
{
@@ -1427,7 +1441,7 @@
for (;;) {
ssize_t len = TEMP_FAILURE_RETRY(read(fuse->fd,
handler->request_buffer, sizeof(handler->request_buffer)));
- if (len < 0) {
+ if (len == -1) {
if (errno == ENODEV) {
LOG(ERROR) << "[" << handler->token << "] someone stole our marbles!";
exit(2);
@@ -1436,14 +1450,14 @@
continue;
}
- if ((size_t)len < sizeof(struct fuse_in_header)) {
+ if (static_cast<size_t>(len) < sizeof(struct fuse_in_header)) {
LOG(ERROR) << "[" << handler->token << "] request too short: len=" << len;
continue;
}
const struct fuse_in_header* hdr =
reinterpret_cast<const struct fuse_in_header*>(handler->request_buffer);
- if (hdr->len != (size_t)len) {
+ if (hdr->len != static_cast<size_t>(len)) {
LOG(ERROR) << "[" << handler->token << "] malformed header: len=" << len
<< ", hdr->len=" << hdr->len;
continue;
diff --git a/sdcard/sdcard.cpp b/sdcard/sdcard.cpp
index 70bbf26..bc502a0 100644
--- a/sdcard/sdcard.cpp
+++ b/sdcard/sdcard.cpp
@@ -111,7 +111,7 @@
char event_buf[512];
int nfd = inotify_init();
- if (nfd < 0) {
+ if (nfd == -1) {
PLOG(ERROR) << "inotify_init failed";
return;
}
@@ -142,17 +142,19 @@
}
int event_pos = 0;
- int res = read(nfd, event_buf, sizeof(event_buf));
- if (res < (int) sizeof(*event)) {
- if (errno == EINTR)
- continue;
+ ssize_t res = TEMP_FAILURE_RETRY(read(nfd, event_buf, sizeof(event_buf)));
+ if (res == -1) {
PLOG(ERROR) << "failed to read inotify event";
return;
+ } else if (static_cast<size_t>(res) < sizeof(*event)) {
+ LOG(ERROR) << "failed to read inotify event: read " << res << " expected "
+ << sizeof(event_buf);
+ return;
}
- while (res >= (int) sizeof(*event)) {
+ while (res >= static_cast<ssize_t>(sizeof(*event))) {
int event_size;
- event = (struct inotify_event *) (event_buf + event_pos);
+ event = reinterpret_cast<struct inotify_event*>(event_buf + event_pos);
DLOG(INFO) << "inotify event: " << std::hex << event->mask << std::dec;
if ((event->mask & IN_IGNORED) == IN_IGNORED) {
@@ -171,7 +173,7 @@
static int fuse_setup(struct fuse* fuse, gid_t gid, mode_t mask) {
char opts[256];
- fuse->fd = open("/dev/fuse", O_RDWR);
+ fuse->fd = TEMP_FAILURE_RETRY(open("/dev/fuse", O_RDWR | O_CLOEXEC));
if (fuse->fd == -1) {
PLOG(ERROR) << "failed to open fuse device";
return -1;
@@ -182,8 +184,8 @@
snprintf(opts, sizeof(opts),
"fd=%i,rootmode=40000,default_permissions,allow_other,user_id=%d,group_id=%d",
fuse->fd, fuse->global->uid, fuse->global->gid);
- if (mount("/dev/fuse", fuse->dest_path, "fuse", MS_NOSUID | MS_NODEV | MS_NOEXEC |
- MS_NOATIME, opts) != 0) {
+ if (mount("/dev/fuse", fuse->dest_path, "fuse", MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_NOATIME,
+ opts) == -1) {
PLOG(ERROR) << "failed to mount fuse filesystem";
return -1;
}
@@ -321,7 +323,7 @@
fsuid, fsgid, multi_user?"multiuser,":"", mask, userid, gid);
if (mount(source_path.c_str(), dest_path.c_str(), "sdcardfs",
- MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_NOATIME, opts.c_str()) != 0) {
+ MS_NOSUID | MS_NODEV | MS_NOEXEC | MS_NOATIME, opts.c_str()) == -1) {
PLOG(ERROR) << "failed to mount sdcardfs filesystem";
return false;
}
@@ -480,7 +482,7 @@
rlim.rlim_cur = 8192;
rlim.rlim_max = 8192;
- if (setrlimit(RLIMIT_NOFILE, &rlim)) {
+ if (setrlimit(RLIMIT_NOFILE, &rlim) == -1) {
PLOG(ERROR) << "setting RLIMIT_NOFILE failed";
}