--- 0.8.7e/ping.c 2009-06-28 21:45:02.000000000 -0400
+++ ../branches/0.8.7/ping.c 2009-08-18 20:51:30.000000000 -0400
@@ -890,7 +890,7 @@
return(cleaned_hostname);
}
-/*! \fn unsigned short get_checksum(void* buf, int len)
+/*! \fn unsigned short int get_checksum(void* buf, int len)
* \brief calculates a 16bit checksum of a packet buffer
* \param buf the input buffer to calculate the checksum of
* \param len the size of the input buffer
@@ -898,11 +898,12 @@
* \return 16bit checksum of an input buffer of size len.
*
*/
-unsigned short get_checksum(void* buf, int len) {
+unsigned short int get_checksum(void* buf, int len) {
int nleft = len;
int32_t sum = 0;
- unsigned short answer;
- unsigned short* w = (unsigned short*)buf;
+ unsigned short int answer;
+ unsigned short int* w = (unsigned short int*)buf;
+ unsigned short int odd_byte = 0;
while (nleft > 1) {
sum += *w++;
@@ -910,7 +911,8 @@
}
if (nleft == 1) {
- sum += *(unsigned char*)w;
+ *(unsigned char*)(&odd_byte) = *(unsigned char*)w;
+ sum += odd_byte;
}
sum = (sum >> 16) + (sum & 0xffff);
--- 0.8.7e/ping.h 2009-06-28 21:45:02.000000000 -0400
+++ ../branches/0.8.7/ping.h 2009-08-18 20:51:30.000000000 -0400
@@ -142,4 +142,4 @@
extern char *remove_tcp_udp_from_hostname(char *hostname);
extern void update_host_status(int status, host_t *host, ping_t *ping, int availability_method);
extern int init_sockaddr(struct sockaddr_in *name, const char *hostname, unsigned short int port);
-extern unsigned short get_checksum(void* buf, int len);
+extern unsigned short int get_checksum(void* buf, int len);