|
Mantis - git
|
|||||
| Viewing Issue Advanced Details | |||||
|
|
|||||
| ID: | Category: | Severity: | Reproducibility: | Date Submitted: | Last Update: |
| 5298 | regular use | major | always | 2017-02-19 18:02 | 2017-02-20 10:21 |
|
|
|||||
| Reporter: | danny | Platform: | |||
| Assigned To: | dam | OS: | |||
| Priority: | normal | OS Version: | |||
| Status: | assigned | Product Version: | |||
| Product Build: | Resolution: | open | |||
| Projection: | none | ||||
| ETA: | none | Fixed in Version: | |||
|
|
|||||
| Summary: | 0005298: git fast-export producing corrupt output with UTF8 locale on Solaris 11 | ||||
| Description: |
On Solaris 11, using git 2.3.1 or 2.4.0 from OpenCSW, when commiter or author contain multibyte characters, git fast-export writes extra garbage after the author/committer line: $ locale LANG=en_US.UTF8 LC_CTYPE="en_US.UTF8" [...] LC_ALL= $ git fast-export --all blob mark :1 data 6 Hello reset refs/heads/master commit refs/heads/master mark :2 author Füü Bär <foo@example.com> 1487506001 +0100 co committer Füu Bär <foo@example.com> 1487506001 +0100 data 6 Hello M 100644 :1 foo.txt reset refs/heads/master from :2 With LC_CTYPE=C the problem disappears (this correct output can be used with git fast-import to create a test case repository): $ LC_CTYPE=C git fast-export --all blob mark :1 data 6 Hello reset refs/heads/master commit refs/heads/master mark :2 author Füü Bär <foo@example.com> 1487506001 +0100 committer Füu Bär <foo@example.com> 1487506001 +0100 data 6 Hello M 100644 :1 foo.txt reset refs/heads/master from :2 |
||||
| Steps To Reproduce: | |||||
| Additional Information: |
The problem might be that git is not compiled in c99 compliant mode. On Solaris 11, this apparently causes printf() to interpret the length field when formatting strings as a number of characters instead of a number of bytes, which results in additional garbage output when the string contains multibyte UTF8 characters. This following C program illustrates the difference in behaviour: $ cat printf_test.c #include <stdio.h> #include <strings.h> #include <locale.h> int main() { char test[] = { 102, -61, -74, -61, -74, 98, -61, -92, 114, 64, 64, 64, 0 }; setlocale(LC_CTYPE, ""); printf("%.9s\n", test); return 0; } $ cc -o printf_test printf_test.c $ ./printf_test fööbär@@@ $ cc -o printf_test printf_test.c -xc99 $ ./printf_test fööbär Or with gcc: $ gcc -o printf_test printf_test.c $ ./printf_test fööbär@@@ $ gcc -o printf_test printf_test.c /usr/lib/32/values-xpg6.o $ ./printf_test fööbär |
||||
| Relationships | |||||
| Attached Files: | |||||
|
|
|||||
| Issue History | |||||
| Date Modified | Username | Field | Change | ||
| 2017-02-19 18:02 | danny | New Issue | |||
| 2017-02-20 10:21 | dam | Status | new => assigned | ||
| 2017-02-20 10:21 | dam | Assigned To | => dam | ||
| There are no notes attached to this issue. |