Try to use the correct sockaddr size when setting source. See #3438

This commit is contained in:
dmiller 2026-08-21 01:14:28 +00:00
parent 3ca969ce85
commit 84420aa300
5 changed files with 58 additions and 6 deletions

View file

@ -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;
}

View file

@ -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; }

View file

@ -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();
}

View file

@ -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;

View file

@ -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();