So, I'm new to C and i've been trying to write this tool to edit the id3 tags on music files from the command line. I've been getting this error:
* glibc detected double free or corruption (top): 0x0000000000502010 **
From what I've read, I know it has something to do with freeing up memory. I'm just not really sure where to go from here, though. Anyway, my logic was that if a tag existed I'd read that tag in, then make whatever changes needed to be made from the fields specified in the command line. Here's the block that's been giving me trouble. Thanks for any insight in advance!
fopen(argv[1], "rb");
fseek(in_file, -128, SEEK_END);
fread(&tagTest, sizeof(struct iD3Tag), 1, in_file);
fclose(in_file);
for (x = 2; x < argc-1; x++)
{
if (strcmp(argv[x], "-title"))
strncpy(tagTest.title, argv[x+1], 30);
if (strcmp(argv[x], "-artist"))
strncpy(tagTest.artist, argv[x+1], 30);
if (strcmp(argv[x], "-album"))
strncpy(tagTest.album, argv[x+1], 30);
if (strcmp(argv[x], "-year"))
strncpy(tagTest.year, argv[x+1], 4);
if (strcmp(argv[x], "-comment"))
strncpy(tagTest.comment, argv[x+1], 28);
if (strcmp(argv[x], "-track"))
tagTest.track = atoi(argv[x+1]);
}
tagTest.seperator = 0;
fopen(argv[1], "r+b");
fseek(in_file, -128, SEEK_END);
fwrite(&tagTest, sizeof(struct iD3Tag), 1, in_file);
fclose(in_file);
There are no free
calls in this code, so I presume you're happy you're not double-freeing anything? Therefore, I presume you have some heap corruption here. I.e. you're writing more data into the tag than there is space for.
First, to address the point from @H2CO3, I don't believe that's the problem here. It might be that the problem he mentions does exist - in which case you'll corrupt your datafile - but it doesn't look like that's the cause of the program failure.
I think your real problem is that you never assign anything to in_file
! I think you need:
in_file = fopen (argv[1], "rb");
Some other comments:
strcmp
returns zero (false) when a string matches and non-zero (true) when it does not match ... so all your compares appear broken - that shouldn't cause corruption.