[HQ-93] un-clobber stack data in sigar_gethostbyname
This commit is contained in:
parent
f1a13a3361
commit
5c26b463d9
|
@ -239,4 +239,23 @@ int sigar_get_iftype(const char *name, int *type, int *inst);
|
||||||
#define SIGAR_NIC_ETHERNET "Ethernet"
|
#define SIGAR_NIC_ETHERNET "Ethernet"
|
||||||
#define SIGAR_NIC_NETROM "AMPR NET/ROM"
|
#define SIGAR_NIC_NETROM "AMPR NET/ROM"
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#else
|
||||||
|
#include <netdb.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SIGAR_GETHOSTBYNAME_LEN 512
|
||||||
|
#if defined(__hpux) || defined(_AIX)
|
||||||
|
#define SIGAR_HAS_HOSTENT_DATA
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char buffer[SIGAR_GETHOSTBYNAME_LEN];
|
||||||
|
struct hostent hs;
|
||||||
|
int error;
|
||||||
|
#ifdef SIGAR_HAS_HOSTENT_DATA
|
||||||
|
struct hostent_data hd;
|
||||||
|
#endif
|
||||||
|
} sigar_hostent_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -30,7 +30,8 @@
|
||||||
|
|
||||||
char *sigar_uitoa(char *buf, unsigned int n, int *len);
|
char *sigar_uitoa(char *buf, unsigned int n, int *len);
|
||||||
|
|
||||||
struct hostent *sigar_gethostbyname(const char *name);
|
struct hostent *sigar_gethostbyname(const char *name,
|
||||||
|
sigar_hostent_t *data);
|
||||||
|
|
||||||
SIGAR_INLINE char *sigar_skip_line(char *buffer, int buflen);
|
SIGAR_INLINE char *sigar_skip_line(char *buffer, int buflen);
|
||||||
|
|
||||||
|
|
45
src/sigar.c
45
src/sigar.c
|
@ -1547,34 +1547,26 @@ static int fqdn_ip_get(sigar_t *sigar, char *name)
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WIN32
|
struct hostent *sigar_gethostbyname(const char *name,
|
||||||
#else
|
sigar_hostent_t *data)
|
||||||
#include <netdb.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define GETHOSTBYNAME_LEN 512
|
|
||||||
#if defined(__hpux) || defined(_AIX)
|
|
||||||
#define HAS_HOSTENT_DATA
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct hostent *sigar_gethostbyname(const char *name)
|
|
||||||
{
|
{
|
||||||
char buffer[GETHOSTBYNAME_LEN];
|
struct hostent *hp = NULL;
|
||||||
struct hostent hs, *hp;
|
|
||||||
int err;
|
|
||||||
#if defined(HAS_HOSTENT_DATA)
|
|
||||||
struct hostent_data hd;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
gethostbyname_r(name, &hs, buffer, sizeof(buffer),
|
gethostbyname_r(name, &data->hs,
|
||||||
&hp, &err);
|
data->buffer, sizeof(data->buffer),
|
||||||
|
&hp, &data->error);
|
||||||
#elif defined(__sun)
|
#elif defined(__sun)
|
||||||
hp = gethostbyname_r(name, &hs, buffer, sizeof(buffer),
|
hp = gethostbyname_r(name, &data->hs,
|
||||||
&err);
|
data->buffer, sizeof(data->buffer),
|
||||||
#elif defined(HAS_HOSTENT_DATA)
|
&data->error);
|
||||||
gethostbyname_r(name, &hs, &hd);
|
#elif defined(SIGAR_HAS_HOSTENT_DATA)
|
||||||
hp = &hs;
|
if (gethostbyname_r(name, &data->hs, &data->hd) == 0) {
|
||||||
|
hp = &data->hs;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
data->error = h_errno;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
hp = gethostbyname(name);
|
hp = gethostbyname(name);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1593,6 +1585,7 @@ struct hostent *sigar_gethostbyname(const char *name)
|
||||||
|
|
||||||
SIGAR_DECLARE(int) sigar_fqdn_get(sigar_t *sigar, char *name, int namelen)
|
SIGAR_DECLARE(int) sigar_fqdn_get(sigar_t *sigar, char *name, int namelen)
|
||||||
{
|
{
|
||||||
|
sigar_hostent_t data;
|
||||||
struct hostent *p;
|
struct hostent *p;
|
||||||
char domain[SIGAR_FQDN_LEN + 1];
|
char domain[SIGAR_FQDN_LEN + 1];
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
@ -1618,7 +1611,7 @@ SIGAR_DECLARE(int) sigar_fqdn_get(sigar_t *sigar, char *name, int namelen)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX use _r versions of these functions. */
|
/* XXX use _r versions of these functions. */
|
||||||
if (!(p = sigar_gethostbyname(name))) {
|
if (!(p = sigar_gethostbyname(name, &data))) {
|
||||||
if (SIGAR_LOG_IS_DEBUG(sigar)) {
|
if (SIGAR_LOG_IS_DEBUG(sigar)) {
|
||||||
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
sigar_log_printf(sigar, SIGAR_LOG_DEBUG,
|
||||||
"[fqdn] gethostbyname(%s) failed: %s",
|
"[fqdn] gethostbyname(%s) failed: %s",
|
||||||
|
@ -1667,7 +1660,7 @@ SIGAR_DECLARE(int) sigar_fqdn_get(sigar_t *sigar, char *name, int namelen)
|
||||||
int i,j;
|
int i,j;
|
||||||
|
|
||||||
for (i=0; p->h_addr_list[i]; i++) {
|
for (i=0; p->h_addr_list[i]; i++) {
|
||||||
struct hostent *q =
|
struct hostent *q =
|
||||||
gethostbyaddr(p->h_addr_list[i],
|
gethostbyaddr(p->h_addr_list[i],
|
||||||
p->h_length,
|
p->h_length,
|
||||||
p->h_addrtype);
|
p->h_addrtype);
|
||||||
|
|
|
@ -496,12 +496,13 @@ int sigar_cpu_mhz_from_model(char *model)
|
||||||
static enum clnt_stat get_sockaddr(struct sockaddr_in *addr, char *host)
|
static enum clnt_stat get_sockaddr(struct sockaddr_in *addr, char *host)
|
||||||
{
|
{
|
||||||
register struct hostent *hp;
|
register struct hostent *hp;
|
||||||
|
sigar_hostent_t data;
|
||||||
|
|
||||||
memset(addr, 0, sizeof(struct sockaddr_in));
|
memset(addr, 0, sizeof(struct sockaddr_in));
|
||||||
addr->sin_family = AF_INET;
|
addr->sin_family = AF_INET;
|
||||||
|
|
||||||
if ((addr->sin_addr.s_addr = inet_addr(host)) == -1) {
|
if ((addr->sin_addr.s_addr = inet_addr(host)) == -1) {
|
||||||
if (!(hp = sigar_gethostbyname(host))) {
|
if (!(hp = sigar_gethostbyname(host, &data))) {
|
||||||
return RPC_UNKNOWNHOST;
|
return RPC_UNKNOWNHOST;
|
||||||
}
|
}
|
||||||
memcpy(&addr->sin_addr, hp->h_addr, hp->h_length);
|
memcpy(&addr->sin_addr, hp->h_addr, hp->h_length);
|
||||||
|
|
Loading…
Reference in New Issue