From: Andre Noll Date: Sat, 28 Jun 2008 11:35:20 +0000 (+0200) Subject: Allocate afh_info->info_string dynamically. X-Git-Tag: v0.3.3~53^2~14 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=09effd7848b2151068a4cc4b4c4c7a0b49e05e6d;hp=2968f502b9e01f5e9f0f38ac918ce6ed801b04f1 Allocate afh_info->info_string dynamically. --- diff --git a/aac_afh.c b/aac_afh.c index 11dde571..fa09accb 100644 --- a/aac_afh.c +++ b/aac_afh.c @@ -137,7 +137,7 @@ static int aac_get_file_info(char *map, size_t numbytes, ret = (afhi->chunk_table[afhi->chunks_total] - afhi->chunk_table[0]) * 8; /* bits */ ret += (channels * afhi->seconds_total * 500); /* avoid rounding error */ afhi->bitrate = ret / (channels * afhi->seconds_total * 1000); - sprintf(afhi->info_string, "%s:\n%s:\n%s:\n", + afhi->info_string = make_message("%s:\n%s:\n%s:\n", status_item_list[SI_AUDIO_FILE_INFO], status_item_list[SI_TAGINFO1], status_item_list[SI_TAGINFO2] diff --git a/afh.h b/afh.h index 276452d8..66adfd61 100644 --- a/afh.h +++ b/afh.h @@ -23,9 +23,6 @@ /** \endcond */ -/** Size of the audio_file info string. */ -#define AUDIO_FILE_INFO_SIZE 256 - /** Audio format dependent information. */ struct afh_info { /** The number of chunks this audio file contains. */ @@ -33,7 +30,7 @@ struct afh_info { /** The length of the audio file in seconds. */ long unsigned seconds_total; /** A string that gets filled in by the audio format handler. */ - char info_string[AUDIO_FILE_INFO_SIZE]; + char *info_string; /** * The table that specifies the offset of the individual pieces in * the current audio file. diff --git a/aft.c b/aft.c index f6cfddf9..5bedc928 100644 --- a/aft.c +++ b/aft.c @@ -377,7 +377,7 @@ static void load_afhi(const char *buf, struct afh_info *afhi) afhi->chunk_tv.tv_sec = read_u32(buf + CHUNK_TV_TV_SEC_OFFSET); afhi->chunk_tv.tv_usec = read_u32(buf + CHUNK_TV_TV_USEC_OFFSET); ms2tv(read_u16(buf + AFHI_EOF_OFFSET), &afhi->eof_tv); - strcpy(afhi->info_string, buf + AFHI_INFO_STRING_OFFSET); + afhi->info_string = para_strdup(buf + AFHI_INFO_STRING_OFFSET); } static unsigned sizeof_chunk_table(struct afh_info *afhi) @@ -660,11 +660,11 @@ int open_and_update_audio_file(struct osl_row *aft_row, long score, ret = get_afhi_of_row(aft_row, &afd->afhi); if (ret < 0) return ret; + afd->afhi.chunk_table = NULL; ret = osl_open_disk_object(audio_file_table, aft_row, AFTCOL_CHUNKS, &chunk_table_obj); if (ret < 0) - return ret; - afd->afhi.chunk_table = NULL; + goto err; ret = mmap_full_file(path, O_RDONLY, &map.data, &map.size, &afd->fd); if (ret < 0) @@ -684,14 +684,15 @@ int open_and_update_audio_file(struct osl_row *aft_row, long score, load_chunk_table(&afd->afhi, chunk_table_obj.data); { struct ls_data d = { - .afhi = afd->afhi, + .afhi = afd->afhi, /* struct copy */ .afsi = old_afsi, .path = path, .score = score, .hash = file_hash }; struct para_buffer pb = {.max_size = VERBOSE_LS_OUTPUT_SIZE - 1}; - ret = make_status_items(&d, &pb); + ret = make_status_items(&d, &pb); /* frees info string */ + afd->afhi.info_string = NULL; if (ret < 0) goto err; strncpy(afd->verbose_ls_output, pb.buf, VERBOSE_LS_OUTPUT_SIZE); @@ -704,6 +705,7 @@ int open_and_update_audio_file(struct osl_row *aft_row, long score, ret = save_afd(afd); err: free(afd->afhi.chunk_table); + free(afd->afhi.info_string); osl_close_disk_object(&chunk_table_obj); return ret; } @@ -872,15 +874,19 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, char asc_hash[2 * HASH_SIZE + 1]; char *att_lines, *lyrics_lines, *image_lines, *filename_lines; - if (opts->mode == LS_MODE_SHORT) - return para_printf(b, "%s\n", d->path); - if (opts->mode == LS_MODE_CHUNKS) - return print_chunk_table(d, b); + if (opts->mode == LS_MODE_SHORT) { + ret = para_printf(b, "%s\n", d->path); + goto out; + } + if (opts->mode == LS_MODE_CHUNKS) { + ret = print_chunk_table(d, b); + goto out; + } get_attribute_bitmap(&afsi->attributes, att_buf); ret = get_local_time(&afsi->last_played, last_played_time, sizeof(last_played_time), current_time, opts->mode); if (ret < 0) - return ret; + goto out; get_duration_buf(afhi->seconds_total, duration_buf, opts); if (have_score) { if (opts->mode == LS_MODE_LONG) @@ -890,7 +896,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, } if (opts->mode == LS_MODE_LONG) { - return para_printf(b, + ret = para_printf(b, "%s" /* score */ "%s " /* attributes */ "%*d " /* image_id */ @@ -916,6 +922,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, last_played_time, d->path ); + goto out; } hash_to_asc(d->hash, asc_hash); att_lines = make_attribute_lines(att_buf, afsi); @@ -931,7 +938,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, last_played_time, bn? bn : "?"); if (ret < 0) - return ret; + goto out; } ret = para_printf(b, "%s" /* filename stuff */ @@ -973,7 +980,7 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, status_item_list[SI_NUM_CHUNKS], afhi->chunks_total ); if (ret < 0) - return ret; + goto out; if (opts->mode == LS_MODE_MBOX) { struct osl_object lyrics_def; lyr_get_def_by_id(afsi->lyrics_id, &lyrics_def); @@ -987,6 +994,8 @@ static int print_list_item(struct ls_data *d, struct ls_options *opts, free(lyrics_lines); free(image_lines); free(filename_lines); +out: + free(afhi->info_string); return ret; } @@ -1221,7 +1230,7 @@ static int prepare_ls_row(struct osl_row *row, void *ls_opts) d->path = path; ret = get_hash_of_row(aft_row, &d->hash); if (ret < 0) - return ret; + goto err; w = &options->widths; GET_NUM_DIGITS(d->afsi.image_id, &num_digits); w->image_id_width = PARA_MAX(w->image_id_width, num_digits); @@ -1243,6 +1252,9 @@ static int prepare_ls_row(struct osl_row *row, void *ls_opts) d->score = score; } return 1; +err: + free(d->afhi.info_string); + return ret; } static void com_ls_callback(int fd, const struct osl_object *query) @@ -1801,8 +1813,10 @@ out_free: send_ret = send_va_buffer(pad->fd, "failed to add %s (%s)\n", path, para_strerror(-ret)); free(obj.data); - if (afhi_ptr) + if (afhi_ptr) { free(afhi_ptr->chunk_table); + free(afhi_ptr->info_string); + } /* Stop adding files only on send errors. */ return send_ret; } diff --git a/mood.c b/mood.c index 40f3cacb..aa220f1e 100644 --- a/mood.c +++ b/mood.c @@ -266,6 +266,7 @@ static int add_item_score(const struct osl_row *row, struct mood_item *item, lon ret = get_afhi_of_row(row, &afhi); if (ret< 0) return ret; + free(afhi.info_string); /* don't need the tag info */ ret = get_audio_file_path_of_row(row, &path); if (ret< 0) return ret; diff --git a/mp3_afh.c b/mp3_afh.c index 5a8c956d..9c190ea6 100644 --- a/mp3_afh.c +++ b/mp3_afh.c @@ -138,7 +138,7 @@ static void write_info_str(struct afh_info *afhi) { int v = mp3.id3_isvalid; - snprintf(afhi->info_string, MMD_INFO_SIZE, + afhi->info_string = make_message( "%s: %cbr, %s\n" /* audio file info*/ "%s: %s, by %s\n" /* taginfo1 */ "%s: A: %s, Y: %s, C: %s\n", /* taginfo 2*/ diff --git a/ogg_afh.c b/ogg_afh.c index 0ea3569a..b57e0bdd 100644 --- a/ogg_afh.c +++ b/ogg_afh.c @@ -267,8 +267,7 @@ static int ogg_get_file_info(char *map, size_t numbytes, afhi->bitrate = ov_bitrate(&of, 0) / 1000; afhi->channels = vi->channels; afhi->chunks_total = ogg_compute_chunk_table(&of, afhi, afhi->seconds_total); - afhi->info_string[0] = '\0'; - sprintf(afhi->info_string, "%s:\n%s:\n%s:\n", + afhi->info_string = make_message("%s:\n%s:\n%s:\n", status_item_list[SI_AUDIO_FILE_INFO], status_item_list[SI_TAGINFO1], status_item_list[SI_TAGINFO2] diff --git a/vss.c b/vss.c index 3e19b134..f92e15e0 100644 --- a/vss.c +++ b/vss.c @@ -186,8 +186,6 @@ static struct timeval *vss_compute_timeout(struct vss_task *vsst) static void vss_eof(struct vss_task *vsst) { - char *tmp; - mmd->stream_start = *now; if (!vsst->map) return; @@ -203,12 +201,10 @@ static void vss_eof(struct vss_task *vsst) mmd->afd.afhi.chunk_tv.tv_usec = 0; free(mmd->afd.afhi.chunk_table); mmd->afd.afhi.chunk_table = NULL; - tmp = make_message("%s:\n%s:\n%s:\n", status_item_list[SI_AUDIO_FILE_INFO], + free(mmd->afd.afhi.info_string); + mmd->afd.afhi.info_string = make_message("%s:\n%s:\n%s:\n", status_item_list[SI_AUDIO_FILE_INFO], status_item_list[SI_TAGINFO1], status_item_list[SI_TAGINFO2]); - strncpy(mmd->afd.afhi.info_string, tmp, sizeof(mmd->afd.afhi.info_string)); - mmd->afd.afhi.info_string[sizeof(mmd->afd.afhi.info_string) - 1] = '\0'; make_empty_status_items(mmd->afd.verbose_ls_output); - free(tmp); mmd->mtime = 0; mmd->size = 0; mmd->events++;