Andre Noll [Sun, 14 Jun 2009 09:02:17 +0000 (11:02 +0200)]
Use openssl's RAND_load_file() and RAND_bytes() to get randomness.
This should yield random data that is cryptographically stronger than
random().
Andre Noll [Sat, 13 Jun 2009 18:41:59 +0000 (20:41 +0200)]
Kill the client-0.2.6 compatibility mode and the --plain option.
This makes rc4 encryption mandatory.
Andre Noll [Sat, 13 Jun 2009 17:22:51 +0000 (19:22 +0200)]
Deactivate gcc's strict aliasing optimizations.
This causes a lot of warnings which are not easy to fix and probably
harmless. So simply disallow gcc to assume the strictest aliasing
rules.
Andre Noll [Sat, 13 Jun 2009 11:53:42 +0000 (13:53 +0200)]
Add new ls option -d.
This is useful for the conversion script that transforms the afs
database to the 0.4 format.
Andre Noll [Sat, 6 Jun 2009 13:48:34 +0000 (15:48 +0200)]
Merge commit 'fml/master'
Andre Noll [Thu, 4 Jun 2009 22:43:28 +0000 (00:43 +0200)]
Trivial typo fixes and cosmetic cleanups.
Andre Noll [Wed, 3 Jun 2009 08:44:23 +0000 (10:44 +0200)]
Fix a typo in the audiod man page.
Thanks to Gerrit Renker who pointed out the typo.
Andre Noll [Sun, 31 May 2009 10:40:10 +0000 (12:40 +0200)]
Merge commit 'fml/master'
Andre Noll [Sun, 31 May 2009 10:34:39 +0000 (12:34 +0200)]
alsa_write: Avoid EAGAIN.
Before writing to the sound device, use snd_pcm_avail_update() to
check how many frames alsa will accept and write only that many
frames.
Andre Noll [Thu, 28 May 2009 09:19:25 +0000 (11:19 +0200)]
Merge commit 'meins/master'
Andre Noll [Wed, 27 May 2009 17:16:54 +0000 (19:16 +0200)]
Truncate overlong tag info and replace newlines by spaces.
The tag info which is computed by the audio format handlers and stored
in the audio file table is read into a fixed-size buffer by the audio
file selector in open_and_update_audio_file(), passed to the server
process and then sent to the client via the stat command. It is not
interpreted at all during this process. In particular, it is not
essential for correctly streaming the audio file.
Vorbis comments and id3v2 tags have no size limit and may contain
arbitrary data which may lead to the following twi problems:
- As noted by Gerrit Renker, if the tag info is too long
to fit into the fixed-size buffer, the current code skips
the audio file and removes it from the list of currently
admissible files. So para_server fails to stream such files.
- If the tag info contains newlines, these are included
verbatim in the status output which may confuse para_audiod.
This patch truncates the tag info string if it does not fit into the
4K buffer and replaces newlines by spaces. This is a bit ugly but
avoids both of the above problems. It's still possible to retrieve
the complete tag info via the "ls -lv" command.
Andre Noll [Tue, 26 May 2009 20:20:50 +0000 (22:20 +0200)]
aft: Reorganize make_status_items().
It's cleaner to allocate the struct ls_data within make_status_items().
Andre Noll [Tue, 26 May 2009 18:51:48 +0000 (20:51 +0200)]
Fix build on MacOs.
The changes to write.h broke the osx writer. The fix is trivial though.
Andre Noll [Mon, 25 May 2009 21:02:50 +0000 (23:02 +0200)]
aft: Make make_status_items() static.
Move its single caller, open_and_update_audio_file(), below
make_status_items and get rid of the declaration in afs.h.
Andre Noll [Sun, 17 May 2009 18:14:26 +0000 (20:14 +0200)]
Kill some semicolons outside function definitions.
Andre Noll [Thu, 14 May 2009 06:34:06 +0000 (08:34 +0200)]
struct writer_node: Store the number of the writer rather than a pointer.
This makes it easier to get the name of the writer from the writer_node
struct.
Andre Noll [Mon, 11 May 2009 07:47:31 +0000 (09:47 +0200)]
Fix a gcc warning on x86_64.
Andre Noll [Sun, 10 May 2009 20:55:56 +0000 (22:55 +0200)]
Fix a copy-and-paste typo in the udp sender.
Andre Noll [Sun, 10 May 2009 20:55:20 +0000 (22:55 +0200)]
Fix the --log_color option of para_server and para_audiod.
Andre Noll [Sun, 10 May 2009 19:31:13 +0000 (21:31 +0200)]
rbtree: Add const qualifier to some functions.
The 'rb_first()', 'rb_last()', 'rb_next()' and 'rb_prev()' calls take a pointer
to an RB node or RB root. They do not change the pointed objects, so add a
'const' qualifier.
See commit
f4b477c47332367d35686bd2b808c2156b96d7c7 in the linux source tree.
Andre Noll [Sun, 10 May 2009 18:41:11 +0000 (20:41 +0200)]
Add some missing source code documentation.
Andre Noll [Sun, 10 May 2009 16:11:30 +0000 (18:11 +0200)]
Add ggo/.gitignore to hide derived ggo files.
Andre Noll [Sun, 10 May 2009 15:46:40 +0000 (17:46 +0200)]
Add new prebuffer filter.
This could be handy for lossy networks that require a lot of buffering
in addition to methods (like FEC) to cope with packet loss.
Andre Noll [Sun, 10 May 2009 15:40:42 +0000 (17:40 +0200)]
filter: Force a minimal select timeout if something was converted.
When filter_preselect() runs. other pre_select functions might have
already been called and decided to do nothing, e.g. because their
output buffer was full or the input buffer was empty.
If this call to filter_preselect() changed any of the involved buffers,
we want those other pre_select() functions to be called ASAP. So force
a minimal timeout for the next select call to avoid unnecessary delays.
Andre Noll [Sun, 10 May 2009 13:28:13 +0000 (15:28 +0200)]
mp3dec: Try harder to recover from non-fatal errors.
If there's still data left, try to decode the next header in the
same scheduler run. This avoids unnecessary copies of large parts
of the mp3 input buffer.
Andre Noll [Sun, 10 May 2009 12:11:38 +0000 (14:11 +0200)]
audiod: Properly handle wng open failures.
If opening the writer node group fails, no task is being registered to the
scheduler although a task structure is allocated. This makes audiod think
everything is fine until the output buffer of the receiver or a filter is
filled up which may take several seconds.
Fix this flaw by setting the error field of the wng to -E_TASK_UNREGISTERED.
This causes audiod to close the receiver node and the filter chain and to
clear the affected slot.
Andre Noll [Sat, 9 May 2009 08:59:14 +0000 (10:59 +0200)]
First draft of the oss writer.
This adds client-side support for FreeBSD and NetBSD and provides an
alternative writer for Linux.
Andre Noll [Fri, 8 May 2009 19:49:30 +0000 (21:49 +0200)]
Allow writers that have no pre_select functions.
Also, fix the pointer being printed in a debug message of the scheduler.
Andre Noll [Fri, 8 May 2009 08:04:11 +0000 (10:04 +0200)]
NEWS update.
Andre Noll [Thu, 7 May 2009 17:03:49 +0000 (19:03 +0200)]
Merge branch 'next'
Andre Noll [Thu, 7 May 2009 15:46:15 +0000 (17:46 +0200)]
new codename, reset version to git
Andre Noll [Thu, 7 May 2009 15:38:49 +0000 (17:38 +0200)]
the paraslash-0.3.4 release tarball
Andre Noll [Thu, 7 May 2009 15:35:34 +0000 (17:35 +0200)]
paraslash 0.3.4
Andre Noll [Thu, 7 May 2009 14:44:57 +0000 (16:44 +0200)]
Remove an overambitious sanity check in the fecdec filter.
Andre Noll [Mon, 4 May 2009 14:23:04 +0000 (16:23 +0200)]
Kill a bashism in configure.ac.
This caused additional quotes when /bin/sh is dash or tcsh which would result
in syntax errors during compilation.
Andre Noll [Mon, 4 May 2009 11:34:16 +0000 (13:34 +0200)]
Fix compilation on FreeBSD.
Without these two includes, compilation fails on FreeBSD with
/usr/include/net/if.h:265: error: field `ifru_addr' has incomplete type
/usr/include/net/if.h:266: error: field `ifru_dstaddr' has incomplete type
/usr/include/net/if.h:267: error: field `ifru_broadaddr' has incomplete type
/usr/include/net/if.h:299: error: field `ifra_addr' has incomplete type
/usr/include/net/if.h:300: error: field `ifra_broadaddr' has incomplete type
/usr/include/net/if.h:301: error: field `ifra_mask' has incomplete type
/usr/include/net/if.h:368: error: field `addr' has incomplete type
/usr/include/net/if.h:369: error: field `dstaddr' has incomplete type
Andre Noll [Mon, 4 May 2009 11:12:17 +0000 (13:12 +0200)]
Fix two gcc warnings.
mp3_afh.c:420: warning: comparison of distinct pointer types lacks a cast
alsa_write.c:119: warning: format '%zu' expects type 'size_t', but argument 4 has type 'int'
Andre Noll [Sun, 3 May 2009 17:09:16 +0000 (19:09 +0200)]
Merge branch 'master' into next
Andre Noll [Sun, 3 May 2009 16:11:22 +0000 (18:11 +0200)]
Alsa fixes and cleanups.
This patch
- replaces the unused E_SND_PCM_INFO error by E_PHYSICAL_WIDTH,
- checks the return value of snd_pcm_format_physical_width() and returns
-E_PHYSICAL_WIDTH if this causes bytes_per_frame being non-positive,
- introduces an upper bound for the start threshold. Without that
change, playback could be delayed by several seconds on some alsa
configurations (problem pointed out by Johannes Wörner, thanks).
- does not return early on input errors which could cause the last
part of the audio stream being skipped.
- avoids calling snd_pcm_writei() with a frame count of zero which
could happen with the old code in case there's more than zero but
less than a full frame of audio data available.
- cleans up the documentation of struct private_alsa_write_data
Andre Noll [Sat, 2 May 2009 10:53:54 +0000 (12:53 +0200)]
Re-revert "Auto-adjust fecdec output buffer size."
This re-applies commit
35f9051506345255c7ed3c076b7df5f3b7d26039 which
should work due to the previous output buffer patch.
Andre Noll [Sat, 2 May 2009 09:50:17 +0000 (11:50 +0200)]
Merge branch 'master' into next
Andre Noll [Sat, 2 May 2009 09:46:46 +0000 (11:46 +0200)]
Use only a single buffer pointer for filters/receivers.
This allows filters to change the output buffer size on the fly.
Andre Noll [Fri, 1 May 2009 20:07:49 +0000 (22:07 +0200)]
fecdec: Add another sanity check to find_group().
Andre Noll [Fri, 1 May 2009 12:05:47 +0000 (14:05 +0200)]
alsa: Do not call alsa shutdown functions if alsa wasn't yet initialized.
This might happen if the wng is destroyed before any output was
produced. This bug could trigger
para_audiod: pcm.c:1105: snd_pcm_drain: Assertion `pcm' failed
causing audiod to crash.
Andre Noll [Fri, 1 May 2009 11:51:33 +0000 (13:51 +0200)]
alsa: Fix a typo in comment.
Andre Noll [Fri, 1 May 2009 11:42:21 +0000 (13:42 +0200)]
fecdec: Be more anal when finding fec groups.
If the number of (data) slices changes, there's something seriously
wrong. So return an error if we detect this situation.
Andre Noll [Fri, 1 May 2009 11:35:54 +0000 (13:35 +0200)]
fecdec: Fix warning message when freeing incomplete groups.
This could lead to a segfault.
Andre Noll [Wed, 29 Apr 2009 19:26:00 +0000 (21:26 +0200)]
[client] Dynamically allocate output buffer.
This should simplify subsequent patches that allow variable-sized
output buffers for filters/receivers.
Andre Noll [Mon, 27 Apr 2009 18:26:34 +0000 (20:26 +0200)]
Merge branch 'master' into next
Andre Noll [Sun, 26 Apr 2009 20:35:53 +0000 (22:35 +0200)]
Revert "Auto-adjust fecdec output buffer size."
This reverts commit
35f9051506345255c7ed3c076b7df5f3b7d26039.
Currently, filters must not change their output buffer on the fly
because the writer might already have a reference to the old buffer
and keeps using this buffer.
As dealing with changing output buffers requires much more work,
including changes to the generic filter and writer code, let's defer
this change to post 0.3.4.
Andre Noll [Sun, 26 Apr 2009 19:05:18 +0000 (21:05 +0200)]
Merge branch 'master' into next
Andre Noll [Sun, 26 Apr 2009 17:48:40 +0000 (19:48 +0200)]
afs: Rename signal_post_select() to afs_signal_post_select().
Just to distinguish the fatal error messages on shutdown.
Andre Noll [Sun, 26 Apr 2009 17:45:59 +0000 (19:45 +0200)]
Avoid dirty afs tables on shutdown.
The server process must wait for afs because afs catches SIGINT/SIGTERM
and may thus not respond immediately to these SIGNALS.
Before reacting to the signal, afs might want to use the shared memory
area and the mmd mutex. If the server process destroys this mutex
too early and afs tries to lock the shared memory area, the call to
mutex_lock() will fail and terminate the afs process. This leads to
dirty osl tables.
There's no such problem with the other children of the server process
(the command handlers) as these reset their SIGINT/SIGTERM handlers
to the default action, i.e. these processes get killed immediately
by the above kill().
Andre Noll [Sun, 26 Apr 2009 16:08:13 +0000 (18:08 +0200)]
Fix an invalid free() in command handlers.
The chunk table and the info_string are pointers located in the mmd
struct that point to dynamically allocated memory that must be freed
by the parent and the child. However, as the mmd struct is in a shared
memory area, there's no guarantee that after the fork these pointers
are still valid in child context. As these two pointers are not used
in the child anyway, we save them to local variables and free the
memory via that copy in the child.
This gets rid of
*** glibc detected *** para_server (serving 127.0.0.1#53650): double free or corruption (!prev): 0x08086fe0 ***
Andre Noll [Sat, 25 Apr 2009 20:33:43 +0000 (22:33 +0200)]
Merge branch 'master' into next
Conflicts:
mp3_afh.c
Andre Noll [Sat, 25 Apr 2009 13:17:58 +0000 (15:17 +0200)]
[net]: Fix buffer overflow in send_cred_buffer().
As pointed out by Johannes Wörner, para_audioc crashes on recent
Ubuntu systems due to stack smashing. This is caused by writing past
the end of the control buffer which stores the message header and
the socket credentials.
This patch fixes the bug by allocating a properly sized buffer.
Andre Noll [Thu, 23 Apr 2009 21:26:23 +0000 (23:26 +0200)]
Merge commit 'fml/master'
Andre Noll [Thu, 23 Apr 2009 15:18:03 +0000 (17:18 +0200)]
[udp_send] Refuse to stream files with invalid chunk tables.
If an audio file contains a chunk so large that even the maximal
possible number of slices is not sufficient to put this chunk into
a single FEC group, we must refuse to send this file. It's likely a
corrupt file anyway.
The old code in num_slices() was buggy as it returned the number of
slices needed to send the file as an uint8_t, so the return value
was actually the number of needed slices mod 256. This could trigger
the assert() in setup_next_fec_group() which checks that the group
contains at least one chunk.
This patch changes num_slices() to detect this situation more
reliably. As it is likely caused by a bad audio file rather than by a
networking problem, we do _not_ kick the fec client, but deactivate
it for the current file only. This requires the new "error" member
of struct fec_client which indicates a temporarily disabled fec client.
Andre Noll [Thu, 23 Apr 2009 11:39:04 +0000 (13:39 +0200)]
[mp3_afh]: Ignore junk at the end of an mp3 file.
There are mp3 files containing large areas of zeros at the end of the
file. The old code in mp3_afh.c would include these zeros in the last
chunk of the file.
This leads to unnecessary network traffic as including this area in
a chunk means that useless data is going to be sent to the client.
More importantly, it causes the udp sender to bail out because such
large chunks can not be fec-encoded, even with the maximal number
of slices.
This patch uses frame_start+frame_length instead of the file size as
the end of the last chunk which avoids this particular problem.
Andre Noll [Sun, 19 Apr 2009 21:17:38 +0000 (23:17 +0200)]
Merge commit 'athcx/next' into next
Andre Noll [Sun, 19 Apr 2009 21:17:08 +0000 (23:17 +0200)]
Fix off-by-one bug in mp3_afh.
Andre Noll [Wed, 8 Apr 2009 14:47:52 +0000 (16:47 +0200)]
audiod: Add more detailed docu on when to use --no_default_filters.
Andre Noll [Mon, 6 Apr 2009 17:02:16 +0000 (19:02 +0200)]
Kill remaining instances of signal().
Also, make para_sigaction() and para_install_sighandler() return void
and exit on errors.
Andre Noll [Mon, 6 Apr 2009 16:54:15 +0000 (18:54 +0200)]
server: Use para_sigaction() to install the temporary SIGCHLD handler.
Andre Noll [Mon, 6 Apr 2009 16:41:37 +0000 (18:41 +0200)]
Use para_sigaction() in command handlers.
This allows to get rid of an ugly hack for solaris. The patch also adds checks
for whether the signals were reset sucessfully in the command handler and
aborts early on errors.
Andre Noll [Mon, 6 Apr 2009 15:53:46 +0000 (17:53 +0200)]
Introduce para_sigaction().
This wrapper for sigaction() is public and may be used to setup
a handler different from the generic handler that gets installed
for the signal by para_install_sighandler().
Andre Noll [Mon, 6 Apr 2009 15:45:44 +0000 (17:45 +0200)]
signal: Switch from signal() to sigaction.
Use of signal() should be avoided because the behavior of signal() varies
across Unix versions, and has also varied historically across different
versions of Linux.
This patch rewrites para_install_sighandler so that it calls sigaction()
instead of signal(). The implementation is taken from good old APUE.
There are a couple of other users of signal() in the paraslash code. Most
of which are OK because they use signal() only to ignore/reset a signal which
happens to be the only portable use of signal(). All other users of signal()
have to be converted in subsequent patches.
Andre Noll [Sat, 28 Mar 2009 18:15:01 +0000 (19:15 +0100)]
Auto-adjust fecdec output buffer size.
Andre Noll [Sat, 28 Mar 2009 18:13:56 +0000 (19:13 +0100)]
Fix a memory leak in the fecdec filter.
Andre Noll [Sat, 28 Mar 2009 18:13:23 +0000 (19:13 +0100)]
fecdec: Return an error on zero size slices.
Andre Noll [Sun, 22 Mar 2009 18:53:27 +0000 (19:53 +0100)]
INSTALL: Minor improvements.
Andre Noll [Sun, 22 Mar 2009 12:58:28 +0000 (13:58 +0100)]
Fix some memory leaks.
In fact, there was only one "real" leak: An empty info string (100
bytes) could leak on file change.
Andre Noll [Sun, 22 Mar 2009 11:23:21 +0000 (12:23 +0100)]
Destroy the close_on_fork_list in close_listed_fds().
This is called from child context and the child does no longer
need the list once all fds have been closed.
Andre Noll [Sat, 21 Mar 2009 16:46:43 +0000 (17:46 +0100)]
server: Use a temporary SIGCHLD handler to catch afs init failures.
If afs dies immediately on startup (because of dirty tables) para_server
would not notice as the SIGCHLD handler is being intalled after the
call to afs_init().
Andre Noll [Thu, 19 Mar 2009 21:51:17 +0000 (22:51 +0100)]
audiod: Improve display of play time.
Keeping track of the offset, server stream start and the duration
of the audio file length at the time the receiver/writer was started
allows to compute the play time more accurately.
Andre Noll [Wed, 18 Mar 2009 22:05:22 +0000 (23:05 +0100)]
Fix various dead stores found by the clang static analyzer.
Andre Noll [Wed, 18 Mar 2009 19:16:03 +0000 (20:16 +0100)]
udp_send: Also mention the FEC parameters of all targets.
Andre Noll [Wed, 18 Mar 2009 19:15:27 +0000 (20:15 +0100)]
wav: Replace assertion by a proper error message.
This assertion can be hit easily by choosing wav as the first filter
of the filter chain.
Andre Noll [Tue, 17 Mar 2009 23:00:08 +0000 (00:00 +0100)]
GET_NUM_DIGITS: Evaluate macro parameter only once.
Andre Noll [Tue, 17 Mar 2009 22:58:58 +0000 (23:58 +0100)]
Fix possible NULL pointer dereference in afh_get_header().
Andre Noll [Sun, 15 Mar 2009 17:59:48 +0000 (18:59 +0100)]
mp3: Avoid rounding errors during bitrate calculation.
Just add up the bitrates of all frames and divide by the number
of frames afterwards. By using uint64_t for the sum, we should
be safe wrt. overflows.
Andre Noll [Sun, 15 Mar 2009 16:36:19 +0000 (17:36 +0100)]
Fix year in comment to color.c.
The code was actually stolen this year :)
Andre Noll [Sun, 15 Mar 2009 16:35:37 +0000 (17:35 +0100)]
alsa: Split alsa_open().
Only perform what is absolutely necessary in alsa_open(). Call the
real alsa initialization from alsa_post_select(), when we actually
have audio data available to start streaming.
This should get rid of the sound artefacts that happen sometimes
at the beginning of the stream.
Andre Noll [Sun, 15 Mar 2009 16:14:50 +0000 (17:14 +0100)]
write: Get rid of wn->chunk_bytes and wng->max_chunk_bytes.
These are not used anyway. Make all writers return 1 on success.
Andre Noll [Sun, 15 Mar 2009 16:08:14 +0000 (17:08 +0100)]
Minor documentation updates.
Andre Noll [Sun, 15 Mar 2009 14:47:45 +0000 (15:47 +0100)]
alsa: Simplify alsa_open().
No need to call snd_pcm_info() as we do not use it anyway.
Andre Noll [Sun, 15 Mar 2009 14:29:12 +0000 (15:29 +0100)]
audiod: Improve receiver restart logic.
Use the vss status flags and the stream_start time announced by
para_server to decide when to start a new receiver.
This is better than basing this decision only on whether the vss status
equals "playing" as we did before. This allows to reliably detect when it
is safe to start a new receiver while the filter/writer of the current
stream are still active.
The old code would simply wait until filter/writer complete which, due to
buffering, might be much too late.
Andre Noll [Thu, 12 Mar 2009 20:39:59 +0000 (21:39 +0100)]
vss: Take fec group durations into account when computing the eof barrier.
On eof, we must wait at least as long as the duration of the last sent
fec group.
Andre Noll [Thu, 12 Mar 2009 20:38:07 +0000 (21:38 +0100)]
Fix a typo in the documentation to struct writer.
Andre Noll [Thu, 12 Mar 2009 20:37:26 +0000 (21:37 +0100)]
alsa: Revert
596d1d97f90854bd941db02f1353df8e1196ccc0
This was really a brain fart. Instead, introduce a small delay
in alsa_open() that defers audio data writing by 100ms. This seems
to be enough to get rid of the buffer underruns with the udp sender.
Andre Noll [Mon, 9 Mar 2009 21:43:04 +0000 (22:43 +0100)]
audiod: Change return value of open_current_receiver() to void.
Its single caller ignores the return value.
Andre Noll [Mon, 9 Mar 2009 21:35:11 +0000 (22:35 +0100)]
Move struct status_task from audiod.h to audiod.c.
It's only used in audiod.c.
Andre Noll [Mon, 9 Mar 2009 21:01:33 +0000 (22:01 +0100)]
vss: Fix need_audio_header().
This braino caused the audio file header to be included in each FEC group.
Andre Noll [Mon, 9 Mar 2009 20:55:50 +0000 (21:55 +0100)]
vss: Improve EOF handling.
Set the "next" flag only if no more writes to fec clients happen.
Andre Noll [Mon, 9 Mar 2009 20:41:36 +0000 (21:41 +0100)]
vss: Handle errors in setup_next_fec_group() properly.
setup_next_fec_group() might return a negative value.
Andre Noll [Mon, 9 Mar 2009 20:29:27 +0000 (21:29 +0100)]
recv_afs_msg(): Fix indentation.
Andre Noll [Sun, 8 Mar 2009 20:41:27 +0000 (21:41 +0100)]
Make FEC work with oggvorbis streams.
Unfortunately, this required to rewrite large parts of the fec code
in vss.c. The new code behaves better if the FEC parameters are not
suitable for the current audio file, for example if the audio file header
does not fit into the desired number of slices. It detects this situation
and adjusts the given FEC parameters accordingly.
Andre Noll [Sun, 8 Mar 2009 18:59:17 +0000 (19:59 +0100)]
afh: Introduce afh_get_largest_chunk_size().
This will be needed by the fec code in order to validate the
fec parameters.
Andre Noll [Sun, 8 Mar 2009 18:58:08 +0000 (19:58 +0100)]
oggdec: Abort on input errors.
Andre Noll [Sun, 8 Mar 2009 18:56:53 +0000 (19:56 +0100)]
fec: Fix comment to invert_mat().