[asterisk-bugs] [JIRA] (ASTERISK-26749) chan_dahdi.c: my_dahdi_write() returns zero even if it fails.
Segii Cherkavskyi (JIRA)
noreply at issues.asterisk.org
Wed Jan 25 15:45:10 CST 2017
[ https://issues.asterisk.org/jira/browse/ASTERISK-26749?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Segii Cherkavskyi updated ASTERISK-26749:
-----------------------------------------
Description:
Although my asterisk version is not the newest, I checked chan_dahdi.c in the more recent asterisk version (13) and the code in question is remained untouched, so here is the problem:
{code:title=chan_dahdi.c|borderStyle=solid}
static int my_dahdi_write(struct dahdi_pvt *p, unsigned char *buf, int len, int idx, int linear)
{
int sent=0;
int size;
int res;
int fd;
fd = p->subs[idx].dfd;
while (len) {
size = len;
if (size > (linear ? READ_SIZE * 2 : READ_SIZE))
size = (linear ? READ_SIZE * 2 : READ_SIZE);
res = write(fd, buf, size);
if (res != size) {
ast_debug(1, "Write returned %d (%s) on channel %d\n", res, strerror(errno), p->channel);
return sent;
}
len -= size;
buf += size;
}
return sent;
}
{code}
*apps/chan_dahdi.c* has a method *my_dahdi_write()*, which returns *0*, even if writing to a file descriptor fails. In case of failure *my_dahdi_write()* produces the following log output:
{noformat}
chan_dahdi.c: Write returned -1 (Resource temporarily unavailable) on channel 4
{noformat}
The return value of the method *my_dahdi_write()* is checked by the calling function *dahdi_write()* and returns with *-1*, in case if *my_dahdi_write()* fails, {color:red}which never happens{color}.
While searching through the asterisk issue tracker, I found similar logs to the one I have, with discussions about echo cancellation etc. not directly discussing the return value of *my_dahdi_write()*.
was:
Although my asterisk version is not the newest, I checked chan_dahdi.c in the more recent asterisk version (13) and the code in question is remained untouched, so here is the problem:
apps/chan_dahdi.c has a method my_dahdi_write(), which returns zero, even if writing to a file descriptor fails. In case of failure my_dahdi_write() produces the following log output:
{noformat}
chan_dahdi.c: Write returned -1 (Resource temporarily unavailable) on channel 4
{noformat}
The return value of the method my_dahdi_write() is checked by the calling function dahdi_write() and this function returns with -1, in case if my_dahdi_write() fails, which never happens.
While searching through the asterisk issue tracker, I found similar logs to the one I have, with discussions about echo cancellation etc. not directly discussing the return value of my_dahdi_write().
> chan_dahdi.c: my_dahdi_write() returns zero even if it fails.
> --------------------------------------------------------------
>
> Key: ASTERISK-26749
> URL: https://issues.asterisk.org/jira/browse/ASTERISK-26749
> Project: Asterisk
> Issue Type: Bug
> Security Level: None
> Components: Channels/chan_dahdi
> Environment: Gentoo Linux, asterisk 1.8.31.1
> Reporter: Segii Cherkavskyi
> Assignee: Richard Mudgett
> Attachments: asterisk-15-12-2017-10-02-55.log, jira_asterisk_26749_v13.patch
>
>
> Although my asterisk version is not the newest, I checked chan_dahdi.c in the more recent asterisk version (13) and the code in question is remained untouched, so here is the problem:
> {code:title=chan_dahdi.c|borderStyle=solid}
> static int my_dahdi_write(struct dahdi_pvt *p, unsigned char *buf, int len, int idx, int linear)
> {
> int sent=0;
> int size;
> int res;
> int fd;
> fd = p->subs[idx].dfd;
> while (len) {
> size = len;
> if (size > (linear ? READ_SIZE * 2 : READ_SIZE))
> size = (linear ? READ_SIZE * 2 : READ_SIZE);
> res = write(fd, buf, size);
> if (res != size) {
> ast_debug(1, "Write returned %d (%s) on channel %d\n", res, strerror(errno), p->channel);
> return sent;
> }
> len -= size;
> buf += size;
> }
> return sent;
> }
> {code}
> *apps/chan_dahdi.c* has a method *my_dahdi_write()*, which returns *0*, even if writing to a file descriptor fails. In case of failure *my_dahdi_write()* produces the following log output:
> {noformat}
> chan_dahdi.c: Write returned -1 (Resource temporarily unavailable) on channel 4
> {noformat}
> The return value of the method *my_dahdi_write()* is checked by the calling function *dahdi_write()* and returns with *-1*, in case if *my_dahdi_write()* fails, {color:red}which never happens{color}.
> While searching through the asterisk issue tracker, I found similar logs to the one I have, with discussions about echo cancellation etc. not directly discussing the return value of *my_dahdi_write()*.
--
This message was sent by Atlassian JIRA
(v6.2#6252)
More information about the asterisk-bugs
mailing list