X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aft.c;h=f41bfadea25385c4ab1c9a169a15b0c755440c98;hp=c04d4f9c99e89afb451afe94be7fcc64461b15e1;hb=11eac668691942254a703300aecf2557a2ef4826;hpb=0c7c4d80673854527ce3c3786dd581169565b5e6 diff --git a/aft.c b/aft.c index c04d4f9c..f41bfade 100644 --- a/aft.c +++ b/aft.c @@ -1035,17 +1035,33 @@ 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; - ret = get_hash_of_row(current_aft_row, &d->hash); + /* + * get_hash_of_row() and get_audio_file_path_of_row() initialize + * 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. + */ + ret = get_hash_of_row(current_aft_row, &tmp_hash); if (ret < 0) return ret; + 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) return ret; PARA_NOTICE_LOG("%s\n", d->path); + d->path = para_strdup(d->path); + ret = get_afsi_object_of_row(current_aft_row, &afsi_obj); if (ret < 0) return ret; @@ -2518,10 +2534,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; } @@ -2579,7 +2597,8 @@ static int aft_event_handler(enum afs_events event, struct para_buffer *pb, ret = get_audio_file_path_of_row(current_aft_row, &path); if (ret < 0) return ret; - status_item_ls_data.path = path; + free(status_item_ls_data.path); + status_item_ls_data.path = para_strdup(path); make_status_items(); return 1; } case AFHI_CHANGE: { @@ -2603,6 +2622,10 @@ static int aft_event_handler(enum afs_events event, struct para_buffer *pb, * current status items are affected and simply recreate them * every time. */ + ret = get_afhi_of_row(current_aft_row, + &status_item_ls_data.afhi); + if (ret < 0) + return ret; make_status_items(); return 0; } default: