From 2276684060c12646772b85ce0e2540671660f11f Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 7 May 2023 16:16:10 +0200 Subject: [PATCH 01/16] test-lib: Write error output to stderr. This way one can run make test > /dev/null to suppress normal output but still see test failures, if any. --- t/test-lib.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/t/test-lib.sh b/t/test-lib.sh index f98d76c7..1ba70632 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -17,9 +17,12 @@ get_audio_file_paths() say_color() { + local severity=$1 + + shift if [[ "$o_nocolor" != "true" && -n "$1" ]]; then export TERM=$ORIGINAL_TERM - case "$1" in + case "$severity" in error) tput $C_BOLD; tput $C_SETAF 1;; skip) tput $C_SETAF 5;; ok) @@ -32,8 +35,11 @@ say_color() tput $C_SETAF 6;; esac fi - shift - printf "%s\n" "$*" + if [[ "$severity" == 'error' ]]; then + printf "%s\n" "$*" 1>&2 + else + printf "%s\n" "$*" + fi if [[ "$o_nocolor" != "true" && -n "$1" ]]; then tput $C_SGR0 export TERM=dumb -- 2.39.2 From 3500bbe4e698637f92b6327317496f63125a360a Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 30 May 2023 22:48:56 +0200 Subject: [PATCH 02/16] audiod_command: Remove dump_stat_client_list(). It is not very useful and can spam the log. --- audiod_command.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/audiod_command.c b/audiod_command.c index 743d73a9..df357c7a 100644 --- a/audiod_command.c +++ b/audiod_command.c @@ -81,13 +81,6 @@ static int num_clients; /** The list of all status items used by para_{server,audiod,gui}. */ const char *status_item_list[] = {STATUS_ITEMS}; -static void dump_stat_client_list(void) -{ - struct stat_client *sc; - - list_for_each_entry(sc, &client_list, node) - PARA_INFO_LOG("stat client on fd %d\n", sc->fd); -} /** * Add a status client to the list. * @@ -121,7 +114,6 @@ static int stat_client_add(int fd, uint64_t mask, int parser_friendly) if (parser_friendly) new_client->flags = SCF_PARSER_FRIENDLY; para_list_add(&new_client->node, &client_list); - dump_stat_client_list(); num_clients++; return 1; } @@ -180,7 +172,6 @@ void stat_client_write_item(int item_num) continue; /* write error or short write */ close_stat_client(sc); - dump_stat_client_list(); } free(pb.buf); free(pfpb.buf); -- 2.39.2 From 72182df7af74e974af4d85a2f4143ea66a318844 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 12 Jun 2023 18:06:10 +0200 Subject: [PATCH 03/16] server: Fix NULL pointer dereference in com_ls(). The previous commit which extended the -a option of the ls command to accept an optional argument introduced the following flaw: If the argument of -a corresponds to the name of a mood for which no files are admissible, the server crashes due to a NULL pointer dereference because mood_load() leaves the mood instance pointer uninitialized although it returns zero, indicating success. This behaviour of mood_load() contradicts the promises made in its documentation. Fix mood_load() by not special-casing the "zero admissible files" case, which even simplifies the code a bit. If all goes well but no files turn out to be admissible, we now open the score table anyway and set the mood pointer to the allocated mood as usual. Since get_statistics() may now be called with zero admissible files, we have to add a check there before dividing by the number of admissible files, Fixes: 2d2637cb4c9ab76fea6bc336b9af88fd00bf5e08 --- mood.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/mood.c b/mood.c index 804fb576..ddd2f1cc 100644 --- a/mood.c +++ b/mood.c @@ -531,6 +531,8 @@ static char *get_statistics(struct mood_instance *m, int64_t sse) unsigned n = m->stats.num; int mean_days, sigma_days; + if (n == 0) + return make_message("no admissible files\n"); mean_days = (sse - m->stats.last_played_sum / n) / 3600 / 24; sigma_days = int_sqrt(m->stats.last_played_qd / n) / 3600 / 24; return make_message( @@ -638,12 +640,6 @@ int mood_load(const char *mood_name, struct mood_instance **result, char **msg) } clock_get_realtime(&rnow); compute_correction_factors(rnow.tv_sec, &aa.m->stats); - if (aa.m->stats.num == 0) { - if (msg) - *msg = make_message("no admissible files\n"); - ret = 0; - goto out; - } if (result) score_open(&aa.m->score_table); for (i = 0; i < aa.m->stats.num; i++) { -- 2.39.2 From 04ef2e43d3658325dd3028476911a4b55c4c5dca Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 13 Jun 2023 01:14:07 +0200 Subject: [PATCH 04/16] playlist: Fix error handling of playlist_load(). We open a fresh score table if the result pointer is not NULL, indicating that we are called from com_ls() (with -a=p/foo) rather than from com_select(). However, if an error occurs afterwards, we call score_close() unconditionally. This is wrong in the result == NULL case (com_select()) because it closes the global score table which is expected to stay open. The result is a UAF, which is diagnosed by valgrind as follows: ==4767== Invalid read of size 4 ==4767== at 0x408C51E: osl_add_and_get_row (osl.c:1216) ==4767== by 0x408CA99: osl_add_row (osl.c:1348) ==4767== by 0x8060648: score_add (score.c:116) ==4767== by 0x805F08C: add_to_score_table (mood.c:451) ==4767== by 0x805FA3E: mood_load (mood.c:650) ==4767== by 0x8057ECF: activate_mood_or_playlist (afs.c:447) ==4767== by 0x8059637: com_select_callback (afs.c:1005) Fixes: 2d2637cb4c9ab76fea6bc336b9af88fd00bf5e08 --- playlist.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/playlist.c b/playlist.c index cd5fc5ad..c145b0fd 100644 --- a/playlist.c +++ b/playlist.c @@ -184,7 +184,8 @@ int playlist_load(const char *name, struct playlist_instance **result, char **ms } return pi->length; close_score_table: - score_close(pi->score_table); + if (result) + score_close(pi->score_table); free(pi); err: PARA_NOTICE_LOG("unable to load playlist %s\n", name); -- 2.39.2 From bb0aec0963b1b2da617aebda26deca576684436c Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 13 Jun 2023 01:42:39 +0200 Subject: [PATCH 05/16] afs: Fix memory leak in mood_load(). In the result != NULL case we open a fresh score table but miss to close it if add_to_score_table() fails. This should never happen, but still.. Fixes: 2d2637cb4c9ab76fea6bc336b9af88fd00bf5e08 --- mood.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mood.c b/mood.c index ddd2f1cc..94ec3cd4 100644 --- a/mood.c +++ b/mood.c @@ -663,8 +663,11 @@ int mood_load(const char *mood_name, struct mood_instance **result, char **msg) } out: free(aa.array); - if (ret < 0) + if (ret < 0) { + if (aa.m->score_table) + score_close(aa.m->score_table); destroy_mood(aa.m); + } return ret; } -- 2.39.2 From ab4c39c7cd1c6d2b03cedf5d83521c746433367b Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 20 Jun 2023 23:05:10 +0200 Subject: [PATCH 06/16] afs: Really fix memory leak in mood_load(). The previous fix was insufficient as we also have to destroy the score table in the success case, so move the freeing to destroy_mood(). Fixes: bb0aec0963b1b2da617aebda26deca576684436c --- mood.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mood.c b/mood.c index 94ec3cd4..18c02f7f 100644 --- a/mood.c +++ b/mood.c @@ -134,6 +134,8 @@ static void destroy_mood(struct mood_instance *m) if (!m) return; mp_shutdown(m->parser_context); + if (m->score_table) + score_close(m->score_table); free(m->name); free(m); } @@ -663,11 +665,8 @@ int mood_load(const char *mood_name, struct mood_instance **result, char **msg) } out: free(aa.array); - if (ret < 0) { - if (aa.m->score_table) - score_close(aa.m->score_table); + if (ret < 0) destroy_mood(aa.m); - } return ret; } -- 2.39.2 From 7e1d89b8086f022ab2a7e5ceedba2acd8c964b52 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 20 Jun 2023 22:52:07 +0200 Subject: [PATCH 07/16] server: Fix memory leak at exit. If a playlist is open on exit, we miss to free it. Not a real leak, but still.. --- afs.c | 1 + 1 file changed, 1 insertion(+) diff --git a/afs.c b/afs.c index 9db94a82..83889bb9 100644 --- a/afs.c +++ b/afs.c @@ -963,6 +963,7 @@ __noreturn void afs_init(int socket_fd) ret = schedule(&s); sched_shutdown(&s); mood_unload(); + playlist_unload(); out_close: close_afs_tables(); out: -- 2.39.2 From 205423874c2dcc43c1def1ab80e40c8bac0e3f30 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Fri, 7 Jul 2023 22:23:45 +0200 Subject: [PATCH 08/16] gui: Clear status bar after pressing . Without this a stale message such as "scrolled view: 1-36/42" remains although the window has been updated to show the bottom of the ringbuffer. --- gui.c | 1 + 1 file changed, 1 insertion(+) diff --git a/gui.c b/gui.c index 0f3a3550..66fb7870 100644 --- a/gui.c +++ b/gui.c @@ -1166,6 +1166,7 @@ static void com_cancel_scroll(void) } scroll_position = 0; redraw_bot_win(); + print_in_bar(COLOR_MSG, " "); } static void com_page_down(void) -- 2.39.2 From b67136cea57eda7551f2eeaf388e3de02a1b38b5 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 9 May 2023 20:02:09 +0200 Subject: [PATCH 09/16] server: No longer accept "sideband" and "aes_ctr128" features. Both features are used unconditionally since commit d44413588dd7 (v0.6.3-27) from three years ago when the client stopped to request the feature. We don't need to support clients older than that any more, so fail the request if these features are still requested. Clarify the comment about the sha256 feature while at it. --- command.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/command.c b/command.c index 94e9ed1c..60c2aeba 100644 --- a/command.c +++ b/command.c @@ -811,19 +811,11 @@ static int parse_auth_request(char *buf, int len, const struct user **u, *p = '\0'; p++; create_argv(p, ",", &features); - /* - * Still accept sideband and AES feature requests (as a no-op) - * because some 0.6.x clients request them. The two checks - * below may be removed after 0.7.1. - */ for (i = 0; features[i]; i++) { - if (strcmp(features[i], "sideband") == 0) - continue; - if (strcmp(features[i], "aes_ctr128") == 0) - continue; /* - * ->sha256_requested can go away after 0.7.0 but the - * check has to stay until 0.9.0. + * ->sha256_requested can go away after 0.7.0 so that + * sha256 is used unconditionally, but we need to + * accept the feature request until 0.9.0. */ if (strcmp(features[i], "sha256") == 0) cf->sha256_requested = true; -- 2.39.2 From 914ee19c1fd21834fe5f81260daafe76a4475290 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Wed, 31 May 2023 00:11:14 +0200 Subject: [PATCH 10/16] Compile with -Wsuggest-attribute=malloc. We already employ this attribute extensively to help the compiler improve optimization. However, a few malloc-like functions were not yet marked with __malloc. Fix that and enable the warning to make sure that new malloc-like functions get marked. Since not all supported compilers know about this warning option, we need to check at compile time whether the option is supported. Thanks to the existing cc-option make(1) function, this is a simple one-liner for Makefile.real. --- Makefile.real | 1 + audiod.c | 2 +- audiod.h | 2 +- mp4.c | 2 +- mp4.h | 2 +- net.c | 2 +- net.h | 2 +- ogg_afh_common.c | 2 +- ogg_afh_common.h | 2 +- send.h | 4 ++-- send_common.c | 4 ++-- 11 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Makefile.real b/Makefile.real index 21cef7c7..d67c9bff 100644 --- a/Makefile.real +++ b/Makefile.real @@ -157,6 +157,7 @@ cc-option = $(shell \ STRICT_CFLAGS += $(call cc-option, -Wformat-signedness) STRICT_CFLAGS += $(call cc-option, -Wdiscarded-qualifiers) +STRICT_CFLAGS += $(call cc-option, -Wsuggest-attribute=malloc) # To put more focus on warnings, be less verbose as default # Use 'make V=1' to see the full commands diff --git a/audiod.c b/audiod.c index 0d8f039c..7c223995 100644 --- a/audiod.c +++ b/audiod.c @@ -290,7 +290,7 @@ static int get_play_time_slot_num(void) * * \return A string that must be freed by the caller. */ -char *get_time_string(void) +__malloc char *get_time_string(void) { int ret, seconds = 0, length = stat_task->length_seconds; struct timeval *tmp, sum, sss, /* server stream start */ diff --git a/audiod.h b/audiod.h index dedb038f..39beda1b 100644 --- a/audiod.h +++ b/audiod.h @@ -15,7 +15,7 @@ extern int audiod_status; struct btr_node *audiod_get_btr_root(void); __malloc char *audiod_get_decoder_flags(void); void clear_and_dump_items(void); -char *get_time_string(void); +__malloc char *get_time_string(void); bool uid_is_whitelisted(uid_t uid); /* defined in audiod_command.c */ diff --git a/mp4.c b/mp4.c index f8515ca2..5ca1307f 100644 --- a/mp4.c +++ b/mp4.c @@ -1044,7 +1044,7 @@ free_moov: * function also returns NULL. Otherwise a copy of the tag value is returned * and the caller should free this memory when it is no longer needed. */ -char *mp4_get_tag_value(const struct mp4 *f, const char *item) +__malloc char *mp4_get_tag_value(const struct mp4 *f, const char *item) { for (unsigned n = 0; n < f->meta.count; n++) if (!strcasecmp(f->meta.tags[n].item, item)) diff --git a/mp4.h b/mp4.h index 1618aa31..c36a1f81 100644 --- a/mp4.h +++ b/mp4.h @@ -84,4 +84,4 @@ uint64_t mp4_get_duration(const struct mp4 *f); int mp4_open_meta(const struct mp4_callback *cb, struct mp4 **result); struct mp4_metadata *mp4_get_meta(struct mp4 *f); int mp4_update_meta(struct mp4 *f); -char *mp4_get_tag_value(const struct mp4 *f, const char *item); +__malloc char *mp4_get_tag_value(const struct mp4 *f, const char *item); diff --git a/net.c b/net.c index a24081f5..9b362442 100644 --- a/net.c +++ b/net.c @@ -190,7 +190,7 @@ failed: * \return In all cases the returned string is a allocated with malloc(3) and * has to be freed by the caller. */ -char *format_url(const char *url, int default_port) +__malloc char *format_url(const char *url, int default_port) { char host[MAX_HOSTLEN]; int url_port; diff --git a/net.h b/net.h index d206881c..33acfc89 100644 --- a/net.h +++ b/net.h @@ -25,7 +25,7 @@ char *parse_cidr(const char *cidr, char *addr, ssize_t addrlen, int32_t *netmask); char *parse_url(const char *url, char *host, ssize_t hostlen, int32_t *port); -char *format_url(const char *url, int default_port); +__malloc char *format_url(const char *url, int default_port); const char *stringify_port(int port, const char *transport); int lookup_address(unsigned l4type, bool passive, const char *host, diff --git a/ogg_afh_common.c b/ogg_afh_common.c index 3a5c263c..0a27a4ac 100644 --- a/ogg_afh_common.c +++ b/ogg_afh_common.c @@ -365,7 +365,7 @@ struct oac_custom_header { * * \sa \ref oac_custom_header_init(). */ -struct oac_custom_header *oac_custom_header_new(void) +__malloc struct oac_custom_header *oac_custom_header_new(void) { return zalloc(sizeof(struct oac_custom_header)); } diff --git a/ogg_afh_common.h b/ogg_afh_common.h index e0cf2d40..03bf88b5 100644 --- a/ogg_afh_common.h +++ b/ogg_afh_common.h @@ -5,7 +5,7 @@ * handlers that use the ogg container format. */ -struct oac_custom_header *oac_custom_header_new(void); +__malloc struct oac_custom_header *oac_custom_header_new(void); void oac_custom_header_init(int serial, struct oac_custom_header *h); int oac_custom_header_append(ogg_packet *op, struct oac_custom_header *h); void oac_custom_header_flush(struct oac_custom_header *h); diff --git a/send.h b/send.h index dec5b0db..3407bc5c 100644 --- a/send.h +++ b/send.h @@ -196,7 +196,7 @@ void init_sender_status(struct sender_status *ss, const struct lls_opt_result *listen_address_opt_result, int default_port, int max_clients, int default_deny); void free_sender_status(const struct sender_status *ss); -char *generic_sender_status(struct sender_status *ss, const char *name); +__malloc char *generic_sender_status(struct sender_status *ss, const char *name); void generic_com_allow(struct sender_command_data *scd, struct sender_status *ss); void generic_com_deny(struct sender_command_data *scd, @@ -204,7 +204,7 @@ void generic_com_deny(struct sender_command_data *scd, void generic_com_on(struct sender_status *ss, unsigned protocol); void generic_acl_deplete(struct list_head *acl); void generic_com_off(struct sender_status *ss); -char *generic_sender_help(void); +__malloc char *generic_sender_help(void); struct sender_client *accept_sender_client(struct sender_status *ss); int send_queued_chunks(int fd, struct chunk_queue *cq); int parse_fec_url(const char *arg, struct sender_command_data *scd); diff --git a/send_common.c b/send_common.c index 26502cab..8dc82e9c 100644 --- a/send_common.c +++ b/send_common.c @@ -181,7 +181,7 @@ void free_sender_status(const struct sender_status *ss) * * \return The string printed in the "si" command. */ -char *generic_sender_status(struct sender_status *ss, const char *name) +__malloc char *generic_sender_status(struct sender_status *ss, const char *name) { char *clnts = NULL, *ret, *addr = NULL; struct sender_client *sc, *tmp_sc; @@ -413,7 +413,7 @@ warn: * \return A dynamically allocated string containing the help text for * a paraslash sender. */ -char *generic_sender_help(void) +__malloc char *generic_sender_help(void) { return make_message( "usage: {on|off}\n" -- 2.39.2 From 685698f0adeb1906f14a1b05d976943cba4ca7e3 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 19 Jun 2023 19:56:26 +0200 Subject: [PATCH 11/16] create_argv_offset(): Use arr_zalloc(). There is no point in initializing the allocated array manually, and it does not hurt to initialize also the last element. --- string.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/string.c b/string.c index 46b34623..423fd296 100644 --- a/string.c +++ b/string.c @@ -739,13 +739,11 @@ void free_argv(char **argv) static int create_argv_offset(int offset, const char *buf, const char *delim, char ***result) { - char *word, **argv = arr_alloc(offset + 1, sizeof(char *)); + char *word, **argv = arr_zalloc(offset + 1, sizeof(char *)); const char *p; int i, ret; - for (i = 0; i < offset; i++) - argv[i] = NULL; - for (p = buf; p && *p; p += ret, i++) { + for (p = buf, i = offset; p && *p; p += ret, i++) { ret = get_next_word(p, delim, &word); if (ret < 0) goto err; -- 2.39.2 From 3e0b33d1daabc885c6fb9a8f9efca307a724bc40 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 19 Jun 2023 21:24:29 +0200 Subject: [PATCH 12/16] string.c: Don't fall back to /tmp in para_homedir(). This can only lead to trouble. If we can't get the path to the home directory, something is deeply wrong and we really should abort. --- string.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/string.c b/string.c index 423fd296..d8bd027b 100644 --- a/string.c +++ b/string.c @@ -308,15 +308,32 @@ __must_check __malloc char *para_logname(void) } /** - * Get the home directory of the current user. + * Get the home directory of the calling user. * * \return A dynamically allocated string that must be freed by the caller. If - * the home directory could not be found, this function returns "/tmp". + * no entry is found which matches the UID of the calling process, or any other + * error occurs, the function prints an error message and aborts. + * + * \sa getpwuid(3), getuid(2). */ __must_check __malloc char *para_homedir(void) { - struct passwd *pw = getpwuid(getuid()); - return para_strdup(pw? pw->pw_dir : "/tmp"); + struct passwd *pw; + + /* + * To distinguish between the error case and the "not found" case we + * have to check errno after getpwuid(3). The manual page recommends to + * set it to zero before the call. + */ + errno = 0; + pw = getpwuid(getuid()); + if (pw) + return para_strdup(pw->pw_dir); + if (errno != 0) + PARA_EMERG_LOG("getpwuid error: %s\n", strerror(errno)); + else + PARA_EMERG_LOG("no pw entry for uid %u\n", (unsigned)getuid()); + exit(EXIT_FAILURE); } /** -- 2.39.2 From 8666d72932985ba872130d671ecd1785e2bdce21 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 20 Jun 2023 20:49:06 +0200 Subject: [PATCH 13/16] audiod: Improve stat_client_add(). Let it receive a bool rather than an int and dedox its documentation because it's a static function. --- audiod_command.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/audiod_command.c b/audiod_command.c index df357c7a..5f0b35a5 100644 --- a/audiod_command.c +++ b/audiod_command.c @@ -81,20 +81,12 @@ static int num_clients; /** The list of all status items used by para_{server,audiod,gui}. */ const char *status_item_list[] = {STATUS_ITEMS}; -/** - * Add a status client to the list. - * - * \param fd The file descriptor of the client. - * \param mask Bitfield of status items for this client. - * \param parser_friendly Enable parser-friendly output mode. - * - * Only those status items having the bit set in \a mask will be - * sent to the client. +/* + * Add a status client to the global client list and increment num_clients. * - * \return Positive value on success, or -E_TOO_MANY_CLIENTS if - * the number of connected clients exceeds #MAX_STAT_CLIENTS. + * The mask parameter specifies which status items are sent to the client. */ -static int stat_client_add(int fd, uint64_t mask, int parser_friendly) +static int stat_client_add(int fd, uint64_t mask, bool parser_friendly) { struct stat_client *new_client; int ret; @@ -275,7 +267,8 @@ EXPORT_AUDIOD_CMD_HANDLER(tasks) static int com_stat(int fd, struct lls_parse_result *lpr) { - int i, ret, parser_friendly = 0; + int i, ret; + bool parser_friendly = false; uint64_t mask = 0; const uint64_t one = 1; struct para_buffer b = {.flags = 0}; @@ -287,7 +280,7 @@ static int com_stat(int fd, struct lls_parse_result *lpr) return ret; r = lls_opt_result(LSG_AUDIOD_CMD_STAT_OPT_PARSER_FRIENDLY, lpr); if (lls_opt_given(r) > 0) { - parser_friendly = 1; + parser_friendly = true; b.flags = PBF_SIZE_PREFIX; } num_inputs = lls_num_inputs(lpr); -- 2.39.2 From ed0b4c07d3dee1c2a3c250ec11ba58839671c934 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 16 Jul 2023 17:48:22 +0200 Subject: [PATCH 14/16] gui: Fix off-by-one in colorful blackness theme. Without this, on a 80 character window and the three-digit amp value, the value gets truncated unnecessarily. --- gui_theme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui_theme.c b/gui_theme.c index f71e802b..81bbe0f6 100644 --- a/gui_theme.c +++ b/gui_theme.c @@ -266,7 +266,7 @@ static void init_theme_colorful_blackness(struct gui_theme *t) d[SI_amplification].align = RIGHT; d[SI_amplification].x = 92; d[SI_amplification].y = 27; - d[SI_amplification].len = 8; + d[SI_amplification].len = 9; d[SI_techinfo].prefix = ""; d[SI_techinfo].postfix = ""; -- 2.39.2 From 9b6c71b05beb750da78bea312b8b9347d8fda21f Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sun, 7 Jan 2024 21:45:52 +0100 Subject: [PATCH 15/16] Update copyright year. --- Makefile.real | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.real b/Makefile.real index d67c9bff..bd2bd9d9 100644 --- a/Makefile.real +++ b/Makefile.real @@ -21,7 +21,7 @@ uname_s := $(shell uname -s 2>/dev/null || echo "UNKNOWN_OS") uname_rs := $(shell uname -rs) cc_version := $(shell $(CC) --version | head -n 1) GIT_VERSION := $(shell ./GIT-VERSION-GEN git-version.h) -COPYRIGHT_YEAR := 2023 +COPYRIGHT_YEAR := 2024 ifeq ("$(origin O)", "command line") build_dir := $(O) -- 2.39.2 From 2934ee80367ee9d50b99ed8d7f672d1a397b4ce0 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 12 Mar 2024 19:02:39 +0100 Subject: [PATCH 16/16] paraslash 0.7.3 --- NEWS.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/NEWS.md b/NEWS.md index 4b718d8a..d5812289 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,9 +1,24 @@ NEWS ==== ----------------------------------------------- -0.7.3 (to be announced) "weighted correctness" ----------------------------------------------- +--------------------------------------------- +0.7.4 (to be announced) "genetic contraction" +--------------------------------------------- + +Downloads: +[tarball](./releases/paraslash-git.tar.xz) + +----------------------------------------- +0.7.3 (2024-03-12) "weighted correctness" +----------------------------------------- + +The highlight of this release is the new "ls --admissible=m/foo" +feature described below. Other user-visible changes include minor +additions to the "ls" and "select" server commands. The release also +includes a fair number of cleanups for the crypto code and the file +descriptor utilities, both without visible effects. Old ssh keys +and outdated openssl library versions are now deprecated and cause +warnings. - Old style PEM keys are now deprecated. They still work but their use results in a run-time warning. The removal of PEM key support is @@ -23,7 +38,8 @@ NEWS - Cleanup of the openssl-specific code. Downloads: -[tarball](./releases/paraslash-git.tar.xz) +[tarball](./releases/paraslash-0.7.3.tar.xz), +[signature](./releases/paraslash-0.7.3.tar.xz.asc) ------------------------------------- 0.7.2 (2023-03-08) "optical friction" -- 2.39.2