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