summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/lib/brand/lx/lx_brand/common/file.c18
-rw-r--r--usr/src/lib/brand/lx/lx_brand/common/lx_brand.c2
-rw-r--r--usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h1
3 files changed, 20 insertions, 1 deletions
diff --git a/usr/src/lib/brand/lx/lx_brand/common/file.c b/usr/src/lib/brand/lx/lx_brand/common/file.c
index c0e4caadc9..c3fcc39738 100644
--- a/usr/src/lib/brand/lx/lx_brand/common/file.c
+++ b/usr/src/lib/brand/lx/lx_brand/common/file.c
@@ -743,12 +743,30 @@ lx_linkat(uintptr_t ext1, uintptr_t p1, uintptr_t ext2, uintptr_t p2,
}
int
+lx_readlink(uintptr_t p1, uintptr_t p2, uintptr_t p3)
+{
+ int ret;
+
+ if ((size_t)p3 <= 0)
+ return (-EINVAL);
+
+ ret = readlink((char *)p1, (char *)p2, (size_t)p3);
+ if (ret < 0)
+ return (-errno);
+
+ return (ret);
+}
+
+int
lx_readlinkat(uintptr_t ext1, uintptr_t p1, uintptr_t p2, uintptr_t p3)
{
int atfd = (int)ext1;
char pathbuf[MAXPATHLEN];
int ret;
+ if ((size_t)p3 <= 0)
+ return (-EINVAL);
+
ret = getpathat(atfd, p1, pathbuf, sizeof (pathbuf));
if (ret < 0)
return (ret);
diff --git a/usr/src/lib/brand/lx/lx_brand/common/lx_brand.c b/usr/src/lib/brand/lx/lx_brand/common/lx_brand.c
index 976817ccec..1079de8690 100644
--- a/usr/src/lib/brand/lx/lx_brand/common/lx_brand.c
+++ b/usr/src/lib/brand/lx/lx_brand/common/lx_brand.c
@@ -1020,7 +1020,7 @@ static struct lx_sysent sysents[] = {
{"select", NULL, NOSYS_OBSOLETE, 0}, /* 82 */
{"symlink", symlink, SYS_PASSTHRU, 2}, /* 83 */
{"oldlstat", NULL, NOSYS_OBSOLETE, 0}, /* 84 */
- {"readlink", readlink, SYS_PASSTHRU, 3}, /* 85 */
+ {"readlink", lx_readlink, 0, 3}, /* 85 */
{"uselib", NULL, NOSYS_KERNEL, 0}, /* 86 */
{"swapon", NULL, NOSYS_KERNEL, 0}, /* 87 */
{"reboot", lx_reboot, 0, 4}, /* 88 */
diff --git a/usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h b/usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h
index cc84b3ec32..5bd4e5887a 100644
--- a/usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h
+++ b/usr/src/lib/brand/lx/lx_brand/sys/lx_syscall.h
@@ -68,6 +68,7 @@ extern int lx_fcntl(uintptr_t, uintptr_t, uintptr_t);
extern int lx_fcntl64(uintptr_t, uintptr_t, uintptr_t);
extern int lx_flock(uintptr_t, uintptr_t);
extern int lx_open(uintptr_t, uintptr_t, uintptr_t);
+extern int lx_readlink(uintptr_t, uintptr_t, uintptr_t);
extern int lx_readdir(uintptr_t, uintptr_t, uintptr_t);
extern int lx_getdents(uintptr_t, uintptr_t, uintptr_t);
extern int lx_getdents64(uintptr_t, uintptr_t, uintptr_t);