- 2009.10.28 16:02 "Re: [Tiff] extending tags in "a"ppend mode?", by Frank Warmerdam
- 2009.11.03 12:16 "Re: [Tiff] Tiffcrop test suite and logluv issues", by Toby Thain
2009.10.28 16:28 "Re: [Tiff] extending tags in "a"ppend mode?", by Juergen Buchmueller
On Wed, 28 Oct 2009 12:02:09 -0400
It should be possible to extend the first directory with new tags by opening in "r+" (update) mode, setting the tags and closing. I don't know why you are seeing the behavior you encountered. I would have expected it to attempt to append a new image directory and complain about your not providing a complete set of tags to define an image.
Ok, I didn't know that "r+" was supported because it isn't mentioned in
the docs.
It might be helpful if you provided a minimal program and file demonstrating your problem.
See attachment. This crashes when I try to run it on the file: http://pmbits.ath.cx/RECV002.TIF
Compiled with (adapt include + lib paths):
gcc -I/usr/pkg/include -Wl,-R/usr/pkg/lib \
-L/usr/pkg/lib -ltiff -o addtags addtags.c
Run with:
./addtags somewhere/RECV002.TIF
Stack backtrace:
Program terminated with signal 11, Segmentation fault.
#0 0x00007f7ffd98eb6a in _malloc_prefork () from /usr/lib/libc.so.12
(gdb) bt
#0 0x00007f7ffd98eb6a in _malloc_prefork () from /usr/lib/libc.so.12
#1 0x00007f7ffd98edde in free () from /usr/lib/libc.so.12
#2 0x00007f7ffdc08959 in TIFFCleanup () from /usr/pkg/lib/libtiff.so.3
#3 0x00007f7ffdc089e1 in TIFFClose () from /usr/pkg/lib/libtiff.so.3
#4 0x0000000000400dbe in main ()
To me it looks like a double free() of some kind!?
Also, in place update of directories is always an iffy procedure with libtiff but I would strongly encourage using the most recent release (3.9.1?) if you are trying this.
Yes, on my system (NetBSD-5.0.1) there is libtiff-3.9.1 installed.
Thanks,
Juergen
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <tiffio.h>
static const char *some_strings[] = {
"Hello, world!",
"foo",
"bar",
"baz"
};
int main(int argc, char **argv)
{
TIFF *hTIFF;
TIFFFieldInfo *apptags;
char buff[32];
const char *str;
uint32_t n, ntags;
int32_t res;
hTIFF = TIFFOpen(argv[1], "r+");
ntags = 3;
apptags = calloc(ntags, sizeof(TIFFFieldInfo));
for (n = 0; n < ntags; n++) {
uint16_t id = 10000 + n;
apptags[n].field_tag = id;
apptags[n].field_readcount = TIFF_VARIABLE;
apptags[n].field_writecount = TIFF_VARIABLE;
apptags[n].field_type = TIFF_ASCII;
apptags[n].field_bit = FIELD_CUSTOM;
apptags[n].field_oktochange = 1;
apptags[n].field_passcount = 0;
snprintf(buff, sizeof(buff), "Tag %d", id);
apptags[n].field_name = strdup(buff);
}
TIFFMergeFieldInfo(hTIFF, apptags, ntags);
for (n = 0; n < ntags; n++) {
str = some_strings[n];
res = TIFFSetField(hTIFF, apptags[n].field_tag, str);
printf("set tag:%u to \"%s\" res:%d\n",
apptags[n].field_tag, str, res);
}
TIFFClose(hTIFF);
for (n = 0; n < ntags; n++) {
if (apptags[n].field_name)
free(apptags[n].field_name);
}
free(apptags);
return 0;
}