Commit b7a31405 authored by Dan Carpenter's avatar Dan Carpenter Committed by David S. Miller

isdn: icn: buffer overflow in icn_command()

This buffer over was detected using static analysis:

	drivers/isdn/icn/icn.c:1325 icn_command()
	error: format string overflow. buf_size: 60 length: 98

The calculation for the length of the string is off because it assumes
that the dial[] buffer holds a 50 character string, but actually it is
at most 31 characters and NUL.  I have removed the dial[] buffer because
it isn't needed.

The maximum length of the string is actually 79 characters and a NUL.  I
have made the cbuf[] array large enough to hold it and changed the
sprintf() to an snprintf() as a further safety enhancement.
Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 74462f0d
...@@ -1155,7 +1155,7 @@ icn_command(isdn_ctrl *c, icn_card *card) ...@@ -1155,7 +1155,7 @@ icn_command(isdn_ctrl *c, icn_card *card)
ulong a; ulong a;
ulong flags; ulong flags;
int i; int i;
char cbuf[60]; char cbuf[80];
isdn_ctrl cmd; isdn_ctrl cmd;
icn_cdef cdef; icn_cdef cdef;
char __user *arg; char __user *arg;
...@@ -1309,7 +1309,6 @@ icn_command(isdn_ctrl *c, icn_card *card) ...@@ -1309,7 +1309,6 @@ icn_command(isdn_ctrl *c, icn_card *card)
break; break;
if ((c->arg & 255) < ICN_BCH) { if ((c->arg & 255) < ICN_BCH) {
char *p; char *p;
char dial[50];
char dcode[4]; char dcode[4];
a = c->arg; a = c->arg;
...@@ -1321,9 +1320,9 @@ icn_command(isdn_ctrl *c, icn_card *card) ...@@ -1321,9 +1320,9 @@ icn_command(isdn_ctrl *c, icn_card *card)
} else } else
/* Normal Dial */ /* Normal Dial */
strcpy(dcode, "CAL"); strcpy(dcode, "CAL");
strcpy(dial, p); snprintf(cbuf, sizeof(cbuf),
sprintf(cbuf, "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1), "%02d;D%s_R%s,%02d,%02d,%s\n", (int) (a + 1),
dcode, dial, c->parm.setup.si1, dcode, p, c->parm.setup.si1,
c->parm.setup.si2, c->parm.setup.eazmsn); c->parm.setup.si2, c->parm.setup.eazmsn);
i = icn_writecmd(cbuf, strlen(cbuf), 0, card); i = icn_writecmd(cbuf, strlen(cbuf), 0, card);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment