From c91ff5bca6a9161354e9baf85423d1498c832696 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 15 Sep 2007 18:32:32 +0200 Subject: [PATCH] Invalidate table pointers on shutdown. This caused a segfault when com_init() was invoked twice because osl was trying to close an already closed table. Also, add a bunch of error descriptions. --- aft.c | 3 ++- attribute.c | 1 + error.h | 28 ++++++++++++++-------------- score.c | 1 + 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/aft.c b/aft.c index 40dc1d92..0b07fa17 100644 --- a/aft.c +++ b/aft.c @@ -69,7 +69,7 @@ int load_afsi(struct afs_info *afsi, struct osl_object *obj) { char *buf = obj->data; if (obj->size < AFSI_SIZE) - return -E_BAD_AFS; + return -E_BAD_AFSI; afsi->last_played = read_u64(buf + AFSI_LAST_PLAYED_OFFSET); afsi->attributes = read_u64(buf + AFSI_ATTRIBUTES_OFFSET); afsi->num_played = read_u32(buf + AFSI_NUM_PLAYED_OFFSET); @@ -1704,6 +1704,7 @@ err: void aft_shutdown(enum osl_close_flags flags) { osl_close_table(audio_file_table, flags); + audio_file_table = NULL; } /** diff --git a/attribute.c b/attribute.c index af3dfb06..f3398727 100644 --- a/attribute.c +++ b/attribute.c @@ -377,6 +377,7 @@ err: void attribute_shutdown(enum osl_close_flags flags) { osl_close_table(attribute_table, flags); + attribute_table = NULL; } int attribute_init(struct table_info *ti, const char *db) diff --git a/error.h b/error.h index 5763f528..19f00d21 100644 --- a/error.h +++ b/error.h @@ -112,19 +112,19 @@ extern const char **para_errlist[]; PARA_ERROR(NO_COMPARE_FUNC, "fixme"), \ PARA_ERROR(NULL_OBJECT, "fixme"), \ PARA_ERROR(BAD_DATA_SIZE, "fixme"), \ - PARA_ERROR(NOT_MAPPED, "fixme"), \ - PARA_ERROR(ALREADY_MAPPED, "fixme"), \ + PARA_ERROR(NOT_MAPPED, "file not mapped"), \ + PARA_ERROR(ALREADY_MAPPED, "file already mapped"), \ PARA_ERROR(BAD_SIZE, "fixme"), \ PARA_ERROR(TRUNC, "fixme"), \ PARA_ERROR(UNLINK, "fixme"), \ - PARA_ERROR(EXIST, "fixme"), \ - PARA_ERROR(ISDIR, "fixme"), \ - PARA_ERROR(NOTDIR, "fixme"), \ + PARA_ERROR(EXIST, "file or directory already exists"), \ + PARA_ERROR(ISDIR, "error: is a directory"), \ + PARA_ERROR(NOTDIR, "error: not a directory"), \ PARA_ERROR(NOENT, "fixme"), \ PARA_ERROR(OSL_PERM, "fixme"), \ PARA_ERROR(BAD_TABLE, "table not open"), \ PARA_ERROR(BAD_TABLE_HEADER, "table header corruption"), \ - PARA_ERROR(BAD_TABLE_DESC, "fixme"), \ + PARA_ERROR(BAD_TABLE_DESC, "invalid table description"), \ PARA_ERROR(RB_KEY_EXISTS, "key already exists in rbtree"), \ PARA_ERROR(RB_KEY_NOT_FOUND, "key not found in rbtree"), \ PARA_ERROR(BAD_ID, "fixme"), \ @@ -158,10 +158,10 @@ extern const char **para_errlist[]; #define AFS_ERRORS \ - PARA_ERROR(AFS_SYNTAX, "fixme"), \ - PARA_ERROR(FORK, "fixme"), \ - PARA_ERROR(BAD_TABLE_NAME, "fixme"), \ - PARA_ERROR(INPUT_TOO_LARGE, "fixme"), \ + PARA_ERROR(AFS_SYNTAX, "afs syntax error"), \ + PARA_ERROR(FORK, "fork error"), \ + PARA_ERROR(BAD_TABLE_NAME, "invalid table"), \ + PARA_ERROR(INPUT_TOO_LARGE, "input too large for stdin command"), \ #define MOOD_ERRORS \ @@ -194,16 +194,16 @@ extern const char **para_errlist[]; #define AFT_ERRORS \ - PARA_ERROR(BAD_AFS, "fixme"), \ + PARA_ERROR(BAD_AFSI, "invaid afs info"), \ PARA_ERROR(LOCALTIME, "fixme"), \ PARA_ERROR(STRFTIME, "fixme"), \ PARA_ERROR(BAD_PATH, "invalid path"), \ PARA_ERROR(BAD_SORT, "fixme"), \ PARA_ERROR(FNMATCH, "fixme"), \ PARA_ERROR(NO_MATCH, "no matches"), \ - PARA_ERROR(NO_AFHI, "fixme"), \ - PARA_ERROR(AFT_SYNTAX, "syntax error"), \ - PARA_ERROR(HASH_MISMATCH, "fixme"), \ + PARA_ERROR(NO_AFHI, "audio format handler info required"), \ + PARA_ERROR(AFT_SYNTAX, "audio file table syntax error"), \ + PARA_ERROR(HASH_MISMATCH, "hash mismatch, consider re-add"), \ #define USER_LIST_ERRORS \ diff --git a/score.c b/score.c index b53d60b3..a044faa3 100644 --- a/score.c +++ b/score.c @@ -342,6 +342,7 @@ int row_belongs_to_score_table(const struct osl_row *aft_row) void score_shutdown(enum osl_close_flags flags) { osl_close_table(score_table, flags | OSL_FREE_VOLATILE); + score_table = NULL; } /** -- 2.39.2