* Matthias Kilian <[email protected]> [2009-04-05 13:20]:
> On Sun, Apr 05, 2009 at 12:43:07PM -0600, Bob Beck wrote:
> > Someone please have a look, and either commit it or tell me to.
>
> If you add the following patch to the port's makefile, it's ok:
>
>
Ok, how's this.. changed a bit anyway, so we use arc4random_uniform
Index: Makefile
===================================================================
RCS file: /cvs/ports/audio/mpd/Makefile,v
retrieving revision 1.16
diff -u -r1.16 Makefile
--- Makefile 28 Oct 2008 15:21:48 -0000 1.16
+++ Makefile 6 Apr 2009 15:09:54 -0000
@@ -2,7 +2,7 @@
COMMENT= Music Player Daemon
DISTNAME= mpd-0.13.2
-PKGNAME= ${DISTNAME}p2
+PKGNAME= ${DISTNAME}p3
CATEGORIES= audio
HOMEPAGE= http://www.musicpd.org/
MAINTAINER= Tobias Ulmer <[email protected]>
Index: patches/patch-src_playlist_c
===================================================================
RCS file: patches/patch-src_playlist_c
diff -N patches/patch-src_playlist_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_playlist_c 6 Apr 2009 15:09:54 -0000
@@ -0,0 +1,80 @@
+--- src/playlist.c.orig Fri Jun 13 22:16:16 2008
++++ src/playlist.c Mon Apr 6 08:57:25 2009
+@@ -77,6 +77,13 @@
+ static int playPlaylistOrderNumber(int fd, int orderNum);
+ static void randomizeOrder(int start, int end);
+
++#ifdef __OpenBSD__
++#define RANDOM_UB(n) (arc4random_uniform(n))
++#else
++#define RANDOM_UB(n) (random() % (n))
++#endif
++
++
+ static void incrPlaylistVersion(void)
+ {
+ static unsigned long max = ((mpd_uint32) 1 << 31) - 1;
+@@ -647,7 +654,7 @@
+ else
+ start = playlist.current + 1;
+ if (start < playlist.length) {
+- swap = random() % (playlist.length - start);
++ swap = RANDOM_UB(playlist.length - start);
+ swap += start;
+ swapOrder(playlist.length - 1, swap);
+ }
+@@ -1189,15 +1196,23 @@
+ }
+ }
+
+- for (i = start; i <= end; i++) {
+- ri = random() % (end - start + 1) + start;
+- if (ri == playlist.current)
+- playlist.current = i;
+- else if (i == playlist.current)
+- playlist.current = ri;
+- swapOrder(i, ri);
++ /*
++ * Shuffle the Order.
++ * Use an unbiased Fisher-Yates shuffle.
++ */
++ i = end + 1;
++ while (i > start + 1) {
++ ri = RANDOM_UB(i - start); /* 0 <= ri <= len */
++ ri += start;
++ i--; /* i is now the last pertinent index */
++ if (i != ri) { /* do nothing if i == ri */
++ if (ri == playlist.current)
++ playlist.current = i;
++ else if (i == playlist.current)
++ playlist.current = ri;
++ swapOrder(i, ri);
++ }
+ }
+-
+ }
+
+ int setPlaylistRandomStatus(int fd, int status)
+@@ -1281,12 +1296,17 @@
+ i = 0;
+ playlist.current = -1;
+ }
+- /* shuffle the rest of the list */
+- for (; i < playlist.length; i++) {
+- ri = random() % (playlist.length - 1) + 1;
+- swapSongs(i, ri);
++ /*
++ * shuffle the rest of the list
++ * Use an unbiased Fisher-Yates shuffle.
++ */
++ i = playlist.length;
++ while (i > 1) {
++ ri = RANDOM_UB(i); /* 0 <= ri <= len */
++ i--; /* i is now the last pertinent index */
++ if (i != ri) /* do nothing if i == ri */
++ swapSongs(i, ri);
+ }
+-
+ incrPlaylistVersion();
+ }
+