logo       

Re: Obtaining the ip address of an interface dynamically: msg#00185

Subject: Re: Obtaining the ip address of an interface dynamically
Glover George wrote:

> Hi, I'm working on a little module here and was wondering what the BEST
> way to get an interface's current ip address by using it's name (i.e.,
> eth0) is.  I was trying one way using sockets and it just doesn't seem
> to reliably give it to me every time.  I was using these two functions
> below, but I it would return NULL some of the time from
> IPCon_GetIpAddrByStr sometimes, so I'm not sure.  I need a way to be
> able to reliably obtain this ip at any give time (due to dhcp, etc). Any
> pointers?  TIA.
> 
> struct in_addr * IPCon::IPCon_GetIpAddr(void)
> {
>         struct ifreq ifr;
>         struct sockaddr_in *saddr;
>         int fd;
>         fd = get_sockfd();
>         if (fd >= 0 )
>         {
>                 strcpy(ifr.ifr_name, m_ifname);
>                 ifr.ifr_addr.sa_family = AF_INET;
>                 if (ioctl(fd, SIOCGIFADDR, &ifr) == 0)
>                 {
>                         saddr = (sockaddr_in *)&ifr.ifr_addr;
>                         return &saddr->sin_addr;

You are returning a pointer to data which is on the stack, and which
ceases to be valid once you've returned from the function.

You should either have the caller supply the buffer, e.g.

        bool IPCon::IPCon_GetIpAddr(struct in_addr *result)

or allocate the memory dynamically, with malloc() or new.

-- 
Glynn Clements <glynn.clements@xxxxxxxxxx>
-
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



<Prev in Thread] Current Thread [Next in Thread>