http://www.perlmonks.org?node_id=858008


in reply to adding libs in a setuid-perl script

The script works without the suid-bit, so the file libct.so exists and can be found, but the library containing the file isn't searched.
I think that's because in modern Perls, running with the suid bit set enables tainting. Which means that it only searches in the directories set when perl was compiled. You may want to add a
use lib "/usr/local/test/lib/perl5/site_perl/5.12.1";
before using any Sybase module.

Replies are listed 'Best First'.
Re^2: adding libs in a setuid-perl script
by LucBrussels (Initiate) on Aug 30, 2010 at 13:58 UTC
    I've tried that without success

    . When I look at the error messages, the error comes from executing /usr/local/test/lib/perl5/5.12.1/sun4-solaris/DynaLoader.pm at line 200 :

    my $libref = dl_load_file($file, $module->dl_load_flags) or croak("Can't load '$file' for module $module: ".dl_error());

    where it tries to load /usr/local/test/lib/perl5/site_perl/5.12.1/Sybase/Simple.pm. This files starts with the following code where the last line is on line 19 (the line mentioned in the error).

    package Sybase::Simple; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); require Exporter; require AutoLoader; use Carp; use Sybase::CTlib qw(:DEFAULT !ct_callback);

    This code generates error :

    Can't load '/usr/local/test/lib/perl5/site_perl/5.12.1/sun4-solaris/auto/Sybase/CTlib/CTlib.so' for module Sybase::CTlib: ld.so.1: perl: fatal: libct.so: open failed

    libct.so is the first library CTlib.so tries to open :

    $ ldd /usr/local/test/lib/perl5/site_perl/5.12.1/sun4-solaris/auto/Syb +ase/CTlib/CTlib.so libct.so => /local/sybase/sdk1251/OCS-12_5/lib//libct.so libcs.so => /local/sybase/sdk1251/OCS-12_5/lib//libcs.so libtcl.so => /local/sybase/sdk1251/OCS-12_5/lib//libtcl.so libcomn.so => /local/sybase/sdk1251/OCS-12_5/lib//libcomn.s +o libintl.so => /local/sybase/sdk1251/OCS-12_5/lib//libintl.s +o libblk.so => /local/sybase/sdk1251/OCS-12_5/lib//libblk.so libm.so.2 => /lib/libm.so.2 libc.so.1 => /lib/libc.so.1 libsocket.so.1 => /lib/libsocket.so.1 libnsl.so.1 => /lib/libnsl.so.1 libmp.so.2 => /lib/libmp.so.2 libmd.so.1 => /lib/libmd.so.1 libscf.so.1 => /lib/libscf.so.1 libdoor.so.1 => /lib/libdoor.so.1 libuutil.so.1 => /lib/libuutil.so.1 libgen.so.1 => /lib/libgen.so.1 /platform/SUNW,Sun-Fire-V490/lib/libc_psr.so.1 /platform/SUNW,Sun-Fire-V490/lib/libmd_psr.so.1

    I've added 'use lib' statements for the directories mentioned in the error messages. My script now looks like :

    #!/usr/local/test/bin/perl use lib "/usr/local/test/lib/perl5/site_perl/5.12.1"; use lib "/usr/local/test/lib/perl5/site_perl/5.12.1/Sybase"; use lib "/usr/local/test/lib/perl5/5.12.1/sun4-solaris"; use lib '/local/sybase/sdk1251/OCS-12_5/lib'; use lib "/usr/local/test/lib/perl5/site_perl/5.12.1/sun4-solaris/auto/ +Sybase/CTlib"; $ENV{'LD_LIBRARY_PATH'} = '/local/sybase/sdk1251/OCS-12_5/lib:/lib:/us +r/openwin/lib:/usr/ccs/l\ ib:/usr/local/lib/perl5/site_perl/5.12.1/sun4-solaris/auto/Sybase/CTli +b'; use Sybase::Simple; exit;

    I don't know what else to do, I can try to statically link CTlib.so, but would prefer a more general solution. many thanks, Luc.

      If you need that setting of LD_LIBRARY_PATH, it won't have any effect, as you set it at run time, while the use happens at compile time. Try this instead:
      BEGIN { $ENV{LD_LIBRARY_PATH} = "...your path goes here..."; }