From cc0827cebd811eab83d091ffde3780e5c0084160 Mon Sep 17 00:00:00 2001 From: midipix Date: Thu, 15 Apr 2021 10:06:44 +0000 Subject: internals: slbt_create_symlink(): properly handle absolute-path link targets. --- src/internal/slibtool_symlink_impl.c | 14 ++++++++++++-- src/internal/slibtool_symlink_impl.h | 6 +++++- src/logic/slbt_exec_install.c | 6 +++--- src/logic/slbt_exec_link.c | 31 +++++++++++++++++-------------- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/internal/slibtool_symlink_impl.c b/src/internal/slibtool_symlink_impl.c index ca7f6cd..0b1daa0 100644 --- a/src/internal/slibtool_symlink_impl.c +++ b/src/internal/slibtool_symlink_impl.c @@ -23,9 +23,11 @@ int slbt_create_symlink( struct slbt_exec_ctx * ectx, const char * target, const char * lnkname, - bool flawrapper) + uint32_t options) { int fdcwd; + int fliteral; + int fwrapper; char ** oargv; const char * slash; char * ln[5]; @@ -36,12 +38,20 @@ int slbt_create_symlink( char atarget[PATH_MAX]; char * suffix = 0; + /* options */ + fliteral = (options & SLBT_SYMLINK_LITERAL); + fwrapper = (options & SLBT_SYMLINK_WRAPPER); + /* symlink is a placeholder? */ if ((dctx->cctx->drvflags & SLBT_DEV_NULL_FLAGS) && !strcmp(target,"/dev/null")) { slash = target; suffix = ".disabled"; + /* target is an absolute path? */ + } else if (fliteral) { + slash = target; + /* symlink target contains a dirname? */ } else if ((slash = strrchr(target,'/'))) { slash++; @@ -52,7 +62,7 @@ int slbt_create_symlink( } /* .la wrapper? */ - dotdot = flawrapper ? "../" : ""; + dotdot = fwrapper ? "../" : ""; /* atarget */ if ((size_t)snprintf(atarget,sizeof(atarget),"%s%s", diff --git a/src/internal/slibtool_symlink_impl.h b/src/internal/slibtool_symlink_impl.h index 402208c..5619e75 100644 --- a/src/internal/slibtool_symlink_impl.h +++ b/src/internal/slibtool_symlink_impl.h @@ -4,12 +4,16 @@ #include #include +#define SLBT_SYMLINK_DEFAULT 0x0000 +#define SLBT_SYMLINK_LITERAL 0x0001 +#define SLBT_SYMLINK_WRAPPER 0x0002 + int slbt_create_symlink( const struct slbt_driver_ctx * dctx, struct slbt_exec_ctx * ectx, const char * target, const char * lnkname, - bool flawrapper); + uint32_t options); int slbt_symlink_is_a_placeholder(int fdcwd, char * lnkpath); diff --git a/src/logic/slbt_exec_install.c b/src/logic/slbt_exec_install.c index 3429d91..5e5d440 100644 --- a/src/logic/slbt_exec_install.c +++ b/src/logic/slbt_exec_install.c @@ -231,7 +231,7 @@ static int slbt_exec_install_import_libraries( dctx,ectx, implib, hostlnk, - false)) + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); return 0; @@ -540,7 +540,7 @@ static int slbt_exec_install_entry( if (slbt_create_symlink( dctx,ectx, target,dlnkname, - false)) + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); if (frelease) @@ -602,7 +602,7 @@ static int slbt_exec_install_entry( if (slbt_create_symlink( dctx,ectx, target,dlnkname, - false)) + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); } diff --git a/src/logic/slbt_exec_link.c b/src/logic/slbt_exec_link.c index 6c0361c..f9bd8d7 100644 --- a/src/logic/slbt_exec_link.c +++ b/src/logic/slbt_exec_link.c @@ -1157,7 +1157,7 @@ static int slbt_exec_link_create_import_library( dctx,ectx, deffilename, hosttag, - false)) + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); /* libfoo.so.def.{flavor} is under .libs/ */ @@ -1168,7 +1168,7 @@ static int slbt_exec_link_create_import_library( dctx,ectx, ++slash, hostlnk, - false)) + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); } @@ -1250,7 +1250,7 @@ static int slbt_exec_link_create_noop_symlink( dctx,ectx, "/dev/null", arfilename, - false)) + SLBT_SYMLINK_LITERAL)) return SLBT_NESTED_ERROR(dctx); return 0; } @@ -1362,7 +1362,10 @@ static int slbt_exec_link_create_archive( if (slbt_exec_link_remove_file(dctx,ectx,arlink)) return SLBT_NESTED_ERROR(dctx); - if (slbt_create_symlink(dctx,ectx,arfile,arlink,0)) + if (slbt_create_symlink( + dctx,ectx, + arfile,arlink, + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); } @@ -1544,7 +1547,7 @@ static int slbt_exec_link_create_library( dctx,ectx, dctx->cctx->host.ldrpath, ectx->rpathfilename, - 0)) + SLBT_SYMLINK_LITERAL)) return SLBT_NESTED_ERROR(dctx); } @@ -1761,7 +1764,7 @@ static int slbt_exec_link_create_executable( if (slbt_create_symlink( dctx,ectx, dctx->cctx->output,wraplnk, - false)) + SLBT_SYMLINK_DEFAULT)) return slbt_exec_link_exit( &depsmeta, SLBT_NESTED_ERROR(dctx)); @@ -1800,7 +1803,7 @@ static int slbt_exec_link_create_library_symlink( if (slbt_create_symlink( dctx,ectx, target,lnkname, - false)) + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); } else { sprintf(target,"%s%s.%d.%d.%d%s", @@ -1838,7 +1841,7 @@ static int slbt_exec_link_create_library_symlink( return slbt_create_symlink( dctx,ectx, target,lnkname, - false); + SLBT_SYMLINK_DEFAULT); } int slbt_exec_link( @@ -1956,7 +1959,7 @@ int slbt_exec_link( dctx,ectx, "/dev/null", ectx->dsofilename, - false)) + SLBT_SYMLINK_LITERAL)) return SLBT_NESTED_ERROR(dctx); /* dynaic library via -module */ @@ -1986,7 +1989,7 @@ int slbt_exec_link( if (slbt_create_symlink( dctx,ectx, target,lnkname, - false)) + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); strcpy(target,lnkname); @@ -1995,7 +1998,7 @@ int slbt_exec_link( if (slbt_create_symlink( dctx,ectx, target,lnkname, - false)) + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); } @@ -2052,7 +2055,7 @@ int slbt_exec_link( dctx,ectx, ectx->pimpfilename, ectx->dimpfilename, - false)) + SLBT_SYMLINK_DEFAULT)) return SLBT_NESTED_ERROR(dctx); /* libfoo.x.y.z.lib.a */ @@ -2096,7 +2099,7 @@ int slbt_exec_link( dctx,ectx, output, ectx->lafilename, - true))) + SLBT_SYMLINK_WRAPPER))) SLBT_NESTED_ERROR(dctx); /* .lai wrapper symlink */ @@ -2105,7 +2108,7 @@ int slbt_exec_link( dctx,ectx, output, ectx->laifilename, - true))) + SLBT_SYMLINK_WRAPPER))) SLBT_NESTED_ERROR(dctx); /* all done */ -- cgit v1.2.3