diff --git a/nx/source/runtime/devices/socket.c b/nx/source/runtime/devices/socket.c index 4a10ddf4..2f821416 100644 --- a/nx/source/runtime/devices/socket.c +++ b/nx/source/runtime/devices/socket.c @@ -1109,6 +1109,7 @@ static struct hostent *_socketDeserializeHostent(int *err, const void *out_he_se size_t name_size, total_aliases_size = 0; size_t nb_addresses; size_t nb_aliases = 0; + size_t nb_pos; size_t len; int addrtype, addrlen; @@ -1118,19 +1119,24 @@ static struct hostent *_socketDeserializeHostent(int *err, const void *out_he_se pos = buf; name_size = strlen(pos) + 1; pos += name_size; + + nb_aliases = ntohl(*(const u32 *)pos); + pos += 4; + pos_aliases = pos; - for(pos = buf, len = 1; len != 0; pos += len + 1) { - len = strlen(pos); - if(len != 0) - nb_aliases++; + + if(nb_aliases>0) { + for(nb_pos=0, len = 1; nb_poss_addr != 0; nb_addresses++); + pos += addrlen * nb_addresses; he = (struct hostent *)malloc( sizeof(struct hostent) @@ -1168,19 +1177,23 @@ static struct hostent *_socketDeserializeHostent(int *err, const void *out_he_se memcpy(he->h_name, buf, name_size); } - char *alias = (char *)(he->h_addr_list + nb_addresses + 1); - memcpy(alias, pos_aliases, total_aliases_size); - for(size_t i = 0; i < nb_aliases; i++) { - he->h_aliases[i] = alias; - alias += strlen(alias) + 1; + if(nb_aliases>0) { + char *alias = (char *)(he->h_addr_list + nb_addresses + 1); + memcpy(alias, pos_aliases, total_aliases_size); + for(size_t i = 0; i < nb_aliases; i++) { + he->h_aliases[i] = alias; + alias += strlen(alias) + 1; + } } he->h_aliases[nb_aliases] = NULL; - struct in_addr *addresses = (struct in_addr *)(he->h_addr_list + nb_addresses + 1 + total_aliases_size); - memcpy(addresses, pos_addresses, addrlen * nb_addresses); - for(size_t i = 0; i < nb_addresses; i++) { - he->h_addr_list[i] = (char *)&addresses[i]; - addresses[i].s_addr = ntohl(addresses[i].s_addr); // lol Nintendo + if(nb_addresses>0) { + struct in_addr *addresses = (struct in_addr *)(he->h_addr_list + nb_addresses + 1 + total_aliases_size); + memcpy(addresses, pos_addresses, addrlen * nb_addresses); + for(size_t i = 0; i < nb_addresses; i++) { + he->h_addr_list[i] = (char *)&addresses[i]; + addresses[i].s_addr = ntohl(addresses[i].s_addr); // lol Nintendo + } } he->h_addr_list[nb_addresses] = NULL;