Hello all,

I am burning my last neurons with a behavior I can't explain. I wonder
why getaddrinfo() fails when called after chroot() with root user.


I have this piece of code :

/*--- test.c ---*/
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <pwd.h>

int main(int argc, char *argv[])
{
        struct addrinfo *ai_out;
        struct passwd   *pw;
        int error;

        pw = getpwnam("_bgpd");

        error = getaddrinfo("rpki.liopen.eu", NULL, NULL, &ai_out);
        if (error)
                printf("getaddrinfo() failed\n");
        else printf("getaddrinfo() succeed\n");

        chroot(pw->pw_dir);
        chdir("/");

        error = getaddrinfo("rpki.liopen.eu", NULL, NULL, &ai_out);
        if (error)
                printf("getaddrinfo() failed\n");
        else printf("getaddrinfo() succeed\n");

        return 0;
}
/*--- test.c ---*/

$ ./a.out
getaddrinfo() succeed
getaddrinfo() succeed

# ./a.out
getaddrinfo() succeed
getaddrinfo() succeed




Everything is good. Now if I compile :

/*--- test.c ---*/
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <pwd.h>

int main(int argc, char *argv[])
{
        struct addrinfo *ai_out;
        struct passwd   *pw;
        int error;

        pw = getpwnam("_bgpd");

        error = 0
        if (error)
                printf("getaddrinfo() failed\n");
        else printf("getaddrinfo() succeed\n");

        chroot(pw->pw_dir);

        error = getaddrinfo("rpki.liopen.eu", NULL, NULL, &ai_out);
        if (error)
                printf("getaddrinfo() failed\n");
        else printf("getaddrinfo() succeed\n");

        return 0;
}
/*--- test.c ---*/

$ ./a.out
getaddrinfo() succeed
getaddrinfo() succeed

# ./a.out
getaddrinfo() succeed
getaddrinfo() failed



If this an expected behavior, what would be the preferred way to resolve
a name from a chrooted process ? I am extending OpenBGPd and I need to
resolve domain names and connect to a service (no BGP protocol). I am
currently using the "session" process to handle the connection part but
I am stuck on name resolution for now.

Thank you in advance,
Denis

Reply via email to