Author: cazfi Date: Wed Mar 11 18:47:48 2015 New Revision: 28490 URL: http://svn.gna.org/viewcvs/freeciv?rev=28490&view=rev Log: Corrected handling of json protocol incoming buffer with multiple packets.
See patch #5913 Modified: trunk/common/packets_json.c Modified: trunk/common/packets_json.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/common/packets_json.c?rev=28490&r1=28489&r2=28490&view=diff ============================================================================== --- trunk/common/packets_json.c (original) +++ trunk/common/packets_json.c Wed Mar 11 18:47:48 2015 @@ -316,23 +316,27 @@ * At this point the packet is a plain uncompressed one. These have * to have to be at least the header bytes in size. */ - if (whole_packet_len < (data_type_size(pc->packet_header.length) - + data_type_size(pc->packet_header.type))) { + if (whole_packet_len < (data_type_size(pc->packet_header.length))) { log_verbose("The packet stream is corrupt. The connection " "will be closed now."); connection_close(pc, _("decoding error")); return NULL; } - /* Parse JSON packet. */ - - pc->json_packet = json_loadb((char*)pc->buffer->data + 2, whole_packet_len, 0, &error); - - memmove(pc->buffer->data, pc->buffer->data, pc->buffer->ndata); - pc->buffer->ndata = 0; - + /* Parse JSON packet. Note that json string has '\0' */ + pc->json_packet = json_loadb((char*)pc->buffer->data + 2, whole_packet_len - 3, 0, &error); + + /* Log errors before we scrap the data */ if (!pc->json_packet) { log_error("ERROR: Unable to parse packet: %s", pc->buffer->data + 2); + log_error("%s", error.text); + } + + /* Shift remaining data to the front */ + pc->buffer->ndata -= whole_packet_len; + memmove(pc->buffer->data, pc->buffer->data + whole_packet_len, pc->buffer->ndata); + + if (!pc->json_packet) { return NULL; } _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits