Allocate afh_info->info_string dynamically.
authorAndre Noll <maan@systemlinux.org>
Sat, 28 Jun 2008 11:35:20 +0000 (13:35 +0200)
committerAndre Noll <maan@systemlinux.org>
Sat, 28 Jun 2008 11:35:20 +0000 (13:35 +0200)
aac_afh.c
afh.h
aft.c
mood.c
mp3_afh.c
ogg_afh.c
vss.c

index 11dde5711976daad4ca42da1d6c8ca895e7a3972..fa09accb496c28bf822483e603d29294a29598cf 100644 (file)
--- 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 276452d8ba00c223802d4c8a79058fa2f5604d56..66adfd61c2006a86ea1d1e0fa79f8e11080fe140 100644 (file)
--- 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 f6cfddf904d06a4b89acf826ce6ee63a0f44686b..5bedc9281b4f23872ac329e01cce16452d786cc3 100644 (file)
--- 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 40f3cacbb7d672d4c1d6e1b60420e219e556a350..aa220f1e5d53b230b7fc03ef08060828b854fe72 100644 (file)
--- 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;
index 5a8c956d219bf1b11e6a757f7555a6ba1c605b5b..9c190ea6be2c50ef78a79134b578c508181b2c1b 100644 (file)
--- 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*/
index 0ea3569a5b3e689ba1f257b09f73b3eacf943ff3..b57e0bddc55bc4ef623387e9c2c1bb15a2d7a443 100644 (file)
--- 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 3e19b134c2670f6d729609799d4a6a445df989c2..f92e15e0d653ada1f541975876d77384ba3c5b57 100644 (file)
--- 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++;