X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=eb955e019f538e3d73f38074ff657c9b86d2199d;hp=e24a5fbfe1c490d1a79b691484f9d43fd60a6266;hb=cb2bcdde7424805b9f62c152ec6dd2a1c4a68a97;hpb=bfb0f769d96dee610a25682b3b9c4218bc315b31 diff --git a/aft.c b/aft.c index e24a5fbf..eb955e01 100644 --- a/aft.c +++ b/aft.c @@ -407,7 +407,7 @@ static void load_chunk_table(struct afh_info *afhi, const struct osl_object *ct) int i; size_t sz; - if (!ct->data || ct->size < 4) { + if (!ct->data || ct->size < 4 * (afhi->chunks_total + 1)) { afhi->chunk_table = NULL; return; } @@ -589,8 +589,10 @@ static int get_hash_of_row(const struct osl_row *row, unsigned char **hash) int get_afhi_of_row(const struct osl_row *row, struct afh_info *afhi) { struct osl_object obj; - int ret = osl(osl_get_object(audio_file_table, row, AFTCOL_AFHI, - &obj)); + int ret; + + assert(row); + ret = osl(osl_get_object(audio_file_table, row, AFTCOL_AFHI, &obj)); if (ret < 0) return ret; load_afhi(obj.data, afhi); @@ -1035,24 +1037,26 @@ int open_and_update_audio_file(struct audio_file_data *afd) struct afsi_change_event_data aced; struct osl_object map, chunk_table_obj; struct ls_data *d = &status_item_ls_data; + unsigned char *tmp_hash; again: ret = score_get_best(¤t_aft_row, &d->score); if (ret < 0) return ret; /* * get_hash_of_row() and get_audio_file_path_of_row() initialize - * d->hash and d->path to point to memory-mapped files. These pointers + * their pointer argument to point to memory-mapped files. These pointers * become stale after a new audio file has been added or after the * server process received SIGHUP. For in both cases libosl unmaps and * remaps the underlying database files, and this remapping may well * change the starting address of the mapping. To avoid stale pointer * references we create copies on the heap. */ - free(d->hash); - ret = get_hash_of_row(current_aft_row, &d->hash); + ret = get_hash_of_row(current_aft_row, &tmp_hash); if (ret < 0) return ret; - d->hash = (unsigned char *)para_strdup((char *)d->hash); + if (!d->hash) + d->hash = para_malloc(HASH_SIZE); + memcpy(d->hash, tmp_hash, HASH_SIZE); free(d->path); ret = get_audio_file_path_of_row(current_aft_row, &d->path); if (ret < 0) @@ -2532,10 +2536,12 @@ static int aft_open(const char *dir) PARA_NOTICE_LOG("current audio file hash lookup: success\n"); return 1; } - PARA_NOTICE_LOG("failed to open audio file table\n"); audio_file_table = NULL; - if (ret == -OSL_ERRNO_TO_PARA_ERROR(E_OSL_NOENT)) + if (ret == -OSL_ERRNO_TO_PARA_ERROR(E_OSL_NOENT)) { + PARA_WARNING_LOG("no audio file table\n"); return 1; + } + PARA_NOTICE_LOG("failed to open audio file table\n"); return ret; } @@ -2616,8 +2622,14 @@ static int aft_event_handler(enum afs_events event, struct para_buffer *pb, /* * These events are rare. We don't bother to check whether the * current status items are affected and simply recreate them - * every time. + * whenever an audio file is open. */ + if (!current_aft_row) + return 0; + ret = get_afhi_of_row(current_aft_row, + &status_item_ls_data.afhi); + if (ret < 0) + return ret; make_status_items(); return 0; } default: