Fix strict aliasing violation in phpdbg

By explicitly computing the message length from bytes. This also
makes sure that the length is interpreted in an endianness-independent
manner.
This commit is contained in:
Nikita Popov 2019-04-12 16:46:23 +02:00
parent 4cfa4fb55d
commit 3c23084cf6
2 changed files with 14 additions and 10 deletions

View File

@ -174,7 +174,7 @@ static char **php_xsl_xslt_make_params(HashTable *parht, int xpath_params)
static void xsl_ext_function_php(xmlXPathParserContextPtr ctxt, int nargs, int type) /* {{{ */
{
xsltTransformContextPtr tctxt;
zval *args;
zval *args = NULL;
zval retval;
int result, i;
int error = 0;

View File

@ -379,21 +379,25 @@ PHPDBG_COMMAND(wait) /* {{{ */
return FAILURE;
}
char msglen[5];
int recvd = 4;
unsigned char msglen_buf[4];
int needed = 4;
do {
recvd -= recv(sr, &(msglen[4 - recvd]), recvd, 0);
} while (recvd > 0);
needed -= recv(sr, &msglen_buf[4 - needed], needed, 0);
} while (needed > 0);
recvd = *(size_t *) msglen;
char *data = emalloc(recvd);
uint32_t msglen = (msglen_buf[3] << 24)
| (msglen_buf[2] << 16)
| (msglen_buf[1] << 8)
| (msglen_buf[0] << 0);
char *data = emalloc(msglen);
needed = msglen;
do {
recvd -= recv(sr, &(data[(*(int *) msglen) - recvd]), recvd, 0);
} while (recvd > 0);
needed -= recv(sr, &(data[msglen - needed]), needed, 0);
} while (needed > 0);
phpdbg_webdata_decompress(data, *(int *) msglen);
phpdbg_webdata_decompress(data, msglen);
if (PHPDBG_G(socket_fd) != -1) {
close(PHPDBG_G(socket_fd));