Module Name:    src
Committed By:   christos
Date:           Wed May 27 22:37:13 UTC 2015

Modified Files:
        src/external/bsd/blacklist/lib: bl.c

Log Message:
Make sure that we get the socket messages we expect, otherwise return NULL.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/external/bsd/blacklist/lib/bl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/blacklist/lib/bl.c
diff -u src/external/bsd/blacklist/lib/bl.c:1.24 src/external/bsd/blacklist/lib/bl.c:1.25
--- src/external/bsd/blacklist/lib/bl.c:1.24	Mon Feb  2 20:22:08 2015
+++ src/external/bsd/blacklist/lib/bl.c	Wed May 27 18:37:13 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: bl.c,v 1.24 2015/02/03 01:22:08 christos Exp $	*/
+/*	$NetBSD: bl.c,v 1.25 2015/05/27 22:37:13 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: bl.c,v 1.24 2015/02/03 01:22:08 christos Exp $");
+__RCSID("$NetBSD: bl.c,v 1.25 2015/05/27 22:37:13 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -199,6 +199,7 @@ bl_init(bl_t b, bool srv)
 	}
 
 	b->b_connected = 0;
+#define GOT_FD		1
 #if defined(LOCAL_CREDS)
 #define CRED_LEVEL	0
 #define	CRED_NAME	LOCAL_CREDS
@@ -207,6 +208,7 @@ bl_init(bl_t b, bool srv)
 #define CRED_MESSAGE	SCM_CREDS
 #define CRED_SIZE	SOCKCREDSIZE(NGROUPS_MAX)
 #define CRED_TYPE	struct sockcred
+#define GOT_CRED	2
 #elif defined(SO_PASSCRED)
 #define CRED_LEVEL	SOL_SOCKET
 #define	CRED_NAME	SO_PASSCRED
@@ -215,7 +217,9 @@ bl_init(bl_t b, bool srv)
 #define CRED_MESSAGE	SCM_CREDENTIALS
 #define CRED_SIZE	sizeof(struct ucred)
 #define CRED_TYPE	struct ucred
+#define GOT_CRED	2
 #else
+#define GOT_CRED	0
 /*
  * getpeereid() and LOCAL_PEERCRED don't help here
  * because we are not a stream socket!
@@ -395,9 +399,13 @@ bl_recv(bl_t b)
 		bl_message_t bl;
 		char buf[512];
 	} ub;
+	int got;
 	ssize_t rlen;
 	bl_info_t *bi = &b->b_info;
 
+	got = 0;
+	memset(bi, 0, sizeof(*bi));
+
 	iov.iov_base = ub.buf;
 	iov.iov_len = sizeof(ub);
 
@@ -433,12 +441,14 @@ bl_recv(bl_t b)
 				continue;
 			}
 			memcpy(&bi->bi_fd, CMSG_DATA(cmsg), sizeof(bi->bi_fd));
+			got |= GOT_FD;
 			break;
 #ifdef CRED_MESSAGE
 		case CRED_MESSAGE:
 			sc = (void *)CMSG_DATA(cmsg);
 			bi->bi_uid = sc->CRED_SC_UID;
 			bi->bi_gid = sc->CRED_SC_GID;
+			got |= GOT_CRED;
 			break;
 #endif
 		default:
@@ -450,6 +460,16 @@ bl_recv(bl_t b)
 
 	}
 
+	if (got != (GOT_CRED|GOT_FD)) {
+		bl_log(b->b_fun, LOG_ERR, "message missing %s %s", 
+#if GOT_CRED != 0
+		    (got & GOT_CRED) == 0 ? "cred" :
+#endif
+		    "", (got & GOT_FD) == 0 ? "fd" : "");
+			
+		return NULL;
+	}
+
 	if ((size_t)rlen <= sizeof(ub.bl)) {
 		bl_log(b->b_fun, LOG_ERR, "message too short %zd", rlen);
 		return NULL;
@@ -463,10 +483,6 @@ bl_recv(bl_t b)
 	bi->bi_type = ub.bl.bl_type;
 	bi->bi_slen = ub.bl.bl_salen;
 	bi->bi_ss = ub.bl.bl_ss;
-#ifndef CRED_MESSAGE
-	bi->bi_uid = -1;
-	bi->bi_gid = -1;
-#endif
 	strlcpy(bi->bi_msg, ub.bl.bl_data, MIN(sizeof(bi->bi_msg),
 	    ((size_t)rlen - sizeof(ub.bl) + 1)));
 	return bi;

Reply via email to