diff options
author | UbitUmarov | 2015-10-28 21:27:56 +0000 |
---|---|---|
committer | Diva Canto | 2015-11-10 20:08:44 -0800 |
commit | b383cdae339631d009a07cde4f10fcd3d61d9e77 (patch) | |
tree | bc27a285ed279ca55700bbc8e769079ca2e65204 | |
parent | Don't crash the sim if the map image is null. (diff) | |
download | opensim-SC-b383cdae339631d009a07cde4f10fcd3d61d9e77.zip opensim-SC-b383cdae339631d009a07cde4f10fcd3d61d9e77.tar.gz opensim-SC-b383cdae339631d009a07cde4f10fcd3d61d9e77.tar.bz2 opensim-SC-b383cdae339631d009a07cde4f10fcd3d61d9e77.tar.xz |
fix cut points of UTF-8 strings
-rw-r--r-- | OpenSim/Framework/Util.cs | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index a5f798d..1f74168 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -1818,17 +1818,26 @@ namespace OpenSim.Framework | |||
1818 | /// <returns></returns> | 1818 | /// <returns></returns> |
1819 | public static byte[] StringToBytes256(string str) | 1819 | public static byte[] StringToBytes256(string str) |
1820 | { | 1820 | { |
1821 | if (String.IsNullOrEmpty(str)) { return Utils.EmptyBytes; } | 1821 | if (String.IsNullOrEmpty(str)) |
1822 | if (str.Length > 254) str = str.Remove(254); | 1822 | return Utils.EmptyBytes; |
1823 | if (!str.EndsWith("\0")) { str += "\0"; } | 1823 | |
1824 | if (!str.EndsWith("\0")) | ||
1825 | str += "\0"; | ||
1824 | 1826 | ||
1825 | // Because this is UTF-8 encoding and not ASCII, it's possible we | 1827 | // Because this is UTF-8 encoding and not ASCII, it's possible we |
1826 | // might have gotten an oversized array even after the string trim | 1828 | // might have gotten an oversized array even after the string trim |
1827 | byte[] data = UTF8.GetBytes(str); | 1829 | byte[] data = UTF8.GetBytes(str); |
1830 | |||
1828 | if (data.Length > 256) | 1831 | if (data.Length > 256) |
1829 | { | 1832 | { |
1830 | Array.Resize<byte>(ref data, 256); | 1833 | int cut = 255; |
1831 | data[255] = 0; | 1834 | if((data[cut] & 0x80 ) != 0 ) |
1835 | { | ||
1836 | while(cut > 0 && (data[cut] & 0xc0) != 0xc0) | ||
1837 | cut--; | ||
1838 | } | ||
1839 | Array.Resize<byte>(ref data, cut + 1); | ||
1840 | data[cut] = 0; | ||
1832 | } | 1841 | } |
1833 | 1842 | ||
1834 | return data; | 1843 | return data; |
@@ -1860,17 +1869,26 @@ namespace OpenSim.Framework | |||
1860 | /// <returns></returns> | 1869 | /// <returns></returns> |
1861 | public static byte[] StringToBytes1024(string str) | 1870 | public static byte[] StringToBytes1024(string str) |
1862 | { | 1871 | { |
1863 | if (String.IsNullOrEmpty(str)) { return Utils.EmptyBytes; } | 1872 | if (String.IsNullOrEmpty(str)) |
1864 | if (str.Length > 1023) str = str.Remove(1023); | 1873 | return Utils.EmptyBytes; |
1865 | if (!str.EndsWith("\0")) { str += "\0"; } | 1874 | |
1875 | if (!str.EndsWith("\0")) | ||
1876 | str += "\0"; | ||
1866 | 1877 | ||
1867 | // Because this is UTF-8 encoding and not ASCII, it's possible we | 1878 | // Because this is UTF-8 encoding and not ASCII, it's possible we |
1868 | // might have gotten an oversized array even after the string trim | 1879 | // might have gotten an oversized array even after the string trim |
1869 | byte[] data = UTF8.GetBytes(str); | 1880 | byte[] data = UTF8.GetBytes(str); |
1881 | |||
1870 | if (data.Length > 1024) | 1882 | if (data.Length > 1024) |
1871 | { | 1883 | { |
1872 | Array.Resize<byte>(ref data, 1024); | 1884 | int cut = 1023; |
1873 | data[1023] = 0; | 1885 | if((data[cut] & 0x80 ) != 0 ) |
1886 | { | ||
1887 | while(cut > 0 && (data[cut] & 0xc0) != 0xc0) | ||
1888 | cut--; | ||
1889 | } | ||
1890 | Array.Resize<byte>(ref data, cut + 1); | ||
1891 | data[cut] = 0; | ||
1874 | } | 1892 | } |
1875 | 1893 | ||
1876 | return data; | 1894 | return data; |