mirror of
https://github.com/nmap/nmap.git
synced 2026-08-27 20:05:30 +00:00
Try to use the correct sockaddr size when setting source. See #3438
This commit is contained in:
parent
3ca969ce85
commit
84420aa300
5 changed files with 58 additions and 6 deletions
15
NmapOps.cc
15
NmapOps.cc
|
|
@ -170,9 +170,22 @@ const struct sockaddr_storage *NmapOps::SourceSockAddr() const {
|
|||
|
||||
/* Note that it is OK to pass in a sockaddr_in or sockaddr_in6 casted
|
||||
to sockaddr_storage */
|
||||
void NmapOps::setSourceSockAddr(struct sockaddr_storage *ss, size_t ss_len) {
|
||||
void NmapOps::setSourceSockAddr(const struct sockaddr_storage *ss, size_t ss_len) {
|
||||
assert(ss_len > 0 && ss_len <= sizeof(*ss));
|
||||
memcpy(&sourcesock, ss, ss_len);
|
||||
if (ss_len == sizeof(*ss)) {
|
||||
#if HAVE_SOCKADDR_SA_LEN
|
||||
if (((const struct sockaddr *)ss)->sa_len > 0) {
|
||||
ss_len = ((const struct sockaddr *)ss)->sa_len;
|
||||
} else
|
||||
#endif
|
||||
if (ss->ss_family == AF_INET) {
|
||||
ss_len = sizeof(struct sockaddr_in);
|
||||
}
|
||||
else if (ss->ss_family == AF_INET6) {
|
||||
ss_len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
}
|
||||
sourcesocklen = ss_len;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ class NmapOps {
|
|||
const struct sockaddr_storage *SourceSockAddr() const;
|
||||
/* Note that it is OK to pass in a sockaddr_in or sockaddr_in6 casted
|
||||
to sockaddr_storage */
|
||||
void setSourceSockAddr(struct sockaddr_storage *ss, size_t ss_len);
|
||||
void setSourceSockAddr(const struct sockaddr_storage *ss, size_t ss_len);
|
||||
|
||||
// The time this obj. was instantiated or last ReInit()ed.
|
||||
const struct timeval *getStartTime() { return &start_time; }
|
||||
|
|
|
|||
13
Target.cc
13
Target.cc
|
|
@ -284,6 +284,19 @@ const struct sockaddr_storage *Target::SourceSockAddr() const {
|
|||
void Target::setSourceSockAddr(const struct sockaddr_storage *ss, size_t ss_len) {
|
||||
assert(ss_len > 0 && ss_len <= sizeof(*ss));
|
||||
memcpy(&sourcesock, ss, ss_len);
|
||||
if (ss_len == sizeof(*ss)) {
|
||||
#ifdef HAVE_SOCKADDR_SA_LEN
|
||||
if (((const struct sockaddr *)ss)->sa_len > 0) {
|
||||
ss_len = ((const struct sockaddr *)ss)->sa_len;
|
||||
} else
|
||||
#endif
|
||||
if (ss->ss_family == AF_INET) {
|
||||
ss_len = sizeof(struct sockaddr_in);
|
||||
}
|
||||
else if (ss->ss_family == AF_INET6) {
|
||||
ss_len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
}
|
||||
sourcesocklen = ss_len;
|
||||
GenerateSourceIPString();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -260,9 +260,22 @@ int NpingTarget::getSourceSockAddr(struct sockaddr_storage *ss, size_t *ss_len)
|
|||
/** Set source address used to reach the target.
|
||||
* Note that it is OK to pass in a sockaddr_in or sockaddr_in6 casted
|
||||
* to sockaddr_storage */
|
||||
int NpingTarget::setSourceSockAddr(struct sockaddr_storage *ss, size_t ss_len) {
|
||||
int NpingTarget::setSourceSockAddr(const struct sockaddr_storage *ss, size_t ss_len) {
|
||||
assert(ss_len > 0 && ss_len <= sizeof(*ss));
|
||||
memcpy(&sourcesock, ss, ss_len);
|
||||
if (ss_len == sizeof(*ss)) {
|
||||
#ifdef HAVE_SOCKADDR_SA_LEN
|
||||
if (((const struct sockaddr *)ss)->sa_len > 0) {
|
||||
ss_len = ((const struct sockaddr *)ss)->sa_len;
|
||||
} else
|
||||
#endif
|
||||
if (ss->ss_family == AF_INET) {
|
||||
ss_len = sizeof(struct sockaddr_in);
|
||||
}
|
||||
else if (ss->ss_family == AF_INET6) {
|
||||
ss_len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
}
|
||||
sourcesocklen = ss_len;
|
||||
return OP_SUCCESS;
|
||||
} /* End of setSourceSockAddr() */
|
||||
|
|
@ -271,9 +284,22 @@ int NpingTarget::setSourceSockAddr(struct sockaddr_storage *ss, size_t ss_len) {
|
|||
/** Set source address used to reach the target.
|
||||
* Note that it is OK to pass in a sockaddr_in or sockaddr_in6 casted
|
||||
* to sockaddr_storage */
|
||||
int NpingTarget::setSpoofedSourceSockAddr(struct sockaddr_storage *ss, size_t ss_len) {
|
||||
int NpingTarget::setSpoofedSourceSockAddr(const struct sockaddr_storage *ss, size_t ss_len) {
|
||||
assert(ss_len > 0 && ss_len <= sizeof(*ss));
|
||||
memcpy(&spoofedsrcsock, ss, ss_len);
|
||||
if (ss_len == sizeof(*ss)) {
|
||||
#ifdef HAVE_SOCKADDR_SA_LEN
|
||||
if (((const struct sockaddr *)ss)->sa_len > 0) {
|
||||
ss_len = ((const struct sockaddr *)ss)->sa_len;
|
||||
} else
|
||||
#endif
|
||||
if (ss->ss_family == AF_INET) {
|
||||
ss_len = sizeof(struct sockaddr_in);
|
||||
}
|
||||
else if (ss->ss_family == AF_INET6) {
|
||||
ss_len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
}
|
||||
spoofedsrcsocklen = ss_len;
|
||||
this->spoofedsrc_set=true;
|
||||
return OP_SUCCESS;
|
||||
|
|
|
|||
|
|
@ -144,9 +144,9 @@ class NpingTarget {
|
|||
|
||||
/* Source address used to reach the target */
|
||||
int getSourceSockAddr(struct sockaddr_storage *ss, size_t *ss_len);
|
||||
int setSourceSockAddr(struct sockaddr_storage *ss, size_t ss_len);
|
||||
int setSourceSockAddr(const struct sockaddr_storage *ss, size_t ss_len);
|
||||
int getSpoofedSourceSockAddr(struct sockaddr_storage *ss, size_t *ss_len);
|
||||
int setSpoofedSourceSockAddr(struct sockaddr_storage *ss, size_t ss_len);
|
||||
int setSpoofedSourceSockAddr(const struct sockaddr_storage *ss, size_t ss_len);
|
||||
bool spoofingSourceAddress();
|
||||
struct in_addr getIPv4SourceAddress();
|
||||
const struct in_addr *getIPv4SourceAddress_aux();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue