2013年7月7日日曜日

recpt1 --sid と eit 記録で死ぬの直した

実はすごい前から気がついてて調べるのが面倒でwork aroundで回避していたのだけどようやく直した。
--sid でサービス指定しつつEIT含めて録画してると極希れにSegmentation Faultするやつの修正。

再現性が低すぎてデバッグめんどくせーなと思って放置してたんだけど core とりゃいいじゃんてことで unlimit coredumpsize して録画してたらcoreできてたんで直してみた。
単純に destination buffer が溢れてmemcpy(3)で死んでたのでサイズ増やした。

溢れる前にバッファ新しくするようにどっかでなっててそこ調整すればいいのかもしれないけどそこまで調べるの面倒なのでとりあえず2倍にした。

diff -r b14397800eae recpt1/tssplitter_lite.h
--- a/recpt1/tssplitter_lite.h  Wed Jun 27 06:56:33 2012 +0900
+++ b/recpt1/tssplitter_lite.h  Sun Jul 07 18:30:53 2013 +0900
@@ -65,7 +65,7 @@
 typedef struct _splitbuf_t
 {
     int size;
-    u_char buffer[1024*1024];
+    u_char buffer[1024*1024*2];
 } splitbuf_t;

 splitter* split_startup(char *sid);

あくまで--sid service_id,eit した時に死ぬやつなんで、それ以外では関係ないと思います。

と思ったけど2倍じゃたりないっぽい。 http://0xc.info/12w0.png

結局の所 b25 decodeした後のデータサイズってよくわからなくて tssplitter_lite.h にも /* b25 decoder would hoard up large chank */ って書いてある。 (s/chank/chunk/ ?)

そんなデータを書く領域をstaticに定義しているのがそもそもの間違いなのではということで結局malloc(3)するようにした。

diff -r b14397800eae recpt1/recpt1.c
--- a/recpt1/recpt1.c Wed Jun 27 06:56:33 2012 +0900
+++ b/recpt1/recpt1.c Mon Jul 08 16:46:37 2013 +0900
@@ -348,6 +348,7 @@
     buf.size = 0;
     buf.data = NULL;
     splitbuf.size = 0;
+    splitbuf.buffer = NULL;
 
     if(wfd == -1)
         fileless = TRUE;
@@ -409,6 +410,12 @@
                     }
                 }
                 /* 分離対象以外をふるい落とす */
+                splitbuf.buffer = (u_char *)malloc(buf.size);
+                if (splitbuf.buffer == NULL) {
+                    fprintf(stderr, "splitbuf malloc failed.\n");
+                    use_splitter = FALSE;
+                    goto fin;
+                }
                 code = split_ts(splitter, &buf, &splitbuf);
                 if(code == TSS_NULL) {
                     fprintf(stderr, "PMT reading..\n");
@@ -469,6 +476,11 @@
         free(qbuf);
         qbuf = NULL;
 
+        if (splitbuf.buffer) {
+            free(splitbuf.buffer); 
+            splitbuf.buffer = NULL;
+        }
+
         /* normal exit */
         if((f_exit && !p_queue->num_used) || file_err) {
 
@@ -483,6 +495,12 @@
             }
 
             if(use_splitter) {
+                splitbuf.size = 0;
+                splitbuf.buffer = (u_char *)malloc(buf.size);
+                if (splitbuf.buffer == NULL) {
+                    fprintf(stderr, "splitbuf malloc failed.\n");
+                    break;
+                }
                 /* 分離対象以外をふるい落とす */
                 code = split_ts(splitter, &buf, &splitbuf);
                 if(code == TSS_NULL) {
diff -r b14397800eae recpt1/tssplitter_lite.h
--- a/recpt1/tssplitter_lite.h Wed Jun 27 06:56:33 2012 +0900
+++ b/recpt1/tssplitter_lite.h Mon Jul 08 16:46:37 2013 +0900
@@ -65,7 +65,7 @@
 typedef struct _splitbuf_t
 {
     int size;
-    u_char buffer[1024*1024];
+    u_char *buffer;
 } splitbuf_t;
 
 splitter* split_startup(char *sid);

0 件のコメント:

コメントを投稿