Преглед изворни кода

vqsim: Check length of received message

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
Jan Friesse пре 6 година
родитељ
комит
7267149e05
1 измењених фајлова са 13 додато и 3 уклоњено
  1. 13 3
      vqsim/vqmain.c

+ 13 - 3
vqsim/vqmain.c

@@ -222,13 +222,23 @@ static int vq_parent_read_fn(int32_t fd, int32_t revents, void *data)
 		msglen = read(fd, msgbuf, sizeof(msgbuf));
 		msglen = read(fd, msgbuf, sizeof(msgbuf));
 		if (msglen < 0) {
 		if (msglen < 0) {
 			perror("read failed");
 			perror("read failed");
-		}
-
-		if (msglen > 0) {
+		} else if (msglen < sizeof(*msg)) {
+			fprintf(stderr, "Received message is too short\n");
+		} else {
 			msg = (void*)msgbuf;
 			msg = (void*)msgbuf;
 			switch (msg->type) {
 			switch (msg->type) {
 			case VQMSG_QUORUM:
 			case VQMSG_QUORUM:
 				qmsg = (void*)msgbuf;
 				qmsg = (void*)msgbuf;
+				/*
+				 * Check length of message.
+				 * SOCK_SEQPACKET is used so this check is not strictly needed.
+				 */
+				if (msglen < sizeof(*qmsg) ||
+				    qmsg->view_list_entries > MAX_NODES ||
+				    msglen < sizeof(*qmsg) + sizeof(qmsg->view_list[0]) * qmsg->view_list_entries) {
+					fprintf(stderr, "Received quorum message is too short or corrupted\n");
+					return (0);
+				}
 				save_quorum_state(vqn, qmsg);
 				save_quorum_state(vqn, qmsg);
 				if (!sync_cmds) {
 				if (!sync_cmds) {
 					print_quorum_state(vqn);
 					print_quorum_state(vqn);