Sfoglia il codice sorgente

Merge pull request #29 from bgreat/master

Correct bad mask flag/opcode passing to callback
sunsetbrew 11 anni fa
parent
commit
5364d8a070
1 ha cambiato i file con 4 aggiunte e 1 eliminazioni
  1. 4 1
      src/civetweb.c

+ 4 - 1
src/civetweb.c

@@ -4365,6 +4365,7 @@ static void read_websocket(struct mg_connection *conn)
        dynamically allocated buffer if it is too large. */
     char mem[4096];
     char *data = mem;
+    unsigned char mop;  /* mask flag and opcode */
 
     /* Loop continuously, reading messages from the socket, invoking the
        callback, and waiting repeatedly until an error occurs. */
@@ -4411,6 +4412,7 @@ static void read_websocket(struct mg_connection *conn)
                data and advance the queue by moving the memory in place. */
             assert(body_len >= header_len);
             if (data_len + header_len > body_len) {
+                mop = buf[0];   /* current mask and opcode */
                 /* Overflow case */
                 len = body_len - header_len;
                 memcpy(data, buf + header_len, len);
@@ -4418,6 +4420,7 @@ static void read_websocket(struct mg_connection *conn)
                 pull(NULL, conn, data + len, (int)(data_len - len));
                 conn->data_len = 0;
             } else {
+                mop = buf[0];   /* current mask and opcode, overwritten by memmove() */
                 /* Length of the message being read at the front of the
                    queue */
                 len = data_len + header_len;
@@ -4443,7 +4446,7 @@ static void read_websocket(struct mg_connection *conn)
             /* Exit the loop if callback signalled to exit,
                or "connection close" opcode received. */
             if ((conn->ctx->callbacks.websocket_data != NULL &&
-                 !conn->ctx->callbacks.websocket_data(conn, buf[0], data, data_len)) ||
+                 !conn->ctx->callbacks.websocket_data(conn, mop, data, data_len)) ||
                 (buf[0] & 0xf) == WEBSOCKET_OPCODE_CONNECTION_CLOSE) {  /* Opcode == 8, connection close */
                 break;
             }