Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clean up locking/unlocking path names #22

Merged
merged 7 commits into from
Jun 10, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 68 additions & 90 deletions bsd-user/bsd-file.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,34 @@

#define target_to_host_bitmask(x, tbl) (x)

#define LOCK_PATH(p, arg) do { \
(p) = lock_user_string(arg); \
#define LOCK_PATH(p, arg) \
do { \
(p) = lock_user_string(arg); \
if ((p) == NULL) { \
return -TARGET_EFAULT; \
} \
} while (0)

#define UNLOCK_PATH(p, arg) unlock_user((p), (arg), 0)
#define UNLOCK_PATH(p, arg) unlock_user(p, arg, 0)

#define LOCK_PATH2(p1, arg1, p2, arg2) \
do { \
(p1) = lock_user_string(arg1); \
if ((p1) == NULL) { \
return -TARGET_EFAULT; \
} \
(p2) = lock_user_string(arg2); \
if ((p2) == NULL) { \
unlock_user(p1, arg1, 0); \
return -TARGET_EFAULT; \
} \
} while (0)

#define UNLOCK_PATH2(p1, arg1, p2, arg2) \
do { \
unlock_user(p2, arg2, 0); \
unlock_user(p1, arg1, 0); \
} while (0)

struct target_pollfd {
int32_t fd; /* file descriptor */
Expand Down Expand Up @@ -326,15 +346,9 @@ static inline abi_long do_bsd_rename(abi_long arg1, abi_long arg2)
abi_long ret;
void *p1, *p2;

LOCK_PATH(p1, arg1);
LOCK_PATH(p2, arg2);
if (!p1 || !p2) {
ret = -TARGET_EFAULT;
} else {
ret = get_errno(rename(p1, p2)); /* XXX path(p1), path(p2) */
}
UNLOCK_PATH(p2, arg2);
UNLOCK_PATH(p1, arg1);
LOCK_PATH2(p1, arg1, p2, arg2);
ret = get_errno(rename(p1, p2)); /* XXX path(p1), path(p2) */
UNLOCK_PATH2(p1, arg1, p2, arg2);

return ret;
}
Expand All @@ -346,15 +360,9 @@ static inline abi_long do_bsd_renameat(abi_long arg1, abi_long arg2,
abi_long ret;
void *p1, *p2;

LOCK_PATH(p1, arg2);
LOCK_PATH(p2, arg4);
if (!p1 || !p2) {
ret = -TARGET_EFAULT;
} else {
ret = get_errno(renameat(arg1, p1, arg3, p2));
}
UNLOCK_PATH(p2, arg2);
UNLOCK_PATH(p1, arg1);
LOCK_PATH2(p1, arg2, p2, arg4);
ret = get_errno(renameat(arg1, p1, arg3, p2));
UNLOCK_PATH2(p1, arg2, p2, arg4);

return ret;
}
Expand All @@ -365,15 +373,9 @@ static inline abi_long do_bsd_link(abi_long arg1, abi_long arg2)
abi_long ret;
void *p1, *p2;

LOCK_PATH(p1, arg1);
LOCK_PATH(p2, arg2);
if (!p1 || !p2) {
ret = -TARGET_EFAULT;
} else {
ret = get_errno(link(p1, p2)); /* XXX path(p1), path(p2) */
}
UNLOCK_PATH(p2, arg2);
UNLOCK_PATH(p1, arg1);
LOCK_PATH2(p1, arg1, p2, arg2);
ret = get_errno(link(p1, p2)); /* XXX path(p1), path(p2) */
UNLOCK_PATH2(p1, arg1, p2, arg2);

return ret;
}
Expand All @@ -385,15 +387,9 @@ static inline abi_long do_bsd_linkat(abi_long arg1, abi_long arg2,
abi_long ret;
void *p1, *p2;

LOCK_PATH(p1, arg2);
LOCK_PATH(p2, arg4);
if (!p1 || !p2) {
ret = -TARGET_EFAULT;
} else {
ret = get_errno(linkat(arg1, p1, arg3, p2, arg5));
}
UNLOCK_PATH(p2, arg4);
UNLOCK_PATH(p1, arg2);
LOCK_PATH2(p1, arg2, p2, arg4);
ret = get_errno(linkat(arg1, p1, arg3, p2, arg5));
UNLOCK_PATH2(p1, arg2, p2, arg4);

return ret;
}
Expand Down Expand Up @@ -477,10 +473,10 @@ static inline abi_long do_bsd___getcwd(abi_long arg1, abi_long arg2)
if (p == NULL) {
return -TARGET_EFAULT;
}
ret = get_errno(__getcwd(p, arg2));
unlock_user(p, arg1, ret);
ret = __getcwd(p, arg2);
unlock_user(p, arg1, ret == 0 ? strlen(p) + 1 : 0);

return ret;
return get_errno(ret);
}

/* dup(2) */
Expand Down Expand Up @@ -558,23 +554,17 @@ static inline abi_long do_bsd_mount(abi_long arg1, abi_long arg2, abi_long arg3,
abi_long ret;
void *p1, *p2;

LOCK_PATH(p1, arg1);
LOCK_PATH(p2, arg2);
if (!p1 || !p2) {
ret = -TARGET_EFAULT;
LOCK_PATH2(p1, arg1, p2, arg2);
/*
* XXX arg4 should be locked, but it isn't clear how to do that
* since it's it may be not be a NULL-terminated string.
*/
if (arg4 == 0) {
ret = get_errno(mount(p1, p2, arg3, NULL)); /* XXX path(p2)? */
} else {
/*
* XXX arg4 should be locked, but it isn't clear how to do that
* since it's it may be not be a NULL-terminated string.
*/
if (arg4 == 0) {
ret = get_errno(mount(p1, p2, arg3, NULL)); /* XXX path(p2)? */
} else {
ret = get_errno(mount(p1, p2, arg3, g2h(arg4))); /* XXX path(p2)? */
}
ret = get_errno(mount(p1, p2, arg3, g2h(arg4))); /* XXX path(p2)? */
}
UNLOCK_PATH(p2, arg2);
UNLOCK_PATH(p1, arg1);
UNLOCK_PATH2(p1, arg1, p2, arg2);

return ret;
}
Expand Down Expand Up @@ -615,15 +605,9 @@ static inline abi_long do_bsd_symlink(abi_long arg1, abi_long arg2)
abi_long ret;
void *p1, *p2;

LOCK_PATH(p1, arg1);
LOCK_PATH(p2, arg2);
if (!p1 || !p2) {
ret = -TARGET_EFAULT;
} else {
ret = get_errno(symlink(p1, p2)); /* XXX path(p1), path(p2) */
}
UNLOCK_PATH(p2, arg2);
UNLOCK_PATH(p1, arg1);
LOCK_PATH2(p1, arg1, p2, arg2);
ret = get_errno(symlink(p1, p2)); /* XXX path(p1), path(p2) */
UNLOCK_PATH2(p1, arg1, p2, arg2);

return ret;
}
Expand All @@ -635,15 +619,9 @@ static inline abi_long do_bsd_symlinkat(abi_long arg1, abi_long arg2,
abi_long ret;
void *p1, *p2;

LOCK_PATH(p1, arg1);
LOCK_PATH(p2, arg3);
if (!p1 || !p2) {
ret = -TARGET_EFAULT;
} else {
ret = get_errno(symlinkat(p1, arg2, p2)); /* XXX path(p1), path(p2) */
}
UNLOCK_PATH(p2, arg3);
UNLOCK_PATH(p1, arg1);
LOCK_PATH2(p1, arg1, p2, arg3);
ret = get_errno(symlinkat(p1, arg2, p2)); /* XXX path(p1), path(p2) */
UNLOCK_PATH2(p1, arg1, p2, arg3);

return ret;
}
Expand All @@ -657,19 +635,19 @@ static inline abi_long do_bsd_readlink(CPUArchState *env, abi_long arg1,

LOCK_PATH(p1, arg1);
p2 = lock_user(VERIFY_WRITE, arg2, arg3, 0);
if (!p1 || !p2) {
ret = -TARGET_EFAULT;
} else {
if (p2 == NULL) {
UNLOCK_PATH(p1, arg1);
return -TARGET_EFAULT;
}
#ifdef __FreeBSD__
if (strcmp(p1, "/proc/curproc/file") == 0) {
CPUState *cpu = ENV_GET_CPU(env);
TaskState *ts = (TaskState *)cpu->opaque;
strncpy(p2, ts->bprm->fullpath, arg3);
ret = MIN((abi_long)strlen(ts->bprm->fullpath), arg3);
} else
if (strcmp(p1, "/proc/curproc/file") == 0) {
CPUState *cpu = ENV_GET_CPU(env);
TaskState *ts = (TaskState *)cpu->opaque;
strncpy(p2, ts->bprm->fullpath, arg3);
ret = MIN((abi_long)strlen(ts->bprm->fullpath), arg3);
} else
#endif
ret = get_errno(readlink(path(p1), p2, arg3));
}
ret = get_errno(readlink(path(p1), p2, arg3));
unlock_user(p2, arg2, ret);
UNLOCK_PATH(p1, arg1);

Expand All @@ -685,11 +663,11 @@ static inline abi_long do_bsd_readlinkat(abi_long arg1, abi_long arg2,

LOCK_PATH(p1, arg2);
p2 = lock_user(VERIFY_WRITE, arg3, arg4, 0);
if (!p1 || !p2) {
ret = -TARGET_EFAULT;
} else {
ret = get_errno(readlinkat(arg1, p1, p2, arg4));
if (p2 == NULL) {
UNLOCK_PATH(p1, arg2);
return -TARGET_EFAULT;
}
ret = get_errno(readlinkat(arg1, p1, p2, arg4));
unlock_user(p2, arg3, ret);
UNLOCK_PATH(p1, arg2);

Expand Down