5 months agoMerge branch 'refs/heads/t/ubsan'
Andre Noll [Sun, 28 Nov 2021 17:10:11 +0000 (18:10 +0100)]
Merge branch 'refs/heads/t/ubsan'

A single patch which adds an option to ./configure to instruct the
compiler to activate its undefined behaviour checker.

Cooking for two months.

* refs/heads/t/ubsan:
  New configure option: --enable-ubsan.

5 months agodaemon: Improve documentation of daemon_set_log_color_or_die().
Andre Noll [Tue, 19 Oct 2021 19:36:54 +0000 (21:36 +0200)]
daemon: Improve documentation of daemon_set_log_color_or_die().

The function receives a severity string, not a log level number.

5 months agoMerge branch 'refs/heads/t/duration-keyword'
Andre Noll [Mon, 22 Nov 2021 13:39:27 +0000 (14:39 +0100)]
Merge branch 'refs/heads/t/duration-keyword'

A single patch which was created already in 2018 but did not propagate
to next and master for no good reason.

Cooking for a month.

* refs/heads/t/duration-keyword:
  mood: Make "duration" a new keyword for the mood grammar.

6 months agoerror.h: Document the error code enumeration.
Andre Noll [Mon, 15 Nov 2021 20:35:25 +0000 (21:35 +0100)]
error.h: Document the error code enumeration.

Doxygen complains about the missing comment.

6 months agocommand.c: Remove unused includes.
Andre Noll [Wed, 20 Oct 2021 21:48:28 +0000 (23:48 +0200)]
command.c: Remove unused includes.

None of these are needed. Tested on Linux, FreeBSD and NetBSD.

6 months agoMerge branch 'refs/heads/t/score-formula'
Andre Noll [Thu, 18 Nov 2021 15:23:20 +0000 (16:23 +0100)]
Merge branch 'refs/heads/t/score-formula'

A single patch which modifies the score function of the audio file
selector to re-scale the two quantities that comprise the score value.

Cooking for six months.

* refs/heads/t/score-formula:
  Rework score formula.

6 months agoMerge branch 'refs/heads/t/list-cleanups'
Andre Noll [Mon, 15 Nov 2021 18:31:41 +0000 (19:31 +0100)]
Merge branch 'refs/heads/t/list-cleanups'

A bunch of simple patches which streamline the macros and inline
functions of list.h which were taken from linux long ago without
adjusting the coding style.

Cooking for three months.

* refs/heads/t/list-cleanups:
  list.h: Convert INIT_LIST_HEAD macro to inline function.
  list.h: Fix parameter doc of iterators.
  list.h: Move list_is_singular() up.
  list.h: Rename argument of list_move().
  list.h: Don't use "new" as an variable name.
  list.h: Open-code LIST_POISON1 and LIST_POISON2.
  list.h: Get rid of internal helpers.
  list.h: Trivial cleanups.
  list.h: Remove unused list_for_each_entry_safe_reverse.

6 months agoi9e: Fix typo: s/ie9/i9e.
Andre Noll [Mon, 18 Oct 2021 20:25:01 +0000 (22:25 +0200)]
i9e: Fix typo: s/ie9/i9e.

It's weird that this was not noticed for so long.

Fixes: e541d7bea7febed8cb9f8a65ae4bd9bdd1b5c8a0
Fixes: 3e3d8e1b48bbd8dbf46adf517c311b5e78dc820f

6 months agoRemove unused error code E_OGG_STREAM_FLUSH.
Andre Noll [Sun, 7 Nov 2021 21:39:16 +0000 (22:39 +0100)]
Remove unused error code E_OGG_STREAM_FLUSH.

The last user was removed four years ago.

Fixes: c8466194a4842e319abdedfb38ddc93630e25471

6 months agoweb: Fix typo on documentation page.
Andre Noll [Sun, 7 Nov 2021 15:37:41 +0000 (16:37 +0100)]
web: Fix typo on documentation page.

This typo was introduced four years ago when para_fade was renamed
to para_mixer.

Fixes: 7031f4e380b429e9c0eea1b8e5484dabdbb12ae5

6 months agoMerge branch 'refs/heads/t/writer_improvements'
Andre Noll [Sun, 7 Nov 2021 16:07:24 +0000 (17:07 +0100)]
Merge branch 'refs/heads/t/writer_improvements'

A small set of patches which fix some minor issues, notably a problem
related to the handling of early EOF which affects all paraslash

* refs/heads/t/writer_improvements:
  alsa_write: Avoid spurious underrun warnings.
  Teach writers to abort gracefully on early EOF.
  alsa_write: Simplify alsa_post_select().

6 months agoweb: Fix internal link to manual.
Andre Noll [Thu, 4 Nov 2021 20:14:57 +0000 (21:14 +0100)]
web: Fix internal link to manual.

This must have worked at some point...

Looks like it's no good idea to assume that these identifiers are
stable across markdown versions...

6 months agoparaslash 0.6.4
Andre Noll [Thu, 4 Nov 2021 16:15:26 +0000 (17:15 +0100)]
paraslash 0.6.4

Another v0.6 release to mark the destination of the maint branch
which will now be fast-forwarded to this commit. Subsequent merges
of topic branches into master will incorporate incompatible changes,
so from now on the master branch should be regarded as pre-0.7.

6 months agoMerge branch 'maint'
Andre Noll [Thu, 4 Nov 2021 16:10:34 +0000 (17:10 +0100)]
Merge branch 'maint'

* maint:
  paraslash 0.5.9

6 months agoparaslash 0.5.9
Andre Noll [Thu, 4 Nov 2021 15:56:56 +0000 (16:56 +0100)]
paraslash 0.5.9

A final v0.5-release to record the tip of the maint branch when
paraslash-0.5 became EOL. Shortly after this commit the 0.6.4 release
will be drawn from master, and maint will be fast-forwarded to point
to the v0.6.4 commit.

6 months agocommand.c: Make aux_info_cb() static.
Andre Noll [Thu, 28 Oct 2021 12:44:25 +0000 (14:44 +0200)]
command.c: Make aux_info_cb() static.

It is only used in command.c.

6 months agostring: Remove malloc attribute from para_realloc().
Andre Noll [Tue, 26 Oct 2021 18:19:58 +0000 (20:19 +0200)]
string: Remove malloc attribute from para_realloc().

Quoting from the corresponding section of the gcc-10 manual:

This tells the compiler that a function is 'malloc'-like, i.e.,
that the pointer P returned by the function cannot alias any other
pointer valid when the function returns, and moreover no pointers to
valid objects occur in any storage addressed by P.

Using this attribute can improve optimization. Compiler predicts
that a function with the attribute returns non-null in most cases.
Functions like 'malloc' and 'calloc' have this property because they
return a pointer to uninitialized or zeroed-out storage. However,
functions like 'realloc' do not have this property, as they can return
a pointer to storage containing pointers.

Found by code inspection, the unpached code never caused problems.
Also, the function definition in string.c does not contain the

6 months agoalsa_write: Avoid spurious underrun warnings.
Andre Noll [Fri, 27 Aug 2021 13:52:43 +0000 (15:52 +0200)]
alsa_write: Avoid spurious underrun warnings.

Receiving EPIPE does not necessarily mean that an underrun occurred. We
also have to check the pcm state.

6 months agoTeach writers to abort gracefully on early EOF.
Andre Noll [Sun, 5 Sep 2021 18:16:59 +0000 (20:16 +0200)]
Teach writers to abort gracefully on early EOF.

For very short streams it may happen that the receiver and decoder
unregister themselves from the buffer tree before the writer had a
chance to query the information from the decoder which it needs to
open the audio device. This leads to errors such as

Aug 25 14:24:51 schubert (5) get_btr_value: cmd sample_rate: Operation not supported
Aug 25 14:24:51 schubert (5) get_btr_value: cmd channels: Operation not supported
Aug 25 14:24:51 schubert (5) get_btr_value: cmd sample_format: Operation not supported
Aug 25 14:24:51 schubert (4) alsa_init: channels count not available: Invalid argument

This may happen with all receivers, audio formats and writers,
although it is most common with ogg streams.

This commit changes get_btr_sample_rate() and friends to return a
standard error code rather than assuming success. The alsa, ao and
oss writers are patched to check the return value and fail gracefully
if one of these functions fails.

6 months agoalsa_write: Simplify alsa_post_select().
Andre Noll [Sun, 5 Sep 2021 16:57:28 +0000 (18:57 +0200)]
alsa_write: Simplify alsa_post_select().

Clean up the private alsa data structure in alsa_close() and teach
this function to DTRT even if pad->handle is NULL because alsa_init()

6 months agoclient_common: Improve documentation of client_{pre,post}_select().
Andre Noll [Tue, 5 Oct 2021 19:31:06 +0000 (21:31 +0200)]
client_common: Improve documentation of client_{pre,post}_select().

It was outdated and not worded very well. In particular, it referred
to a task pointer although the argument is named "context". Also,
client_open() does not return a "client data structure", so talk
about the effect of that function rather than its return value.

6 months agocompress: Demote log level of clip message.
Andre Noll [Sat, 9 Oct 2021 17:42:52 +0000 (19:42 +0200)]
compress: Demote log level of clip message.

These messages trigger from time to time without having much audible
effect, so they are usually not serious.

7 months agomood: Make "duration" a new keyword for the mood grammar.
Andre Noll [Thu, 30 Aug 2018 20:09:54 +0000 (22:09 +0200)]
mood: Make "duration" a new keyword for the mood grammar.

The new keyword makes it possible to define moods which impose a
constraint on the duration of the admissible files. For example,
the expression

duration < 120 * 1000

selects only files which are shorter than two minutes.

The implementation is pretty simple.

7 months agoRemove ->fd of struct audio file data.
Andre Noll [Sun, 5 Sep 2021 20:38:41 +0000 (22:38 +0200)]
Remove ->fd of struct audio file data.

This structure contains information about the next audio file. It
is stored in a shared memory area, and a reference to this area is
sent through a pipe from the afs process to the server process. The
file descriptor of the next audio file, however, must be passed via
Unix socket magic (SCM_RIGHTS) and thus does not need to be part of
the structure.

Moreover, it's easier to define the afd structure in
open_and_update_audio_file() of aft.c rather than in its caller,
open_next_audio_file() of afs.c, because the caller only needs the
fd of the audio file and the shared memory ID but not the audio file
data structure itself.

Expand the documentation of open_and_update_audio_file() a bit while
at it.

7 months agoaudiod: Use para_malloc().
Andre Noll [Sat, 9 Oct 2021 15:20:06 +0000 (17:20 +0200)]
audiod: Use para_malloc().

If the allocation fails we feed NULL to strncpy(3) which should
result in a segfault. With para_malloc() a clear error message will
be shown instead.

Found by gcc's -fanalyzer option.

7 months agosync_filter: Silence noisy warning.
Andre Noll [Sun, 19 Sep 2021 15:08:40 +0000 (17:08 +0200)]
sync_filter: Silence noisy warning.

It's perfectly fine to fail here due to EOF, so don't print a log
message in this case.

7 months agoafs: Improve error diagnostics if no admissible files are found.
Andre Noll [Sun, 5 Sep 2021 19:36:55 +0000 (21:36 +0200)]
afs: Improve error diagnostics if no admissible files are found.

Currently, the server prints something like the following with
loglevel error:

Sep 05 21:19:42 (4) (31845) open_next_audio_file: key not found in rbtree
Sep 05 21:19:42 (4) (31844) recv_afs_result: afs code: 1, expected: 0
Sep 05 21:19:42 (4) (31844) recv_afs_result: did not receive open fd from afs

This is both cryptic and scary, given that this error is handled by
simply clearing the play bit from the vss status flags.

This commit changes the code to only print one clear log message with
loglevel notice:

Sep 05 21:34:45 (3) (5233) log_statistics: no admissible files

7 months agoplay: Avoid gcc warning when compiling without readline.
Andre Noll [Tue, 28 Sep 2021 20:05:45 +0000 (22:05 +0200)]
play: Avoid gcc warning when compiling without readline.

The EXPORT_PLAY_CMD_HANDLER() macro is only used when READLINE support
is enabled, which leads to

play.c:112: warning: macro "EXPORT_PLAY_CMD_HANDLER" is not used [-Wunused-macros]

Define the macro only when HAVE_READLINE is defined by moving down
the definition to the first user, com_quit().

7 months agoserver: Wait for command handler exit also when afs dies.
Andre Noll [Tue, 21 Sep 2021 12:09:39 +0000 (14:09 +0200)]
server: Wait for command handler exit also when afs dies.

When para_server is running in foreground mode in a terminal session,
and gets signalled by hitting CTRL+C, it is unspecified whether the
server or the afs process receive the resulting SIGINT first. It may
even happen that the afs process dies first, and that the server sees
the resulting SIGCHLD *before* the SIGINT.

In this case we currently don't wait for the command handlers to exit
but proceed right away with the shutdown, closing the signal pipe and
destroying the shared memory area which contains the mmd structure.
This leads to error messages on shutdown such as

Sep 21 12:38:18 (5) (29166) para_semop: semaphore set 12648470 was removed
Sep 21 12:38:18 (6) (29166) para_semop: fatal semop error Invalid argument: pid 29166
Sep 21 12:38:18 (6) (29161) generic_signal_handler: Bad file descriptor
Sep 21 12:38:18 (6) (29164) para_semop: fatal semop error Invalid argument: pid 29164
Sep 21 12:38:18 (6) (29165) command_handler_sighandler: terminating on signal 15
Sep 21 12:38:18 (6) (29165) para_semop: fatal semop error Invalid argument: pid 29165

This commit avoids the issue by letting the server wait for all
its children also in the SIGCHILD case when we exit because the afs
process has terminated.

7 months agovss: Avoid double free on exit.
Andre Noll [Mon, 20 Sep 2021 18:42:37 +0000 (20:42 +0200)]
vss: Avoid double free on exit.

When para_server fails to receive the fd for the next audio file,
the memory pointed to by mmd->afd.afhi.chunk_table is freed but the
pointer is not set to NULL. If the failure was due to server and afs
receiving SIGINT, the subsequent signal handling code might attempt
to free the chunk table again. This double free error is detected by
glibc, which results resulting in messages such as

free(): invalid size

Fortunately, this is easy to fix.

7 months agovss: Handle empty chunk groups gracefully.
Andre Noll [Mon, 20 Sep 2021 17:15:12 +0000 (19:15 +0200)]
vss: Handle empty chunk groups gracefully.

The assertion in compute_group_size() triggers if the stream is
positioned right at the end of the file when the next chunk group
starts. This was observed with an mp3 file and the udp sender when
pausing and restarting the stream at the end of the file.

Fix this braino by returning EOF instead of aborting if the next
chunk group happens to be empty.

7 months agoupd sender: Don't send FEC EOF from command handler context.
Andre Noll [Mon, 20 Sep 2021 18:28:42 +0000 (20:28 +0200)]
upd sender: Don't send FEC EOF from command handler context.

Without this, the EOF packet might be sent twice: once by the command
handler which stopped the stream and once by the server process. This
does not hurt, but results in additional unnecessary network traffic,
so return early from udp_close_target() when we're running in command
handler context.

7 months agoNew configure option: --enable-ubsan.
Andre Noll [Sat, 15 Jul 2017 12:34:29 +0000 (14:34 +0200)]
New configure option: --enable-ubsan.

If the new option is given, -fsanitize=undefined is passed to the
compiler to enable the undefined behavior detector.

We don't check whether this option is supported because the configure
option is off by default.

8 months agoafh: Avoid memory leak at exit.
Andre Noll [Thu, 26 Aug 2021 17:31:25 +0000 (19:31 +0200)]
afh: Avoid memory leak at exit.

We missed to free the lopsub parse result. This is not a real leak
because it's a one-off allocation and we are about to exit anyway. It's
worth to fix nevertheless, though, because with the patch applied,
valgrind says "no leaks are possible". Hence any other output means
we have introduced a new memory leak.

8 months agoaac_afh: Fix check of return value of mp4ff_meta_update().
Andre Noll [Fri, 13 Aug 2021 19:47:47 +0000 (21:47 +0200)]
aac_afh: Fix check of return value of mp4ff_meta_update().

This function returns zero on failure, and one on success, so the
current check for a negative return value is incorrect. The call to
mp4ff_meta_get_by_index() suffers from the same mistake.

8 months agocom_jmp(): Handle negative values gracefully.
Andre Noll [Sat, 3 Jul 2021 12:36:43 +0000 (14:36 +0200)]
com_jmp(): Handle negative values gracefully.

Currently these get silently converted to a (large) unsigned number,
which causes para_server to skip to the next audio file. This patch
modifies the command handler to check whether the given value is
within range and fails the command if it is out of range.

Remove an uninteresting log message while at it.

8 months agoserver.c: Fix double "the" in comment.
Andre Noll [Sat, 28 Aug 2021 14:43:45 +0000 (16:43 +0200)]
server.c: Fix double "the" in comment.

Found by the vim spell checker.

8 months agoMerge branch 'maint'
Andre Noll [Mon, 30 Aug 2021 18:33:40 +0000 (20:33 +0200)]
Merge branch 'maint'

Just one cherry-picked commit to make the maint branch compile with
newer glibc.

* maint:
  Avoid warning about sys/sysctl.h on glibc-2.30.

8 months agoAvoid warning about sys/sysctl.h on glibc-2.30.
Andre Noll [Tue, 20 Aug 2019 07:10:53 +0000 (09:10 +0200)]
Avoid warning about sys/sysctl.h on glibc-2.30.

From glibc-2.30 NEWS:

The Linux-specific <sys/sysctl.h> header and the sysctl function have
been deprecated and will be removed from a future version of glibc.

Compilation against the glibc-2.30 headers results in the following warning:

In file included from ipc.c:10:
/usr/include/sys/sysctl.h:21:2: warning: #warning "The <sys/sysctl.h> header is deprecated and will be removed." [-Wcpp]

On NetBSD and FreeBSD, however, we still need to include the header
to get the declaration of sysctlbyname(3).

This patch changes ipc.c to include sys/sysctl.h only if __FreeBSD__ or
__NetBSD__ is defined.  Also remove the pointless check for __APPLE__.

9 months agolist.h: Convert INIT_LIST_HEAD macro to inline function.
Andre Noll [Thu, 20 May 2021 18:38:34 +0000 (20:38 +0200)]
list.h: Convert INIT_LIST_HEAD macro to inline function.

Inline functions are easier to read and write, and we get type

9 months agolist.h: Fix parameter doc of iterators.
Andre Noll [Thu, 20 May 2021 18:37:44 +0000 (20:37 +0200)]
list.h: Fix parameter doc of iterators.

9 months agolist.h: Move list_is_singular() up.
Andre Noll [Thu, 20 May 2021 18:31:46 +0000 (20:31 +0200)]
list.h: Move list_is_singular() up.

This way all simple inline functions come before the various iterators.

9 months agolist.h: Rename argument of list_move().
Andre Noll [Sat, 15 May 2021 15:30:44 +0000 (17:30 +0200)]
list.h: Rename argument of list_move().

It's only the entry that is moved to a different list, so call the
argument "entry" rather than "list".

9 months agolist.h: Don't use "new" as an variable name.
Andre Noll [Sat, 15 May 2021 15:25:25 +0000 (17:25 +0200)]
list.h: Don't use "new" as an variable name.

vim syntax highlighting trips over it.

9 months agolist.h: Open-code LIST_POISON1 and LIST_POISON2.
Andre Noll [Sat, 15 May 2021 15:22:02 +0000 (17:22 +0200)]
list.h: Open-code LIST_POISON1 and LIST_POISON2.

There is only one user of each.

9 months agolist.h: Get rid of internal helpers.
Andre Noll [Sat, 15 May 2021 15:18:24 +0000 (17:18 +0200)]
list.h: Get rid of internal helpers.

They only obfuscate the code.

9 months agolist.h: Trivial cleanups.
Andre Noll [Sat, 15 May 2021 14:18:44 +0000 (16:18 +0200)]
list.h: Trivial cleanups.

Just whitespace fixes and comment improvements.

9 months agolist.h: Remove unused list_for_each_entry_safe_reverse.
Andre Noll [Sat, 15 May 2021 13:56:06 +0000 (15:56 +0200)]
list.h: Remove unused list_for_each_entry_safe_reverse.

11 months agoplay: Create ~/.paraslash.
Andre Noll [Tue, 25 May 2021 15:10:16 +0000 (17:10 +0200)]
play: Create ~/.paraslash.

Currently para_play won't save its history if this directory does
not exist. This patch makes it create the directory at startup.

11 months agoclient.c: Fix typo in comment.
Andre Noll [Thu, 27 May 2021 14:59:10 +0000 (16:59 +0200)]
client.c: Fix typo in comment.

11 months agomanual: Fix package name of flac library.
Andre Noll [Tue, 25 May 2021 15:09:17 +0000 (17:09 +0200)]
manual: Fix package name of flac library.

These days it is spellt lower case. Also realpath is not a separate
package anymore, so drop that.

11 months agoUpdate copyright year.
Andre Noll [Tue, 25 May 2021 15:08:30 +0000 (17:08 +0200)]
Update copyright year.

11 months agoINSTALL: Fix instructions for compiling from git.
Andre Noll [Tue, 25 May 2021 15:07:43 +0000 (17:07 +0200)]
INSTALL: Fix instructions for compiling from git.

The command line lacked the configure command.

12 months agoRework score formula.
Andre Noll [Mon, 25 Nov 2019 20:22:35 +0000 (21:22 +0100)]
Rework score formula.

Currently the two scales for the num_played and the last_played
components of the score value are computed independently of each
other. There is, however, a natural link between the two scales:
a file with best possible num_played value (zero) and worst possible
last_played value (now) should receive the average score zero.

This patch employs this idea to rescale the two components. See the
new comment to compute_score() for details about the implementation.

12 months agoserver: Don't crash on blank moods.
Andre Noll [Thu, 6 May 2021 18:29:06 +0000 (20:29 +0200)]
server: Don't crash on blank moods.

We special-case empty mood definitions (because we can't map the
osl object anyway), but we don't check whether the mood definition
contains anything else than whitespace or comments.

Such blank mood definitions result in an empty abstract syntax tree
indicated by ->ast of the mood parser's context structure being
NULL. We happily dereference that pointer in mp_eval_row() and die
by the resulting SIGSEGV.

The fix is trivial: simply treat blank moods in the same way as the
dummy mood, i.e. regard each audio file as admissible.

12 months agoaft: Silence format-overflow warning with gcc-10.
Andre Noll [Wed, 28 Apr 2021 11:17:03 +0000 (13:17 +0200)]
aft: Silence format-overflow warning with gcc-10.

aft.c: In function 'print_list_item':
aft.c:736:17: warning: '%*u' directive writing between 1 and 65529 bytes into a region of size 30 [-Wformat-overflow=]
  736 |   sprintf(buf, "%*u:%02u:%02d", max_width - 6, hours, mins,
      |                 ^~~
aft.c:736:16: note: directive argument in the range [1, 4294967295]
  736 |   sprintf(buf, "%*u:%02u:%02d", max_width - 6, hours, mins,
      |                ^~~~~~~~~~~~~~~
aft.c:736:16: note: directive argument in the range [-59, 59]
aft.c:736:3: note: 'sprintf' output between 8 and 65545 bytes into a destination of size 30
  736 |   sprintf(buf, "%*u:%02u:%02d", max_width - 6, hours, mins,
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  737 |    seconds % 60);
      |    ~~~~~~~~~~~~~

The code is correct but gcc can't prove it. Silence the warning by
passing the size of the buffer and asserting that it won't overflow
before printing to it.

13 months agomanual: Fix dead link.
Andre Noll [Thu, 8 Apr 2021 15:12:02 +0000 (17:12 +0200)]
manual: Fix dead link.

As pointed out by Sven, has been out of service and
shut down the website since August of 2020. The library is still
available for download on the sourceforge project page, so link to
that page instead.

Reported-by: Sven <>
13 months agoprebuffer: Remove buffer tree node on errors.
Andre Noll [Mon, 5 Apr 2021 18:29:28 +0000 (20:29 +0200)]
prebuffer: Remove buffer tree node on errors.

When the ->post_select method of a filter returns negative, it *must*
remove its buffer tree node as well. The prebuffer missed to do that,
which results in a stale reference to the buffer tree which keeps
the audiod slot busy. When no more slots are free, audiod hangs or
exits with a "no more free slots" message. This patch avoids this.

15 months agoparaslash 0.6.3 v0.6.3
Andre Noll [Thu, 18 Feb 2021 16:46:13 +0000 (17:46 +0100)]
paraslash 0.6.3

16 months agoalsa_write: Avoid hung tasks.
Andre Noll [Thu, 7 Jan 2021 23:55:13 +0000 (00:55 +0100)]
alsa_write: Avoid hung tasks.

Without this fix the alsa writer may never shutdown, occupying a
slot of audiod. The hang was observed with in conjunction to the
udp receiver and the prebuffer filter. See also the recent commit

16 months agoMerge branch 'refs/heads/t/fec'
Andre Noll [Fri, 1 Jan 2021 15:14:13 +0000 (16:14 +0100)]
Merge branch 'refs/heads/t/fec'

A single patch which improves the memory management of the
fec encoder.

Cooking for half a year.

* refs/heads/t/fec:
  vss: Fix NULL pointer dereference in vss_del_fec_client().
  vss: Rework fec client setup.

16 months agogui: Fix length of audio format field.
Andre Noll [Thu, 22 Oct 2020 15:50:06 +0000 (17:50 +0200)]
gui: Fix length of audio format field.

Without this, the contents of the subsequent item (numplayed) are
overwritten by spaces. This only affects the colorful blackness theme.

16 months agoaft: Avoid NULL pointer dereference.
Andre Noll [Fri, 16 Oct 2020 13:49:47 +0000 (15:49 +0200)]
aft: Avoid NULL pointer dereference.

osl_get_object() must not be called with a NULL row pointer. Currently
this may happen on blob events. This patch avoids the problem and
makes sure we catch this programming error early.

16 months agoprebuffer: Bail out on bufffer tree errors.
Andre Noll [Fri, 1 Jan 2021 15:05:56 +0000 (16:05 +0100)]
prebuffer: Bail out on bufffer tree errors.

Without this, the prebuffer filter might stay active forever, occupying
a slot of para_audiod until no more slots are available. This was
observed with the udp receiver.

20 months agoReplace /* fallthrouth*/ by __attribute__ ((fallthrough));
Andre Noll [Mon, 1 Jun 2020 17:28:01 +0000 (19:28 +0200)]
Replace /* fallthrouth*/ by __attribute__ ((fallthrough));

Some (recent) gcc versions still complain because the switch case
falls through. The new code causes a warning on old compilers which
don't know the fallthrough attribute, but this is still better than
seeing the warning on systems with a recent compiler.

20 months agoaft: Avoid invalid read.
Andre Noll [Fri, 29 May 2020 23:22:49 +0000 (01:22 +0200)]
aft: Avoid invalid read.

A short chunk table is fatal for all audio formats except aac,
which employs dynamic chunks. The below valgrind spat was found when
para_server tried to open an aac audio file. Setting afhi->chunk_table
to NULL in this case should fix it.

==17667== Invalid read of size 4
==17667==    at 0x805A862: write_u32 (portable_io.h:95)
==17667==    by 0x805A862: save_chunk_table (aft.c:402)
==17667==    by 0x805A862: save_chunk_table (aft.c:395)
==17667==    by 0x805DDE6: save_afd (aft.c:616)
==17667==    by 0x805DDE6: open_and_update_audio_file (aft.c:1113)
==17667==    by 0x8058AA2: open_next_audio_file (afs.c:425)
==17667==    by 0x8058AA2: execute_server_command (afs.c:867)
==17667==    by 0x8058AA2: command_post_select.part.0 (afs.c:921)
==17667==    by 0x8063062: call_post_select (sched.c:80)
==17667==    by 0x8063062: sched_post_select (sched.c:106)
==17667==    by 0x8063062: schedule (sched.c:159)
==17667==    by 0x8059643: afs_init (afs.c:1006)
==17667==    by 0x804D747: init_afs (server.c:529)
==17667==    by 0x804D747: server_init (server.c:601)
==17667==    by 0x804D747: main (server.c:690)
==17667==  Address 0x4d7dcd0 is 0 bytes after a block of size 40 alloc'd
==17667==    at 0x40365E2: malloc (vg_replace_malloc.c:309)
==17667==    by 0x8053AB6: para_malloc (string.c:63)
==17667==    by 0x805B20D: load_chunk_table (aft.c:415)
==17667==    by 0x805DD65: open_and_update_audio_file (aft.c:1103)
==17667==    by 0x8058AA2: open_next_audio_file (afs.c:425)
==17667==    by 0x8058AA2: execute_server_command (afs.c:867)
==17667==    by 0x8058AA2: command_post_select.part.0 (afs.c:921)
==17667==    by 0x8063062: call_post_select (sched.c:80)
==17667==    by 0x8063062: sched_post_select (sched.c:106)
==17667==    by 0x8063062: schedule (sched.c:159)
==17667==    by 0x8059643: afs_init (afs.c:1006)
==17667==    by 0x804D747: init_afs (server.c:529)
==17667==    by 0x804D747: server_init (server.c:601)
==17667==    by 0x804D747: main (server.c:690)

20 months agomp: Always set mp_context to NULL on errors.
Andre Noll [Mon, 16 Mar 2020 17:44:07 +0000 (18:44 +0100)]
mp: Always set mp_context to NULL on errors.

In mp_init(), if mp_yyparse() fails, we return early without setting
the result pointer to NULL. This does not matter much because both
callers of mood.c pass in NULL, but still..

20 months agogui: Do not decode the pressed key multiple times.
Andre Noll [Tue, 28 Apr 2020 19:58:47 +0000 (21:58 +0200)]
gui: Do not decode the pressed key multiple times.

Although the key name is a loop invariant, we recompute it during
every iteration of the loop. Fix this.

20 months agogui: Have km_keyname() return const.
Andre Noll [Tue, 28 Apr 2020 19:56:38 +0000 (21:56 +0200)]
gui: Have km_keyname() return const.

We neither want the caller to write there nor to free the memory.

20 months agoserver: Add --dccp-no-autostart.
Andre Noll [Tue, 17 Mar 2020 11:43:55 +0000 (12:43 +0100)]
server: Add --dccp-no-autostart.

We already have --http-no-autostart and --udp-no-autostart. Add the
new option for consistency.

22 months agovss: Fix NULL pointer dereference in vss_del_fec_client().
Andre Noll [Sun, 19 Jul 2020 16:35:44 +0000 (18:35 +0200)]
vss: Fix NULL pointer dereference in vss_del_fec_client().

fc->src_data may well be NULL here, for example if para_server is
not currently playing.

This bug was introduced in the previous commit after the topic branch
had been promoted to next.

22 months agoafs: Improve error diagnostics.
Andre Noll [Sat, 14 Mar 2020 09:33:40 +0000 (10:33 +0100)]
afs: Improve error diagnostics.

If an afs table can not be opened, we miss to log the error reason.
Also, if the audio file table does not exist, state this fact

22 months agodoc: Add missing \ref in crypt.h.
Andre Noll [Thu, 12 Mar 2020 14:32:20 +0000 (15:32 +0100)]
doc: Add missing \ref in crypt.h.

This way, we get a warning when the name of the function changes but
the comment is left unmodified.

22 months agocrypt_common: Constify hash pointers.
Andre Noll [Thu, 12 Mar 2020 15:27:16 +0000 (16:27 +0100)]
crypt_common: Constify hash pointers.

hash_to_asc() and hash_compare() only read from the memory locations
given by these pointers.

22 months agovss: Rework fec client setup.
Andre Noll [Fri, 12 Jun 2020 01:34:32 +0000 (03:34 +0200)]
vss: Rework fec client setup.

The current fec code assumes that the chunks of the audio file form a
contigous buffer. At least for aac/m4a this is not true, which is
why streaming m4a files over udp never worked well.

This patch should be a big improvement in this regard. We now copy
the chunks to preallocated buffers, which also makes the code easier
to follow because we can get rid of the two extra buffers in struct

23 months agovss.c: Fix typo in comment.
Andre Noll [Thu, 28 May 2020 13:29:37 +0000 (15:29 +0200)]
vss.c: Fix typo in comment.

23 months agogui: Adjust position of num_played value.
Andre Noll [Sat, 6 Jun 2020 16:50:48 +0000 (18:50 +0200)]
gui: Adjust position of num_played value.

If the terminal window is only 80 characters wide, the num_played
value may be adjacent to the bitrate value, with no space between.
This happens only if the num_played value is bigger than 99, and only
with the "colorful blackness" theme.

This simple patch should fix the issue.

23 months agoAvoid audiod hangs when prebuffer filter is active.
Andre Noll [Thu, 11 Jun 2020 13:28:49 +0000 (15:28 +0200)]
Avoid audiod hangs when prebuffer filter is active.

This filter misses to honor task notifications. As a result of this
omission, when CTRL+C is pressed while audiod is running in foreground
mode and the prebuffer filter is active, the audiod process hangs.

The fix is obvious.

2 years agoMerge branch 'refs/heads/t/para_play'
Andre Noll [Sat, 16 May 2020 10:14:23 +0000 (12:14 +0200)]
Merge branch 'refs/heads/t/para_play'

A single patch which adds --end-of-playlist to control the behaviour
of para_play when the end of the playlist is reached.

Cooking for three weeks.

* refs/heads/t/para_play:
  play: New option: --end-of-playlist.

2 years agoUpdate copyright year.
Andre Noll [Sat, 11 Apr 2020 16:24:45 +0000 (18:24 +0200)]
Update copyright year.

Fortunately, there is only a single location that needs to be

2 years agoaft: Update afhi after addblob.
Andre Noll [Wed, 29 Apr 2020 15:48:09 +0000 (17:48 +0200)]
aft: Update afhi after addblob.

The old status_item_ls_data.afhi might refer to unmapped memory.

2 years agoMerge branch 'refs/heads/t/stale-pointer-fix'
Andre Noll [Mon, 23 Mar 2020 20:19:14 +0000 (21:19 +0100)]
Merge branch 'refs/heads/t/stale-pointer-fix'

This bug only triggered if the kernel changes the address of the memory
mapping of the audio file table after a file was added, and a subsequent
operation would access the then stale pointer.

Cooking for a week.

* refs/heads/t/stale-pointer-fix:
  Don't use strdup() to copy hash.
  aft: Avoid stale pointer pointer reference.

2 years agoDon't use strdup() to copy hash.
Andre Noll [Tue, 17 Mar 2020 15:18:22 +0000 (16:18 +0100)]
Don't use strdup() to copy hash.

There was a braino in the previous patch: the hash may well contain
a zero byte, so we need to use memcpy().

2 years agocommand.c: Improve documentation of handle_connect().
Andre Noll [Tue, 17 Mar 2020 08:30:22 +0000 (09:30 +0100)]
command.c: Improve documentation of handle_connect().

This text was not very precise, and it had some language issues.

2 years ago.gitignore: Remove web/dia/overview.pdf.
Andre Noll [Sun, 15 Mar 2020 13:53:35 +0000 (14:53 +0100)]
.gitignore: Remove web/dia/overview.pdf.

The overview has been removed long ago.

2 years agoaft: Avoid stale pointer pointer reference.
Andre Noll [Sun, 2 Feb 2020 15:26:16 +0000 (16:26 +0100)]
aft: Avoid stale pointer pointer reference.

We can't rely on the ->hash and ->path pointers of struct
status_item_ls_data because they both become stale when the audio
file table gets remapped. This happens for example when a new audio
file is added while another audio file is currently open. A subsequent
addblob command then triggers a re-initialization of the status items,
which reads from the stale pointer location.

This usually results in garbage in the stat output, but can also lead
to a segfault or worse. Avoid this from happening by creating a copy
of the hash and the path.

This bug has been present for a long time. It was hard to debug
because often no invalid memory accesses occur, hence valgrind does
not complain.

2 years agoMerge branch 'refs/heads/t/mixer'
Andre Noll [Sun, 15 Mar 2020 14:51:20 +0000 (15:51 +0100)]
Merge branch 'refs/heads/t/mixer'

A single patch for para_mixer which makes the subcommands which
sleep a bit more robust.

The merge conflicted due to commit d6b25bf854c1 (mixer: fade: Handle
empty mood strings gracefully) from half a year ago, but the resolution
was obvious.

Cooking for nine months.

* refs/heads/t/mixer:
  mixer: sleep/snooze: Close mixer during sleep.

2 years agoafs.c: Remove two pointless casts.
Andre Noll [Thu, 5 Mar 2020 17:50:55 +0000 (18:50 +0100)]
afs.c: Remove two pointless casts.

The type of ->data is void *, so no casts are needed.

2 years agomp3_afh: Don't bail out on short files.
Andre Noll [Sun, 24 Nov 2019 16:33:51 +0000 (17:33 +0100)]
mp3_afh: Don't bail out on short files.

It's perfectly OK to have mp3 files which are shorter than two seconds.
For example offers mp3 downloads to learn the pronuciation
of single words. These files are often shorter than one second.

The check for short length files predates the git history. Most likely
it was added for no good reason, so drop it.

2 years agoopenssl: Fix (harmless) memory leaks at exit.
Andre Noll [Wed, 11 Sep 2019 20:12:32 +0000 (22:12 +0200)]
openssl: Fix (harmless) memory leaks at exit.

Without this, valgrind --leak-check=full --show-leak-kinds=all
complains about four memory blocks reachable at exit, see below.

The first leak is fixed by the new call to ERR_remove_thread_state(),
which frees the error queue of the current thread. To squash the
other three, the call to EVP_cleanup() is needed to remove all of
openssl's internal ciphers and digests.

To make this work on both openssl-1.0 and for openssl-1.1, we need
to add additional header checks for configure.

==2818== 12 bytes in 1 blocks are still reachable in loss record 1 of 4
==2818==    at 0x40355EE: malloc (vg_replace_malloc.c:309)
==2818==    by 0x41B887C: CRYPTO_malloc (in /usr/local/lib/
==2818==    by 0x42459B7: lh_insert (in /usr/local/lib/
==2818==    by 0x4248542: int_thread_set_item (in /usr/local/lib/
==2818==    by 0x4249920: ERR_get_state (in /usr/local/lib/
==2818==    by 0x424A255: ERR_put_error (in /usr/local/lib/
==2818==    by 0x4222EF6: RSA_padding_check_PKCS1_OAEP_mgf1 (in /usr/local/lib/
==2818==    by 0x422306A: RSA_padding_check_PKCS1_OAEP (in /usr/local/lib/
==2818==    by 0x421F921: RSA_eay_private_decrypt (in /usr/local/lib/
==2818==    by 0x804F2E9: apc_priv_decrypt (openssl.c:206)
==2818==    by 0x804DB59: client_post_select (client_common.c:321)
==2818==    by 0x804CC57: call_post_select (sched.c:80)
==2818==    by 0x804CC57: sched_post_select (sched.c:106)
==2818==    by 0x804CC57: schedule (sched.c:159)
==2818== 64 bytes in 1 blocks are still reachable in loss record 2 of 4
==2818==    at 0x40355EE: malloc (vg_replace_malloc.c:309)
==2818==    by 0x41B887C: CRYPTO_malloc (in /usr/local/lib/
==2818==    by 0x4245643: lh_new (in /usr/local/lib/
==2818==    by 0x424811F: int_thread_get (in /usr/local/lib/
==2818==    by 0x4248511: int_thread_set_item (in /usr/local/lib/
==2818==    by 0x4249920: ERR_get_state (in /usr/local/lib/
==2818==    by 0x424A255: ERR_put_error (in /usr/local/lib/
==2818==    by 0x4222EF6: RSA_padding_check_PKCS1_OAEP_mgf1 (in /usr/local/lib/
==2818==    by 0x422306A: RSA_padding_check_PKCS1_OAEP (in /usr/local/lib/
==2818==    by 0x421F921: RSA_eay_private_decrypt (in /usr/local/lib/
==2818==    by 0x804F2E9: apc_priv_decrypt (openssl.c:206)
==2818==    by 0x804DB59: client_post_select (client_common.c:321)
==2818== 96 bytes in 1 blocks are still reachable in loss record 3 of 4
==2818==    at 0x40355EE: malloc (vg_replace_malloc.c:309)
==2818==    by 0x41B887C: CRYPTO_malloc (in /usr/local/lib/
==2818==    by 0x4245628: lh_new (in /usr/local/lib/
==2818==    by 0x424811F: int_thread_get (in /usr/local/lib/
==2818==    by 0x4248511: int_thread_set_item (in /usr/local/lib/
==2818==    by 0x4249920: ERR_get_state (in /usr/local/lib/
==2818==    by 0x424A255: ERR_put_error (in /usr/local/lib/
==2818==    by 0x4222EF6: RSA_padding_check_PKCS1_OAEP_mgf1 (in /usr/local/lib/
==2818==    by 0x422306A: RSA_padding_check_PKCS1_OAEP (in /usr/local/lib/
==2818==    by 0x421F921: RSA_eay_private_decrypt (in /usr/local/lib/
==2818==    by 0x804F2E9: apc_priv_decrypt (openssl.c:206)
==2818==    by 0x804DB59: client_post_select (client_common.c:321)
==2818== 400 bytes in 1 blocks are still reachable in loss record 4 of 4
==2818==    at 0x40355EE: malloc (vg_replace_malloc.c:309)
==2818==    by 0x41B887C: CRYPTO_malloc (in /usr/local/lib/
==2818==    by 0x424988C: ERR_get_state (in /usr/local/lib/
==2818==    by 0x424A255: ERR_put_error (in /usr/local/lib/
==2818==    by 0x4222EF6: RSA_padding_check_PKCS1_OAEP_mgf1 (in /usr/local/lib/
==2818==    by 0x422306A: RSA_padding_check_PKCS1_OAEP (in /usr/local/lib/
==2818==    by 0x421F921: RSA_eay_private_decrypt (in /usr/local/lib/
==2818==    by 0x804F2E9: apc_priv_decrypt (openssl.c:206)
==2818==    by 0x804DB59: client_post_select (client_common.c:321)
==2818==    by 0x804CC57: call_post_select (sched.c:80)
==2818==    by 0x804CC57: sched_post_select (sched.c:106)
==2818==    by 0x804CC57: schedule (sched.c:159)
==2818==    by 0x804AB2D: main (client.c:656)

2 years agoMerge branch 'refs/heads/t/ogg_afh'
Andre Noll [Fri, 28 Feb 2020 17:13:50 +0000 (18:13 +0100)]
Merge branch 'refs/heads/t/ogg_afh'

A patch which teaches the ogg/* audio format handlers to report the
correct length for files with holes. A bug was found in that patch
after the branch had been merged to next, so there's a fixup commit
on top.

The second patch in this series fixes an issue with
ogg_page_granulepos() that can result in incorrect estimates for the
duration of files that use the ogg container format.

Cooking for a year.

* refs/heads/t/ogg_afh:
  ogg_afh_common.c: Check return value of ogg_page_granulepos().
  ogg_afh_common: Fix signedness issue.
  ogg: Detect missing ogg pages.

2 years agovss: Improve error diagnostics.
Andre Noll [Sat, 2 Nov 2019 13:47:15 +0000 (14:47 +0100)]
vss: Improve error diagnostics.

Unless in debug loglevel, para_server prints

Nov 01 17:06:03 (4) (18596) open_next_audio_file: key not found in rbtree
Nov 01 17:06:03 (4) (18595) recv_afs_result: did not receive open fd from afs

which does not include information about what was actually received.

2 years agovss: Fix harmless memory leaks at exit.
Andre Noll [Sun, 1 Sep 2019 12:26:40 +0000 (14:26 +0200)]
vss: Fix harmless memory leaks at exit.

The leaks were introduced in commit 4fbe16430b47 (server: Add
--http-listen-address and --dccp-listen-address) from last year.

Found by valgrind.

2 years agomp3_afh: Fix whitespace issue in debug log message.
Andre Noll [Sun, 24 Nov 2019 16:32:29 +0000 (17:32 +0100)]
mp3_afh: Fix whitespace issue in debug log message.

There was no space character between the number and the word
"chunks". Add it.

2 years agocommand.c: Also invalidate play time if no audio file is open.
Andre Noll [Sat, 2 Nov 2019 13:59:29 +0000 (14:59 +0100)]
command.c: Also invalidate play time if no audio file is open.

Without this, the time string of the previous audio file is continued
to be shown in the top window of para_gui when stopped. It gets
wiped out eventually, but this can take a few seconds. With the patch
applied, the time string disappears immediately.

2 years agoMerge branch 'refs/heads/t/ssh'
Andre Noll [Sat, 23 Nov 2019 17:20:21 +0000 (18:20 +0100)]
Merge branch 'refs/heads/t/ssh'

A medium sized series which teaches both crypto backends about the
RFC4716 key format, which has become the default for ssh-keygen as
of openssh-7.8.

Was cooking for almost a year.

* refs/heads/t/ssh:
  manual: Instruct the user to create RFC4716 keys.
  openssl: Add support for RFC4716 keys
  openssl: Move get_private_key() down.
  gcrypt: Add support for RFC4716 private keys.
  crypt: Rename decoding functions.
  gcrypt: Introduce read_openssh_bignum().
  gcrypt: Factor out read_pem_rsa_params().
  gcrypt: Let read_bignum() return bits, not bytes.
  gcrypt: Let decode_key() return blob size through additional argument.
  gcrypt: Drop unnecessary arguments of decode_key().

2 years agomixer: fade: Handle empty mood strings gracefully.
Andre Noll [Sun, 1 Sep 2019 08:20:37 +0000 (10:20 +0200)]
mixer: fade: Handle empty mood strings gracefully.

Treat them as if the option was not given to prevent "para_client
select" to fail.

2 years agoMerge branch 'refs/heads/t/openssl-header-check'
Andre Noll [Sat, 2 Nov 2019 15:43:59 +0000 (16:43 +0100)]
Merge branch 'refs/heads/t/openssl-header-check'

* refs/heads/t/openssl-header-check:
  build: Check also for CRYPTO_cleanup_all_ex_data.
  build: Detect openssl library/header mismatch.

Two simple fixes for FreeBSD. Tested on 12.0-RELEASE-p10.

Cooking for nine months.

2 years agoerror.h: Document LLS_ERROR_BIT.
Andre Noll [Fri, 13 Sep 2019 06:30:47 +0000 (08:30 +0200)]
error.h: Document LLS_ERROR_BIT.

Also reformat the similar comment of OSL_ERROR_BIT to make it fit
into a single line.

2 years agosend.h: Document cpp magic.
Andre Noll [Wed, 11 Sep 2019 20:52:52 +0000 (22:52 +0200)]
send.h: Document cpp magic.

These macros are not completely trivial, so give the interested reader
an idea about how the macros help to avoid code duplication.