Package: jhead
Version: 1:2.97-1
Severity: normal
Dear Maintainer,
While adjusting some EXIF dates on pictures, the observed change between the
original picture and the jhead-ed one goes beyond time modifications of the
corresponding tags.
The default EXIF comment from my camera is a sequence of spaces, which
translates inside the header to "ASCII\0\0\0 " (36 spaces
overall).
This is basically my workflow:
cp -p DSC.JPG DSC_orig.JPG
jhead -ta-1 DSC.JPG
hexdump -Cv DSC_orig.JPG > DSC_orig.txt
hexdump -Cv DSC.JPG > DSC.txt
`diff DSC_orig.txt DSC.txt` returns
17c17
< 00000100 32 3a 32 35 3a 35 35 00 20 20 20 20 20 20 20 20 |2:25:55. |
---
> 00000100 31 3a 32 35 3a 35 35 00 20 20 20 20 20 20 20 20 |1:25:55. |
56,57c56,57
< 00000370 3a 31 32 3a 32 35 20 31 32 3a 32 35 3a 35 35 00 |:12:25 12:25:55.|
< 00000380 32 30 31 33 3a 31 32 3a 32 35 20 31 32 3a 32 35 |2013:12:25 12:25|
---
> 00000370 3a 31 32 3a 32 35 20 31 31 3a 32 35 3a 35 35 00 |:12:25 11:25:55.|
> 00000380 32 30 31 33 3a 31 32 3a 32 35 20 31 31 3a 32 35 |2013:12:25 11:25|
60,62c60,62
< 000003b0 00 00 00 0a 41 53 43 49 49 00 00 00 20 20 20 20 |....ASCII... |
< 000003c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
< 000003d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
---
> 000003b0 00 00 00 0a 41 53 43 49 49 00 00 00 00 00 00 00 |....ASCII.......|
> 000003c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
> 000003d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
I expect the output to be
17c17
< 00000100 32 3a 32 35 3a 35 35 00 20 20 20 20 20 20 20 20 |2:25:55. |
---
> 00000100 31 3a 32 35 3a 35 35 00 20 20 20 20 20 20 20 20 |1:25:55. |
56,57c56,57
< 00000370 3a 31 32 3a 32 35 20 31 32 3a 32 35 3a 35 35 00 |:12:25 12:25:55.|
< 00000380 32 30 31 33 3a 31 32 3a 32 35 20 31 32 3a 32 35 |2013:12:25 12:25|
---
> 00000370 3a 31 32 3a 32 35 20 31 31 3a 32 35 3a 35 35 00 |:12:25 11:25:55.|
> 00000380 32 30 31 33 3a 31 32 3a 32 35 20 31 31 3a 32 35 |2013:12:25 11:25|
I tracked the issue down to exif.c where the code takes conditional actions on
the comment field. It will remove trailing spaces and replace them with \0,
then conditionnally copy the comment if one of the five first characters after
the 'ASCII' string is different from a space of \0.
I expect this situation to lead to a corner case bug (untested): a comment
starting with several spaces will be wiped when adjusting time.
I also think this happens upon creation of the modified file and is likely not
limited to the -ta option.
The issue is not Debian specific but in the upstream code. A patch is attached
to suggest a more conservative behaviour of jhead.
Thank you
--
Sylvain
-- System Information:
Debian Release: jessie/sid
APT prefers testing
APT policy: (990, 'testing'), (50, 'unstable'), (40, 'experimental')
Architecture: armel (armv5tel)
Kernel: Linux 3.11-2-kirkwood
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages jhead depends on:
ii libc6 2.17-97
ii libjpeg-progs 8d-2
jhead recommends no packages.
Versions of packages jhead suggests:
ii imagemagick 8:6.7.7.10-7
-- no debconf information
diff -ru jhead.orig/jhead-2.97/exif.c jhead/jhead-2.97/exif.c
--- jhead.orig/jhead-2.97/exif.c 2013-01-30 18:02:56.000000000 +0100
+++ jhead/jhead-2.97/exif.c 2013-12-30 12:16:47.037757973 +0100
@@ -663,33 +663,12 @@
break; // Already have a windows comment, skip this one.
}
- // Comment is often padded with trailing spaces. Remove these first.
- for (a=ByteCount;;){
- a--;
- if ((ValuePtr)[a] == ' '){
- (ValuePtr)[a] = '\0';
- }else{
- break;
- }
- if (a == 0) break;
- }
-
// Copy the comment
{
int msiz = ExifLength - (ValuePtr-OffsetBase);
if (msiz > ByteCount) msiz = ByteCount;
if (msiz > MAX_COMMENT_SIZE-1) msiz = MAX_COMMENT_SIZE-1;
- if (msiz > 5 && memcmp(ValuePtr, "ASCII",5) == 0){
- for (a=5;a<10 && a < msiz;a++){
- int c = (ValuePtr)[a];
- if (c != '\0' && c != ' '){
- strncpy(ImageInfo.Comments, (char *)ValuePtr+a, msiz-a);
- break;
- }
- }
- }else{
- strncpy(ImageInfo.Comments, (char *)ValuePtr, msiz);
- }
+ strncpy(ImageInfo.Comments, (char *)ValuePtr, msiz);
}
break;