Use SILC_SWAB_16 instead of htons with ports in server.
* Fixed a double free in INVITE command error handling in
server. Affected file silcd/command.c.
+ * Added macros SILC_SWAB_[16|32] to swab byte order of
+ 16-bit and 32-bit unsigned integers. Affected file
+ lib/silcutil/silctypes.h.
+
+ * Use the SILC_SWAB_16 instead of htons() in server when
+ handling ports since the ports in structures are always
+ in little-endian order (regardless of platform). Affected
+ file silcd/serverid.c and silcd/server_backup.c.
+
Tue Jan 21 17:18:04 EET 2003 Pekka Riikonen <priikone@silcnet.org>
* Send DISCONNECT in close admin command in server. Affected
if (sock && ((sock->hostname && !strcasecmp(sock->hostname, hostname)) ||
(sock->ip && !strcasecmp(sock->ip, hostname)))
- && server->id->port == htons(port))
+ && server->id->port == SILC_SWAB_16(port))
break;
id_cache = NULL;
if (!server->backup->servers[i].server) {
server->backup->servers[i].server = backup_server;
server->backup->servers[i].local = local;
- server->backup->servers[i].port = htons(port);
+ server->backup->servers[i].port = SILC_SWAB_16(port);
memset(server->backup->servers[i].ip.data, 0,
sizeof(server->backup->servers[i].ip.data));
silc_net_addr2bin(ip, server->backup->servers[i].ip.data,
(i + 1));
server->backup->servers[i].server = backup_server;
server->backup->servers[i].local = local;
- server->backup->servers[i].port = htons(port);
+ server->backup->servers[i].port = SILC_SWAB_16(port);
memset(server->backup->servers[i].ip.data, 0,
sizeof(server->backup->servers[i].ip.data));
silc_net_addr2bin(ip, server->backup->servers[i].ip.data,
}
(*new_id)->ip.data_len = silc_net_is_ip4(ip) ? 4 : 16;
- (*new_id)->port = htons(port);
+ (*new_id)->port = SILC_SWAB_16(port);
(*new_id)->rnd = silc_rng_get_rn16(rng);
SILC_LOG_DEBUG(("New ID (%s)", silc_id_render(*new_id, SILC_ID_SERVER)));
/* Macros */
-#define GET_WORD(cp) ((SilcUInt32)(SilcUInt8)(cp)[0]) << 24 \
- | ((SilcUInt32)(SilcUInt8)(cp)[1] << 16) \
- | ((SilcUInt32)(SilcUInt8)(cp)[2] << 8) \
+#define SILC_GET_WORD(cp) ((SilcUInt32)(SilcUInt8)(cp)[0]) << 24 \
+ | ((SilcUInt32)(SilcUInt8)(cp)[1] << 16) \
+ | ((SilcUInt32)(SilcUInt8)(cp)[2] << 8) \
| ((SilcUInt32)(SilcUInt8)(cp)[3])
/****d* silcutil/SILCTypes/SILC_GET16_MSB
*
* SOURCE
*/
-#define SILC_GET64_MSB(l, cp) \
-do { \
- (l) = ((((SilcUInt64)GET_WORD((cp))) << 32) | \
- ((SilcUInt64)GET_WORD((cp) + 4))); \
+#define SILC_GET64_MSB(l, cp) \
+do { \
+ (l) = ((((SilcUInt64)SILC_GET_WORD((cp))) << 32) | \
+ ((SilcUInt64)SILC_GET_WORD((cp) + 4))); \
} while(0)
/***/
} while(0)
/***/
+/****d* silcutil/SILCTypes/SILC_SWAB_16
+ *
+ * NAME
+ *
+ * #define SILC_SWAB_16 ...
+ *
+ * DESCRIPTION
+ *
+ * Swabs 16-bit unsigned integer byte order.
+ *
+ * SOURCE
+ */
+#define SILC_SWAB_16(l) \
+ ((SilcUInt16)(((SilcUInt16)(l) & (SilcUInt16)0x00FFU) << 8) | \
+ (((SilcUInt16)(l) & (SilcUInt16)0xFF00U) >> 8))
+/***/
+
+/****d* silcutil/SILCTypes/SILC_SWAB_32
+ *
+ * NAME
+ *
+ * #define SILC_SWAB_32 ...
+ *
+ * DESCRIPTION
+ *
+ * Swabs 32-bit unsigned integer byte order.
+ *
+ * SOURCE
+ */
+#define SILC_SWAB_32(l) \
+ ((SilcUInt32)(((SilcUInt32)(l) & (SilcUInt32)0x000000FFUL) << 24) | \
+ (((SilcUInt32)(l) & (SilcUInt32)0x0000FF00UL) << 8) | \
+ (((SilcUInt32)(l) & (SilcUInt32)0x00FF0000UL) >> 8) | \
+ (((SilcUInt32)(l) & (SilcUInt32)0xFF000000UL) >> 24))
+/***/
+
#endif /* SILCTYPES_H */