Print this page
5798 fexecve() needed per POSIX 2008
*** 18,27 ****
--- 18,28 ----
*
* CDDL HEADER END
*/
/*
+ * Copyright 2015 Garrett D'Amore <garrett@damore.org>
* Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
*** 96,105 ****
--- 97,108 ----
uint_t auxv_hwcap32_2 = 0; /* 32-bit version of auxv_hwcap2 */
#endif
#define PSUIDFLAGS (SNOCD|SUGID)
+ #define DEVFD "/dev/fd/"
+
/*
* exece() - system call wrapper around exec_common()
*/
int
exece(const char *fname, const char **argp, const char **envp)
*** 196,206 ****
* there are other cases in which that failure may occur.
*/
if ((error = pn_get((char *)fname, UIO_USERSPACE, &pn)) != 0)
goto out;
pn_alloc(&resolvepn);
! if ((error = lookuppn(&pn, &resolvepn, FOLLOW, &dir, &vp)) != 0) {
pn_free(&resolvepn);
pn_free(&pn);
if (error != EINVAL)
goto out;
--- 199,224 ----
* there are other cases in which that failure may occur.
*/
if ((error = pn_get((char *)fname, UIO_USERSPACE, &pn)) != 0)
goto out;
pn_alloc(&resolvepn);
!
! if (strncmp(pn.pn_path, DEVFD, strlen(DEVFD)) == 0) {
! /* looks like a /dev/fd node */
! char *p = pn.pn_path + strlen(DEVFD);
! int fd = stoi(&p);
! if ((fd < 0) || (*p != 0) || (p == pn.pn_path)) {
! error = EBADF;
! goto out;
! }
! if ((error = fgetstartvp(fd, NULL, &vp)) != 0) {
! goto out; /* error will be EBADF */
! }
! (void) pn_set(&resolvepn, pn.pn_path);
!
! } else if ((error =
! lookuppn(&pn, &resolvepn, FOLLOW, &dir, &vp)) != 0) {
pn_free(&resolvepn);
pn_free(&pn);
if (error != EINVAL)
goto out;