Print

Print


Hello Fabrizio

We found that a core is produced if the function
   XrdClientAdmin_c::XrdDirList(const char *dir)
is called and the directory for which we want to get the
listing is empty.

In this case the call to
   adminst->DirList(dir, entries)    in XrdClientAdmin_c::XrdDirList
returns an empty vector (entries) and the call
  joinStrings(lst, entries);
crashes because joinStrings can not handle
an empty vector. At least that's what it looks to me.


The test program that I run is:

#include "XrdClient/XrdClient.hh"
#include "XrdClient/XrdClientAdmin_c.hh"
#include <iostream>

int main(int argc, char **argv) {
     XrdInitialize(argv[1], 2);
     char *strans;
     strans = XrdDirList("/prod/s1/s2/s3/s5");
     cout << "answer : " << strans endl;
     XrdTerminate();
}

and the core is:

(gdb) where
#0  0x005cbcdf in raise () from /lib/tls/libc.so.6
#1  0x005cd4e5 in abort () from /lib/tls/libc.so.6
#2  0x0804d15e in XrdClientString::At(int) (this=0xbfff9af0, pos=-1)
    at XrdClientString.hh:103
#3  0x0804cfab in XrdClientString::operator[](int) (this=0xbfff9af0, pos=-1)
    at XrdClientString.hh:213
#4  0x0804de78 in joinStrings(XrdClientString&, XrdClientVector<XrdClientString>)
    (buf=@0xbfff9af0, vs={data = 0x0, size = 0, capacity = 0})
    at XrdClientAdmin.cc:46
#5  0x0804c601 in XrdDirList (dir=0x8071228 "/prod/s1/s2/s3/s5")
    at XrdClientAdmin_c.cc:230
#6  0x0804b9c1 in main (argc=2, argv=0xbfff9bd4) at TestXrdClient.cc:26



The xrootd version is 20041220-1337.

Thanks,
  Wilko