exif: Fix handling of utf8 runes in nullString()
authorCameron Moore <moorereason@gmail.com>
Sat, 13 Mar 2021 18:45:09 +0000 (12:45 -0600)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 13 Mar 2021 20:20:10 +0000 (21:20 +0100)
resources/images/exif/exif.go
resources/images/exif/exif_test.go

index 065c143554f2f1c266f620d456f420be2038da1f..5406665cfe30637f78d56079e2672fb6ea6a9340 100644 (file)
@@ -226,17 +226,14 @@ func (e *exifWalker) Walk(f _exif.FieldName, tag *tiff.Tag) error {
 
 func nullString(in []byte) string {
        var rv bytes.Buffer
-       for _, b := range in {
-               if unicode.IsGraphic(rune(b)) {
-                       rv.WriteByte(b)
+       for len(in) > 0 {
+               r, size := utf8.DecodeRune(in)
+               if unicode.IsGraphic(r) {
+                       rv.WriteRune(r)
                }
+               in = in[size:]
        }
-       rvs := rv.String()
-       if utf8.ValidString(rvs) {
-               return rvs
-       }
-
-       return ""
+       return rv.String()
 }
 
 var tcodec *tmc.Codec
index 69540ddf5223180bc15db8515b14969a4254475e..0cb9f67044929d50daf7e48f64e855f89f0dd8be 100644 (file)
@@ -89,6 +89,23 @@ func TestIssue8079(t *testing.T) {
        c.Assert(x.Tags["ImageDescription"], qt.Equals, "Città del Vaticano #nanoblock #vatican #vaticancity")
 }
 
+func TestNullString(t *testing.T) {
+       c := qt.New(t)
+
+       for _, test := range []struct {
+               in     string
+               expect string
+       }{
+               {"foo", "foo"},
+               {"\x20", "\x20"},
+               {"\xc4\x81", "\xc4\x81"}, // \u0101
+               {"\u0160", "\u0160"},     // non-breaking space
+       } {
+               res := nullString([]byte(test.in))
+               c.Assert(res, qt.Equals, test.expect)
+       }
+}
+
 func BenchmarkDecodeExif(b *testing.B) {
        c := qt.New(b)
        f, err := os.Open(filepath.FromSlash("../../testdata/sunset.jpg"))