weak implementation of threads has problems - kse fix attached

Dan Nelson dnelson at allantgroup.com
Tue Jun 8 15:45:12 GMT 2004


In the last episode (Jun 08), Kris Kennaway said:
> On Mon, Jun 07, 2004 at 11:48:45PM -0500, Dan Nelson wrote:
> > In the last episode (Jun 08), Daniel Eischen said:
> > > No, I don't want to litter all our thread libraries with strong
> > > references. As I've said before, build your shared libraries
> > > correctly so they don't bring in the threads library.
> > 
> > A good addition to bsd.port.mk, right next to the "possible network
> > server" etc checks, might be to run ldd on all installed shared
> > libraries and print a warning if any threads libraries show up.  There
> > are a huge number of ports that install shlibs linked to libpthreads.
> 
> Some of these are probably correct, in that the library started using
> libpthreads internally and there are a large number of clients that
> would otherwise need to be changed to link to that library.

I don't think you can have it both ways, though.  The rule is either
"pthreads-using shared libraries should pull in a pthreads lib
themselves" or "programs wanting to link to pthreads-using shared
libraries should link with a pthreads lib".

Attached are patches to add this check to the security-check target. 
Ideally they would be checked separately or flagged as something other
than security problems, but that would require copying
security-check.awk and a larger diff..

-- 
	Dan Nelson
	dnelson at allantgroup.com
-------------- next part --------------
Index: Mk/bsd.port.mk
===================================================================
RCS file: /home/ncvs/ports/Mk/bsd.port.mk,v
retrieving revision 1.490
diff -u -r1.490 bsd.port.mk
--- Mk/bsd.port.mk	31 May 2004 18:07:57 -0000	1.490
+++ Mk/bsd.port.mk	8 Jun 2004 14:59:04 -0000
@@ -3334,10 +3334,11 @@
 #   1.  setugid files
 #   2.  accept()/recvfrom() which indicates network listening capability
 #   3.  insecure functions (gets/mktemp/tempnam/[XXX])
-#   4.  startup scripts, in conjunction with 2.
-#   5.  world-writable files/dirs
+#   4.  shared libs linked directly to pthreads libs
+#   5.  startup scripts, in conjunction with 2.
+#   6.  world-writable files/dirs
 #
-	-@${RM} -f ${WRKDIR}/.PLIST.setuid ${WRKDIR}/.PLIST.writable ${WRKDIR}/.PLIST.objdump; \
+	-@${RM} -f ${WRKDIR}/.PLIST.setuid ${WRKDIR}/.PLIST.writable ${WRKDIR}/.PLIST.objdump ${WRKDIR}/.PLIST.ldd; \
 	${AWK} -v prefix='${PREFIX}' ' \
 		match($$0, /^@cwd /) { prefix = substr($$0, RSTART + RLENGTH); next; } \
 		/^@/ { next; } \
@@ -3351,9 +3352,12 @@
 	${TR} '\n' '\0' < ${WRKDIR}/.PLIST.flattened \
 	| ${XARGS} -0 -J % ${FIND} % -prune ! -type l -type f -print0 2> /dev/null \
 	| ${XARGS} -0 -n 1 /usr/bin/objdump -R 2> /dev/null > ${WRKDIR}/.PLIST.objdump; \
+	${GREP} '\.so' < ${WRKDIR}/.PLIST.flattened | ${TR} '\n' '\0' \
+	| ${XARGS} -0 -J % ${FIND} % -prune ! -type l -type f -print0 2> /dev/null \
+	| ${XARGS} -0 -n 1 /usr/bin/ldd -a 2> /dev/null > ${WRKDIR}/.PLIST.ldd; \
 	if \
 		! ${AWK} -v audit="$${PORTS_AUDIT}" -f ${PORTSDIR}/Tools/scripts/security-check.awk \
-		  ${WRKDIR}/.PLIST.flattened ${WRKDIR}/.PLIST.objdump ${WRKDIR}/.PLIST.setuid ${WRKDIR}/.PLIST.writable; \
+		  ${WRKDIR}/.PLIST.flattened ${WRKDIR}/.PLIST.objdump ${WRKDIR}/.PLIST.ldd ${WRKDIR}/.PLIST.setuid ${WRKDIR}/.PLIST.writable; \
 	then \
 		www_site=$$(cd ${.CURDIR} && ${MAKE} ${__softMAKEFLAGS} www-site); \
 	    if [ ! -z "$${www_site}" ]; then \
Index: Tools/scripts/security-check.awk
===================================================================
RCS file: /home/ncvs/ports/Tools/scripts/security-check.awk,v
retrieving revision 1.1
diff -u -r1.1 security-check.awk
--- Tools/scripts/security-check.awk	19 Jan 2004 22:19:00 -0000	1.1
+++ Tools/scripts/security-check.awk	8 Jun 2004 14:38:09 -0000
@@ -9,6 +9,7 @@
 	split("", setuid_binaries);
 	split("", writable_files);
 	split("", startup_scripts);
+	split("", pthreads_libs);
 	header_printed = 0;
 }
 FILENAME ~ /\.flattened$/ {
@@ -18,7 +19,6 @@
 FILENAME ~ /\.objdump$/ {
 	if (match($0, /: +file format [^ ]+$/)) {
 		file = substr($0, 1, RSTART - 1);
-		stupid_functions = "";
 		next;
 	}
 	if (file == "")
@@ -29,6 +29,16 @@
 	if ($3 ~ /^(accept|recvfrom)$/)
 		network_binaries[file] = 1;
 }
+FILENAME ~ /\.ldd$/ {
+	if (match($0, /:$/)) {
+		file = substr($0, 1, RSTART - 1);
+		next;
+	}
+	if (file == "")
+		next;
+	if ($1 ~ /^(libc_r|libpthread|libthr).so/)
+		pthreads_libs[file] = $3;
+}
 FILENAME ~ /\.setuid$/ { setuid_binaries[$0] = 1; }
 FILENAME ~ /\.writable$/ { writable_files[$0] = 1; }
 function print_header() {
@@ -79,6 +89,20 @@
 		if (note_printed)
 			print "";
 	}
+
+	note_printed = 0;
+	for (file in pthreads_libs) {
+		if (!note_printed) {
+			print_header();
+			print "      This port has installed the following shared libraries which are";
+			print "      incorrectly linked to a pthreads shared library.";
+			note_printed = 1;
+		}
+		printf "%s (linked to %s)\n", file, pthreads_libs[file];
+	}
+	if (note_printed)
+		print "";
+
 	note_printed = 0;
 	for (file in writable_files) {
 		if (!note_printed) {


More information about the freebsd-amd64 mailing list