diff --git a/lib/client-parser.c b/lib/client-parser.c
index 67330565..76f69f06 100644
--- a/lib/client-parser.c
+++ b/lib/client-parser.c
@@ -302,21 +302,6 @@ spill:
 				goto ping_drop;
 			}
 
-			/* if existing buffer is too small, drop it */
-			if (wsi->u.ws.ping_payload_buf &&
-			    wsi->u.ws.ping_payload_alloc <
-			    wsi->u.ws.rx_user_buffer_head)
-				lws_free_set_NULL(wsi->u.ws.ping_payload_buf);
-
-			/* if no buffer, allocate it */
-			if (!wsi->u.ws.ping_payload_buf) {
-				wsi->u.ws.ping_payload_buf =
-					lws_malloc(wsi->u.ws.rx_user_buffer_head +
-						   LWS_SEND_BUFFER_PRE_PADDING);
-				wsi->u.ws.ping_payload_alloc =
-					wsi->u.ws.rx_user_buffer_head;
-			}
-
 			/* stash the pong payload */
 			memcpy(wsi->u.ws.ping_payload_buf + LWS_SEND_BUFFER_PRE_PADDING,
 			       &wsi->u.ws.rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING],
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index 4035121b..6e63e8ec 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -234,12 +234,8 @@ just_kill_connection:
 			/* not going to be completed... nuke it */
 			lws_free_set_NULL(wsi->trunc_alloc);
 
-		if (wsi->u.ws.ping_payload_buf) {
-			lws_free_set_NULL(wsi->u.ws.ping_payload_buf);
-			wsi->u.ws.ping_payload_alloc = 0;
-			wsi->u.ws.ping_payload_len = 0;
-			wsi->u.ws.ping_pending_flag = 0;
-		}
+		wsi->u.ws.ping_payload_len = 0;
+		wsi->u.ws.ping_pending_flag = 0;
 	}
 
 	/* tell the user it's all over for this guy */
diff --git a/lib/parsers.c b/lib/parsers.c
index 18037d0d..e1de3804 100644
--- a/lib/parsers.c
+++ b/lib/parsers.c
@@ -964,19 +964,6 @@ process_as_ping:
 				goto ping_drop;
 			}
 
-			/* if existing buffer is too small, drop it */
-			if (wsi->u.ws.ping_payload_buf &&
-			    wsi->u.ws.ping_payload_alloc < wsi->u.ws.rx_user_buffer_head) {
-				lws_free_set_NULL(wsi->u.ws.ping_payload_buf);
-			}
-
-			/* if no buffer, allocate it */
-			if (!wsi->u.ws.ping_payload_buf) {
-				wsi->u.ws.ping_payload_buf = lws_malloc(wsi->u.ws.rx_user_buffer_head
-									+ LWS_SEND_BUFFER_PRE_PADDING);
-				wsi->u.ws.ping_payload_alloc = wsi->u.ws.rx_user_buffer_head;
-			}
-
 			/* stash the pong payload */
 			memcpy(wsi->u.ws.ping_payload_buf + LWS_SEND_BUFFER_PRE_PADDING,
 			       &wsi->u.ws.rx_user_buffer[LWS_SEND_BUFFER_PRE_PADDING],
diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index 731deb23..b8a9dceb 100644
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -831,11 +831,10 @@ struct _lws_websocket_related {
 	unsigned int inside_frame:1; /* next write will be more of frame */
 	unsigned int clean_buffer:1; /* buffer not rewritten by extension */
 	unsigned int payload_is_close:1; /* process as PONG, but it is close */
+	unsigned int ping_pending_flag:1;
 
-	unsigned char *ping_payload_buf; /* non-NULL if malloc'd */
-	unsigned int ping_payload_alloc; /* length malloc'd */
-	unsigned int ping_payload_len;
-	unsigned char ping_pending_flag;
+	unsigned char ping_payload_buf[128 - 4]; /* control opc == < 124 */
+	unsigned char ping_payload_len;
 };
 
 struct lws {