Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 27 Jun 2008 22:20:28 +0200
From:      "Pietro Cerutti" <gahr@FreeBSD.org>
To:        "FreeBSD gnats submit" <FreeBSD-gnats-submit@FreeBSD.org>
Subject:   bin/125054: [patch] cdcontrol enhancements to volume operations
Message-ID:  <1214598028.21571@gahrtop.localhost>
Resent-Message-ID: <200806272030.m5RKU2Ql070224@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>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@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@cronyx.ru>
  *              New eject algorithm.
  *              Some code style reformatting.
+ * 
+ * 13-Dec-1999: Knut A. Syed <kas@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@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:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1214598028.21571>