[Asterisk-Users] Patch to fix some segfaults in Asterisk
Michael Manousos
manousos at inaccessnetworks.com
Tue Jul 8 03:38:01 MST 2003
Hi,
This patch fixes a couple of segfaults in music-on-hold,
frame smoother routines and channel allocation in Asterisk.
Mark, feel free to apply it in CVS (if approved).
Regards,
Michael.
-------------- next part --------------
Index: channel.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channel.c,v
retrieving revision 1.25
diff -u -r1.25 channel.c
--- channel.c 4 Jul 2003 16:49:11 -0000 1.25
+++ channel.c 8 Jul 2003 10:48:13 -0000
@@ -279,8 +279,8 @@
return NULL;
PTHREAD_MUTEX_LOCK(&chlock);
tmp = malloc(sizeof(struct ast_channel));
- memset(tmp, 0, sizeof(struct ast_channel));
if (tmp) {
+ memset(tmp, 0, sizeof(struct ast_channel));
pvt = malloc(sizeof(struct ast_channel_pvt));
if (pvt) {
memset(pvt, 0, sizeof(struct ast_channel_pvt));
Index: frame.c
===================================================================
RCS file: /usr/cvsroot/asterisk/frame.c,v
retrieving revision 1.3
diff -u -r1.3 frame.c
--- frame.c 28 Jun 2003 16:40:02 -0000 1.3
+++ frame.c 8 Jul 2003 10:48:15 -0000
@@ -125,8 +125,10 @@
/* Make frame */
s->f.frametype = AST_FRAME_VOICE;
s->f.subclass = s->format;
- s->f.data = s->framedata + AST_FRIENDLY_OFFSET;
- s->f.offset = AST_FRIENDLY_OFFSET;
+ /*s->f.data = s->framedata + AST_FRIENDLY_OFFSET;*/
+ s->f.data = s->framedata;
+ /*s->f.offset = AST_FRIENDLY_OFFSET;*/
+ s->f.offset = 0;
s->f.datalen = s->size;
s->f.samples = s->size * s->samplesperbyte;
/* Fill Data */
@@ -141,7 +143,8 @@
void ast_smoother_free(struct ast_smoother *s)
{
- free(s);
+ if (s != NULL)
+ free(s);
}
static struct ast_frame *ast_frame_header_new(void)
Index: apps/Makefile
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/Makefile,v
retrieving revision 1.8
diff -u -r1.8 Makefile
--- apps/Makefile 16 May 2003 20:57:12 -0000 1.8
+++ apps/Makefile 8 Jul 2003 10:48:15 -0000
@@ -35,7 +35,7 @@
all: $(APPS)
clean:
- rm -f *.so *.o look
+ rm -f *.so *.o look .depend
%.so : %.o
$(CC) -shared -Xlinker -x -o $@ $<
Index: res/res_musiconhold.c
===================================================================
RCS file: /usr/cvsroot/asterisk/res/res_musiconhold.c,v
retrieving revision 1.1.1.5
diff -u -r1.1.1.5 res_musiconhold.c
--- res/res_musiconhold.c 18 Mar 2003 06:00:18 -0000 1.1.1.5
+++ res/res_musiconhold.c 8 Jul 2003 10:48:30 -0000
@@ -400,7 +400,8 @@
ast_log(LOG_WARNING, "Only doing %d of %d requested bytes on %s\n", sizeof(buf), len, chan->name);
len = sizeof(buf);
}
- res = read(moh->pipe[0], buf + AST_FRIENDLY_OFFSET/2, len);
+ /* XXX SEGFAULT res = read(moh->pipe[0], buf + AST_FRIENDLY_OFFSET/2, len);*/
+ res = read(moh->pipe[0], buf, len);
#if 0
if (res != len) {
ast_log(LOG_WARNING, "Read only %d of %d bytes: %s\n", res, len, strerror(errno));
@@ -413,7 +414,8 @@
f.mallocd = 0;
f.datalen = res;
f.samples = res / 2;
- f.data = buf + AST_FRIENDLY_OFFSET / 2;
+ /* XXX SEGFAULT f.data = buf + AST_FRIENDLY_OFFSET / 2;*/
+ f.data = buf;
f.offset = AST_FRIENDLY_OFFSET;
if (ast_write(chan, &f)< 0) {
ast_log(LOG_WARNING, "Failed to write frame to '%s': %s\n", chan->name, strerror(errno));
More information about the asterisk-users
mailing list