[patch] fakesmsc no longer "segmentation fault"s after reaching EOF

Rudy Matela <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <CALCD0B-Kk-QAY5hXuUhu3NbykvRh2unnSi5pDHU8pb_YwJy2+Q@mail.gmail.com>
Hello,

There is a bug on fakesmsc. It gives segmentation fault when the
program reaches EOF. The simplest way to simulate the bug is:

$ ./test/fakesmsc < /dev/null
2012-09-11 13:56:02 [5946] [0] INFO: Debug_lvl = -1, log_file =
<none>, log_lvl = 0
2012-09-11 13:56:02 [5946] [0] INFO: Entering interactive mode. Type
your message on the command line
2012-09-11 13:56:02 [5946] [0] INFO: fakesmsc starting
2012-09-11 13:56:02 [5946] [0] DEBUG: Connecting to <127.0.0.1>
2012-09-11 13:56:02 [5946] [0] PANIC: ./test/fakesmsc() [0x805d5ad]
2012-09-11 13:56:02 [5946] [0] PANIC:
linux-gate.so.1(__kernel_rt_sigreturn+0) [0xb772140c]
2012-09-11 13:56:02 [5946] [0] PANIC: ./test/fakesmsc(main+0x8a8) [0x804fc48]
2012-09-11 13:56:02 [5946] [0] PANIC:
/usr/lib/libc.so.6(__libc_start_main+0xf5) [0xb7149605]
2012-09-11 13:56:02 [5946] [0] PANIC: ./test/fakesmsc() [0x804fdd9]
Segmentation fault

Real situations for it to happen include reading several messages from a file
$ ./test/fakesmsc < file.txt (after reaching the end of file the
program will crash)

Or even reading from keyboard by simulating EOF when typing control+d.


Attached is a patch that solves the issue. The program now quits when
reaches end of file on stdin. This provides a great way to quit when
in interactive mode: type your messages, then ctrl+d to quit (as it is
on bash / python / perl / ruby and other interpreters).

I've successfully applied it against revision 4995 using "patch -p0 <
fakesmsc-gracefully-quits-when-eof.patch" on project root.

Regards,
Rudy


Index: test/fakesmsc.c
===================================================================
--- test/fakesmsc.c     (revision 4995)
+++ test/fakesmsc.c     (working copy)
@@ -307,6 +307,8 @@
             /* something went off, let's see if it's stdin */
             if (FD_ISSET(fileno(fp), &rset)) { /* stdin is readable */
                 cptr = fgets(buffer, IN_BUFSIZE, stdin);
+                if (!cptr)
+                    goto over;
                 if( strlen( cptr ) < 2 )
                     goto rcv;
             } else { /* timer kicked in */
fakesmsc-gracefully-quits-when-eof.patch (application/octet-stream, 552 B)
Index: test/fakesmsc.c
===================================================================
--- test/fakesmsc.c	(revision 4995)
+++ test/fakesmsc.c	(working copy)
@@ -307,6 +307,8 @@
             /* something went off, let's see if it's stdin */
             if (FD_ISSET(fileno(fp), &rset)) { /* stdin is readable */
                 cptr = fgets(buffer, IN_BUFSIZE, stdin);
+                if (!cptr)
+                    goto over;
                 if( strlen( cptr ) < 2 )
                     goto rcv;
             } else { /* timer kicked in */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.