From c81d169af088b6b90d850d7c0f5c5daae6cfc4ba Mon Sep 17 00:00:00 2001 From: midipix Date: Tue, 13 Apr 2021 18:15:38 +0000 Subject: library: replace all uses of [slbt_]readlink() with [slbt_]readlinkat(). --- src/helper/slbt_archive_import.c | 7 ++++++- src/helper/slbt_copy_file.c | 7 ++++++- src/helper/slbt_realpath.c | 3 ++- src/internal/slibtool_readlink_impl.h | 5 +++-- src/internal/slibtool_symlink_impl.c | 4 ++-- src/internal/slibtool_symlink_impl.h | 2 +- src/logic/slbt_exec_install.c | 14 +++++++++----- src/logic/slbt_exec_link.c | 7 ++++--- src/logic/slbt_exec_uninstall.c | 10 +++++++--- 9 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/helper/slbt_archive_import.c b/src/helper/slbt_archive_import.c index ae8821b..b3b1cec 100644 --- a/src/helper/slbt_archive_import.c +++ b/src/helper/slbt_archive_import.c @@ -13,6 +13,7 @@ #include #include +#include "slibtool_driver_impl.h" #include "slibtool_spawn_impl.h" #include "slibtool_dprintf_impl.h" #include "slibtool_symlink_impl.h" @@ -80,6 +81,7 @@ int slbt_archive_import( char * dstarchive, char * srcarchive) { + int fdcwd; pid_t pid; pid_t rpid; int fd[2]; @@ -90,8 +92,11 @@ int slbt_archive_import( char mrisrc [L_tmpnam]; char program[PATH_MAX]; + /* fdcwd */ + fdcwd = slbt_driver_fdcwd(dctx); + /* not needed? */ - if (slbt_symlink_is_a_placeholder(srcarchive)) + if (slbt_symlink_is_a_placeholder(fdcwd,srcarchive)) return 0; /* program */ diff --git a/src/helper/slbt_copy_file.c b/src/helper/slbt_copy_file.c index e9abee5..7e549d9 100644 --- a/src/helper/slbt_copy_file.c +++ b/src/helper/slbt_copy_file.c @@ -6,6 +6,7 @@ /*******************************************************************/ #include +#include "slibtool_driver_impl.h" #include "slibtool_spawn_impl.h" #include "slibtool_symlink_impl.h" #include "slibtool_errinfo_impl.h" @@ -16,13 +17,17 @@ int slbt_copy_file( char * src, char * dst) { + int fdcwd; char ** oargv; char * oprogram; char * cp[4]; int ret; + /* fdcwd */ + fdcwd = slbt_driver_fdcwd(dctx); + /* placeholder? */ - if (slbt_symlink_is_a_placeholder(src)) + if (slbt_symlink_is_a_placeholder(fdcwd,src)) return 0; /* cp argv */ diff --git a/src/helper/slbt_realpath.c b/src/helper/slbt_realpath.c index 4c7446e..bae41ec 100644 --- a/src/helper/slbt_realpath.c +++ b/src/helper/slbt_realpath.c @@ -12,6 +12,7 @@ #include #include +#include "slibtool_driver_impl.h" #include "slibtool_readlink_impl.h" #ifdef _MIDIPIX_ABI @@ -64,7 +65,7 @@ int slbt_realpath( sprintf(procfspath,"/proc/self/fd/%d",fd); - if (slbt_readlink(procfspath,buf,buflen)) { + if (slbt_readlinkat(fdat,procfspath,buf,buflen)) { close(fd); return -1; } diff --git a/src/internal/slibtool_readlink_impl.h b/src/internal/slibtool_readlink_impl.h index 644a638..3730b1e 100644 --- a/src/internal/slibtool_readlink_impl.h +++ b/src/internal/slibtool_readlink_impl.h @@ -10,14 +10,15 @@ #include #include -static inline int slbt_readlink( +static inline int slbt_readlinkat( + int fdcwd, const char * restrict path, char * restrict buf, ssize_t bufsize) { ssize_t ret; - if ((ret = readlink(path,buf,bufsize)) <= 0) { + if ((ret = readlinkat(fdcwd,path,buf,bufsize)) <= 0) { return -1; } else if (ret == bufsize) { errno = ENOBUFS; diff --git a/src/internal/slibtool_symlink_impl.c b/src/internal/slibtool_symlink_impl.c index dd91d5e..cc09a32 100644 --- a/src/internal/slibtool_symlink_impl.c +++ b/src/internal/slibtool_symlink_impl.c @@ -108,7 +108,7 @@ int slbt_create_symlink( : 0; } -int slbt_symlink_is_a_placeholder(char * lnkpath) +int slbt_symlink_is_a_placeholder(int fdcwd, char * lnkpath) { size_t len; char slink [PATH_MAX]; @@ -121,6 +121,6 @@ int slbt_symlink_is_a_placeholder(char * lnkpath) memcpy(slink,lnkpath,len); memcpy(&slink[len],suffix,sizeof(suffix)); - return (!slbt_readlink(slink,target,sizeof(target))) + return (!slbt_readlinkat(fdcwd,slink,target,sizeof(target))) && (!strcmp(target,"/dev/null")); } diff --git a/src/internal/slibtool_symlink_impl.h b/src/internal/slibtool_symlink_impl.h index 9393a17..402208c 100644 --- a/src/internal/slibtool_symlink_impl.h +++ b/src/internal/slibtool_symlink_impl.h @@ -11,6 +11,6 @@ int slbt_create_symlink( const char * lnkname, bool flawrapper); -int slbt_symlink_is_a_placeholder(char * lnkpath); +int slbt_symlink_is_a_placeholder(int fdcwd, char * lnkpath); #endif diff --git a/src/logic/slbt_exec_install.c b/src/logic/slbt_exec_install.c index 5adfd34..3429d91 100644 --- a/src/logic/slbt_exec_install.c +++ b/src/logic/slbt_exec_install.c @@ -115,6 +115,7 @@ static int slbt_exec_install_import_libraries( char * srcdso, char * dstdir) { + int fdcwd; char * host; char * slash; char * dot; @@ -127,6 +128,9 @@ static int slbt_exec_install_import_libraries( char minor [128]; char rev [128]; + /* fdcwd */ + fdcwd = slbt_driver_fdcwd(dctx); + /* .libs/libfoo.so.x.y.z */ if ((size_t)snprintf(srcbuf,sizeof(srcbuf),"%s", srcdso) >= sizeof(srcbuf)) @@ -184,7 +188,7 @@ static int slbt_exec_install_import_libraries( return SLBT_BUFFER_ERROR(dctx); /* libfoo.so.def.{flavor} */ - if (slbt_readlink(hostlnk,hosttag,sizeof(hosttag))) + if (slbt_readlinkat(fdcwd,hostlnk,hosttag,sizeof(hosttag))) return SLBT_SYSTEM_ERROR(dctx,hostlnk); /* host/flabor */ @@ -399,7 +403,7 @@ static int slbt_exec_install_entry( return SLBT_BUFFER_ERROR(dctx); if (!fstatat(fdcwd,slnkname,&st,0)) { - if (slbt_readlink(slnkname,target,sizeof(target)) < 0) + if (slbt_readlinkat(fdcwd,slnkname,target,sizeof(target)) < 0) return SLBT_SYSTEM_ERROR(dctx,slnkname); if (strncmp(lasource,target,(slen = strlen(lasource)))) @@ -453,7 +457,7 @@ static int slbt_exec_install_entry( /* libfoo.a installation */ if (!(dctx->cctx->drvflags & SLBT_DRIVER_DISABLE_STATIC)) farchive = true; - else if (slbt_symlink_is_a_placeholder(slnkname)) + else if (slbt_symlink_is_a_placeholder(fdcwd,slnkname)) farchive = true; else farchive = false; @@ -478,9 +482,9 @@ static int slbt_exec_install_entry( base = slnkname; /* source (build) symlink target */ - if (slbt_readlink(slnkname,target,sizeof(target)) < 0) { + if (slbt_readlinkat(fdcwd,slnkname,target,sizeof(target)) < 0) { /* -all-static? */ - if (slbt_symlink_is_a_placeholder(slnkname)) + if (slbt_symlink_is_a_placeholder(fdcwd,slnkname)) return 0; /* -avoid-version? */ diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index e5376b3..01a46bb 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -304,7 +304,7 @@ static int slbt_adjust_linker_argument( if (fpic) { sprintf(dot,"%s",dsosuffix); - if (slbt_symlink_is_a_placeholder(arg)) + if (slbt_symlink_is_a_placeholder(fdcwd,arg)) sprintf(dot,"%s",arsuffix); else if ((fdlib = openat(fdcwd,arg,O_RDONLY)) >= 0) close(fdlib); @@ -536,8 +536,9 @@ static int slbt_exec_link_adjust_argument_vector( sprintf(rpathlnk,"%s.slibtool.rpath",*carg); if (!fstatat(fdcwd,rpathlnk,&st,AT_SYMLINK_NOFOLLOW)) { - if (slbt_readlink( - rpathlnk,\ + if (slbt_readlinkat( + fdcwd, + rpathlnk, rpathdir, sizeof(rpathdir))) return slbt_exec_link_exit( diff --git a/src/logic/slbt_exec_uninstall.c b/src/logic/slbt_exec_uninstall.c index 9f2521c..2930c26 100644 --- a/src/logic/slbt_exec_uninstall.c +++ b/src/logic/slbt_exec_uninstall.c @@ -166,6 +166,7 @@ static int slbt_exec_uninstall_entry( char ** parg, uint32_t flags) { + int fdcwd; const char * dsosuffix; char * dot; char path [PATH_MAX]; @@ -177,6 +178,9 @@ static int slbt_exec_uninstall_entry( *parg = (char *)entry->arg; + /* fdcwd */ + fdcwd = slbt_driver_fdcwd(dctx); + /* remove explicit argument */ if (slbt_exec_uninstall_fs_entry(dctx,ectx,parg,path,flags)) return SLBT_NESTED_ERROR(dctx); @@ -200,7 +204,7 @@ static int slbt_exec_uninstall_entry( /* .so symlink? */ strcpy(dot,dsosuffix); - if (!(slbt_readlink(path,lpath,sizeof(lpath)))) + if (!(slbt_readlinkat(fdcwd,path,lpath,sizeof(lpath)))) if (slbt_exec_uninstall_versioned_library( dctx,ectx,parg, path,lpath, @@ -210,7 +214,7 @@ static int slbt_exec_uninstall_entry( /* .lib.a symlink? */ strcpy(dot,".lib.a"); - if (!(slbt_readlink(path,lpath,sizeof(lpath)))) + if (!(slbt_readlinkat(fdcwd,path,lpath,sizeof(lpath)))) if (slbt_exec_uninstall_versioned_library( dctx,ectx,parg, path,lpath, @@ -220,7 +224,7 @@ static int slbt_exec_uninstall_entry( /* .dll symlink? */ strcpy(dot,".dll"); - if (!(slbt_readlink(path,lpath,sizeof(lpath)))) + if (!(slbt_readlinkat(fdcwd,path,lpath,sizeof(lpath)))) if (slbt_exec_uninstall_versioned_library( dctx,ectx,parg, path,lpath, -- cgit v1.2.3