bin/125054: [patch] cdcontrol enhancements to volume operations

Pietro Cerutti gahr at FreeBSD.org
Fri Jun 27 20:30:02 UTC 2008


>Number:         125054
>Category:       bin
>Synopsis:       [patch] cdcontrol enhancements to volume operations
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jun 27 20:30:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Pietro Cerutti
>Release:        FreeBSD 8.0-CURRENT i386
>Organization:
The FreeBSD Project 
>Environment:


System: FreeBSD 8.0-CURRENT #2: Tue Jun 24 08:15:41 CEST 2008
    root at gahrtop.localhost:/usr/obj/usr/src/sys/MSI1034



>Description:


This includes the patches from bin/15480 and also fixes the case when volume values < 0 or > 255 are given on the command line.

Currently, now no sanity check is made on the values and the unsigned char storing the volume values either overflows or underflows if the given values are not in range.

E.g., 256 overflows to 0, -10 underflows to 246, ...

The patch reduces values <0 to 0 and values > 255 to 255.


>How-To-Repeat:





>Fix:


--- cdcontrol.diff begins here ---
Index: cdcontrol.1
===================================================================
RCS file: /home/ncvs/src/usr.sbin/cdcontrol/cdcontrol.1,v
retrieving revision 1.40
diff -u -u -r1.40 cdcontrol.1
--- cdcontrol.1	18 Jan 2005 20:02:32 -0000	1.40
+++ cdcontrol.1	27 Jun 2008 20:14:00 -0000
@@ -1,6 +1,6 @@
 .\" $FreeBSD: src/usr.sbin/cdcontrol/cdcontrol.1,v 1.40 2005/01/18 20:02:32 ru Exp $
 .\"
-.Dd May 8, 2002
+.Dd June 27, 2008
 .Dt CDCONTROL 1
 .Os
 .Sh NAME
@@ -130,6 +130,14 @@
 Eject the disc.
 .It Ic close
 Inject the disc.
+.It Ic volume
+Same as 
+.Em status volume
+command.
+.It Ic volume Ar level
+Set the volume of both channels to
+.Ar level .
+Allowed values are in the range 0-255.
 .It Ic volume Ar left_channel right_channel
 Set the volume of left channel to
 .Ar left_channel
Index: cdcontrol.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/cdcontrol/cdcontrol.c,v
retrieving revision 1.50
diff -u -u -r1.50 cdcontrol.c
--- cdcontrol.c	19 Feb 2008 07:09:18 -0000	1.50
+++ cdcontrol.c	27 Jun 2008 20:19:13 -0000
@@ -16,6 +16,19 @@
  * 11-Oct-1995: Serge V.Vakulenko <vak at cronyx.ru>
  *              New eject algorithm.
  *              Some code style reformatting.
+ * 
+ * 13-Dec-1999: Knut A. Syed <kas at kas.no>
+ * 		Volume-command modified.  If used with only one
+ * 		parameter it now sets both channels.  If used without
+ * 		parameters it will print volume-info.
+ * 		Version 2.0.1
+ *
+ * 27-Jun-2008  Pietro Cerutti <gahr at FreeBSD.org>
+ * 		Further enhancement to volume. Values not in range 0-255
+ * 		are now reduced to be in range. This prevents overflow in
+ * 		the uchar storing the volume (256 -> 0, -20 -> 236, ...).
+ * 		Version 2.0.2
+ *
  */
 
 #include <sys/cdefs.h>
@@ -39,7 +52,7 @@
 #include <unistd.h>
 #include <vis.h>
 
-#define VERSION "2.0"
+#define VERSION "2.0.2"
 
 #define ASTS_INVALID	0x00  /* Audio status byte not valid */
 #define ASTS_PLAYING	0x11  /* Audio play operation in progress */
@@ -100,7 +113,7 @@
 { CMD_STATUS,	"status",	1, "[audio | media | volume]" },
 { CMD_STOP,	"stop",		3, "" },
 { CMD_VOLUME,	"volume",	1,
-      "<l> <r> | left | right | mute | mono | stereo" },
+      "<l&r> <l> <r> | left | right | mute | mono | stereo" },
 { CMD_CDID,	"cdid",		2, "" },
 { CMD_SPEED,	"speed",	2, "speed" },
 { 0,		NULL,		0, NULL }
@@ -270,7 +283,7 @@
 int run (int cmd, char *arg)
 {
 	long speed;
-	int l, r, rc;
+	int l, r, rc, count;
 
 	switch (cmd) {
 
@@ -396,6 +409,9 @@
 		if (fd < 0 && !open_cd ())
 			return (0);
 
+		if (! strlen (arg))
+		    	return pstatus ("volume");
+
 		if (! strncasecmp (arg, "left", strlen(arg)))
 			return ioctl (fd, CDIOCSETLEFT);
 
@@ -411,12 +427,13 @@
 		if (! strncasecmp (arg, "mute", strlen(arg)))
 			return ioctl (fd, CDIOCSETMUTE);
 
-		if (2 != sscanf (arg, "%d %d", &l, &r)) {
-			warnx("invalid command arguments");
-			return (0);
-		}
-
-		return setvol (l, r);
+		count = sscanf (arg, "%d %d", &l, &r);
+		if (count == 1)
+		    return setvol (l, l);
+		if (count == 2)
+		    return setvol (l, r);
+		warnx("invalid command arguments");
+		return (0);
 
 	case CMD_SPEED:
 		if (fd < 0 && ! open_cd ())
@@ -1039,6 +1056,9 @@
 {
 	struct ioc_vol  v;
 
+	left  = left  < 0 ? 0 : left  > 255 ? 255 : left;
+	right = right < 0 ? 0 : right > 255 ? 255 : right;
+
 	v.vol[0] = left;
 	v.vol[1] = right;
 	v.vol[2] = 0;
--- cdcontrol.diff ends here ---



>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list