summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/logic/slbt_exec_execute.c7
-rw-r--r--src/logic/slbt_exec_install.c23
-rw-r--r--src/logic/slbt_exec_link.c22
-rw-r--r--src/logic/slbt_exec_uninstall.c11
4 files changed, 43 insertions, 20 deletions
diff --git a/src/logic/slbt_exec_execute.c b/src/logic/slbt_exec_execute.c
index bcf0913..91a1cb7 100644
--- a/src/logic/slbt_exec_execute.c
+++ b/src/logic/slbt_exec_execute.c
@@ -12,6 +12,7 @@
#include <slibtool/slibtool.h>
#include "slibtool_spawn_impl.h"
+#include "slibtool_driver_impl.h"
#include "slibtool_errinfo_impl.h"
int slbt_exec_execute(
@@ -19,6 +20,7 @@ int slbt_exec_execute(
struct slbt_exec_ctx * ectx)
{
int ret;
+ int fdcwd;
char * program;
char * script;
char * base;
@@ -66,8 +68,11 @@ int slbt_exec_execute(
mark = exeref + (base - script);
sprintf(mark,".libs/%s",base);
+ /* fdcwd */
+ fdcwd = slbt_driver_fdcwd(dctx);
+
/* swap vector */
- if (!(stat(script,&st)) && !(stat(wrapper,&st))) {
+ if (!fstatat(fdcwd,script,&st,0) && !fstatat(fdcwd,wrapper,&st,0)) {
ectx->cargv[0] = wrapper;
ectx->cargv[1] = program;
ectx->cargv[2] = exeref;
diff --git a/src/logic/slbt_exec_install.c b/src/logic/slbt_exec_install.c
index 4aafd0f..5adfd34 100644
--- a/src/logic/slbt_exec_install.c
+++ b/src/logic/slbt_exec_install.c
@@ -70,12 +70,15 @@ static int slbt_exec_install_init_dstdir(
struct argv_entry * last,
char * dstdir)
{
+ int fdcwd;
struct stat st;
char * slash;
size_t len;
- (void)dctx;
+ /* fdcwd */
+ fdcwd = slbt_driver_fdcwd(dctx);
+ /* last */
if (dest)
last = dest;
@@ -95,7 +98,7 @@ static int slbt_exec_install_init_dstdir(
return 0;
/* is DEST a directory? */
- if (!(stat(dstdir,&st)))
+ if (!fstatat(fdcwd,dstdir,&st,0))
if (S_ISDIR(st.st_mode))
return 0;
@@ -335,6 +338,7 @@ static int slbt_exec_install_entry(
char ** dst)
{
int ret;
+ int fdcwd;
char * dot;
char * base;
char * slash;
@@ -359,10 +363,15 @@ static int slbt_exec_install_entry(
entry->arg) >= sizeof(slnkname))
return SLBT_BUFFER_ERROR(dctx);
- fexe = stat(slnkname,&st)
+ /* fdcwd */
+ fdcwd = slbt_driver_fdcwd(dctx);
+
+ /* fexe */
+ fexe = fstatat(fdcwd,slnkname,&st,0)
? false
: true;
+ /* argument suffix */
dot = strrchr(entry->arg,'.');
/* .lai --> .la */
@@ -389,7 +398,7 @@ static int slbt_exec_install_entry(
srcfile) >= sizeof(slnkname))
return SLBT_BUFFER_ERROR(dctx);
- if (!stat(slnkname,&st)) {
+ if (!fstatat(fdcwd,slnkname,&st,0)) {
if (slbt_readlink(slnkname,target,sizeof(target)) < 0)
return SLBT_SYSTEM_ERROR(dctx,slnkname);
@@ -436,7 +445,7 @@ static int slbt_exec_install_entry(
/* libfoo.a --> libfoo.so.release */
sprintf(dot,"%s.release",dsosuffix);
- frelease = stat(slnkname,&st) ? false : true;
+ frelease = fstatat(fdcwd,slnkname,&st,0) ? false : true;
/* libfoo.a --> libfoo.so */
strcpy(dot,dsosuffix);
@@ -460,7 +469,7 @@ static int slbt_exec_install_entry(
slnkname) >= sizeof(dstfile))
return SLBT_BUFFER_ERROR(dctx);
- fpe = stat(dstfile,&st) ? false : true;
+ fpe = fstatat(fdcwd,dstfile,&st,0) ? false : true;
/* basename */
if ((base = strrchr(slnkname,'/')))
@@ -475,7 +484,7 @@ static int slbt_exec_install_entry(
return 0;
/* -avoid-version? */
- if (stat(slnkname,&st))
+ if (fstatat(fdcwd,slnkname,&st,0))
return SLBT_SYSTEM_ERROR(dctx,slnkname);
/* dstfile */
diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c
index 8b8efa2..e5376b3 100644
--- a/src/logic/slbt_exec_link.c
+++ b/src/logic/slbt_exec_link.c
@@ -97,6 +97,9 @@ static int slbt_get_deps_meta(
struct slbt_map_info * mapinfo;
char depfile[PATH_MAX];
+ /* fdcwd */
+ fdcwd = slbt_driver_fdcwd(dctx);
+
/* -rpath */
if ((size_t)snprintf(depfile,sizeof(depfile),
"%s.slibtool.rpath",
@@ -105,7 +108,7 @@ static int slbt_get_deps_meta(
return SLBT_BUFFER_ERROR(dctx);
/* -Wl,%s */
- if (!(lstat(depfile,&st))) {
+ if (!fstatat(fdcwd,depfile,&st,AT_SYMLINK_NOFOLLOW)) {
depsmeta->infolen += st.st_size + 4;
depsmeta->infolen++;
}
@@ -117,9 +120,6 @@ static int slbt_get_deps_meta(
>= sizeof(depfile))
return SLBT_BUFFER_ERROR(dctx);
- /* fdcwd */
- fdcwd = slbt_driver_fdcwd(dctx);
-
/* mapinfo */
if (!(mapinfo = slbt_map_file(fdcwd,depfile,SLBT_MAP_INPUT)))
return (fexternal && (errno == ENOENT))
@@ -535,7 +535,7 @@ static int slbt_exec_link_adjust_argument_vector(
/* -rpath */
sprintf(rpathlnk,"%s.slibtool.rpath",*carg);
- if (!(lstat(rpathlnk,&st))) {
+ if (!fstatat(fdcwd,rpathlnk,&st,AT_SYMLINK_NOFOLLOW)) {
if (slbt_readlink(
rpathlnk,\
rpathdir,
@@ -590,7 +590,7 @@ static int slbt_exec_link_adjust_argument_vector(
}
}
- if (dpath && !stat(dpath,&st)) {
+ if (dpath && !fstatat(fdcwd,dpath,&st,0)) {
if (!(mapinfo = slbt_map_file(
fdcwd,dpath,
SLBT_MAP_INPUT)))
@@ -975,7 +975,7 @@ static int slbt_exec_link_create_dep_file(
mark = strrchr(mark,'.');
strcpy(mark,dctx->cctx->settings.dsosuffix);
- fdyndep = !stat(depfile,&st);
+ fdyndep = !fstatat(fdcwd,depfile,&st,0);
/* [-L... as needed] */
if (fdyndep && (ectx->ldirdepth >= 0)) {
@@ -1229,9 +1229,13 @@ static int slbt_exec_link_create_noop_symlink(
const char * arfilename)
{
struct stat st;
+ int fdcwd;
+
+ /* fdcwd */
+ fdcwd = slbt_driver_fdcwd(dctx);
/* file exists? */
- if (!(lstat(arfilename,&st)))
+ if (!fstatat(fdcwd,arfilename,&st,AT_SYMLINK_NOFOLLOW))
return 0;
/* needed? */
@@ -1752,7 +1756,7 @@ static int slbt_exec_link_create_executable(
&depsmeta,
SLBT_NESTED_ERROR(dctx));
- if (stat(wrapper,&st))
+ if (fstatat(fdcwd,wrapper,&st,0))
return slbt_exec_link_exit(
&depsmeta,
SLBT_SYSTEM_ERROR(dctx,wrapper));
diff --git a/src/logic/slbt_exec_uninstall.c b/src/logic/slbt_exec_uninstall.c
index 28a73b2..9f2521c 100644
--- a/src/logic/slbt_exec_uninstall.c
+++ b/src/logic/slbt_exec_uninstall.c
@@ -68,13 +68,18 @@ static int slbt_exec_uninstall_fs_entry(
uint32_t flags)
{
struct stat st;
+ int fdcwd;
char * slash;
char dpath[PATH_MAX];
+ /* fdcwd */
+ fdcwd = slbt_driver_fdcwd(dctx);
+
/* needed? */
- if (stat(path,&st) && (errno == ENOENT))
- if (lstat(path,&st) && (errno == ENOENT))
- return 0;
+ if (fstatat(fdcwd,path,&st,0) && (errno == ENOENT))
+ if (fstatat(fdcwd,path,&st,AT_SYMLINK_NOFOLLOW))
+ if (errno == ENOENT)
+ return 0;
/* output */
*parg = path;