~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/isofs/joliet.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/isofs/joliet.c (Version linux-6.11.5) and /fs/isofs/joliet.c (Version linux-2.4.37.11)


  1 // SPDX-License-Identifier: GPL-2.0            << 
  2 /*                                                  1 /*
  3  *  linux/fs/isofs/joliet.c                         2  *  linux/fs/isofs/joliet.c
  4  *                                                  3  *
  5  *  (C) 1996 Gordon Chaffee                         4  *  (C) 1996 Gordon Chaffee
  6  *                                                  5  *
  7  *  Joliet: Microsoft's Unicode extensions to       6  *  Joliet: Microsoft's Unicode extensions to iso9660
  8  */                                                 7  */
  9                                                     8 
 10 #include <linux/types.h>                       !!   9 #include <linux/string.h>
 11 #include <linux/nls.h>                             10 #include <linux/nls.h>
 12 #include "isofs.h"                             !!  11 #include <linux/slab.h>
                                                   >>  12 #include <linux/iso_fs.h>
                                                   >>  13 #include <asm/unaligned.h>
 13                                                    14 
 14 /*                                                 15 /*
 15  * Convert Unicode 16 to UTF-8 or ASCII.       !!  16  * Convert Unicode 16 to UTF8 or ASCII.
 16  */                                                17  */
 17 static int                                         18 static int
 18 uni16_to_x8(unsigned char *ascii, __be16 *uni, !!  19 uni16_to_x8(unsigned char *ascii, u16 *uni, int len, struct nls_table *nls)
 19 {                                                  20 {
 20         __be16 *ip, ch;                        !!  21         wchar_t *ip, ch;
 21         unsigned char *op;                         22         unsigned char *op;
 22                                                    23 
 23         ip = uni;                                  24         ip = uni;
 24         op = ascii;                                25         op = ascii;
 25                                                    26 
 26         while ((ch = get_unaligned(ip)) && len     27         while ((ch = get_unaligned(ip)) && len) {
 27                 int llen;                          28                 int llen;
 28                 llen = nls->uni2char(be16_to_c !!  29                 ch = be16_to_cpu(ch);
 29                 if (llen > 0)                  !!  30                 if ((llen = nls->uni2char(ch, op, NLS_MAX_CHARSET_SIZE)) > 0)
 30                         op += llen;                31                         op += llen;
 31                 else                               32                 else
 32                         *op++ = '?';               33                         *op++ = '?';
 33                 ip++;                              34                 ip++;
 34                                                    35 
 35                 len--;                             36                 len--;
 36         }                                          37         }
 37         *op = 0;                                   38         *op = 0;
 38         return (op - ascii);                       39         return (op - ascii);
 39 }                                                  40 }
 40                                                    41 
                                                   >>  42 /* Convert big endian wide character string to utf8 */
                                                   >>  43 static int
                                                   >>  44 wcsntombs_be(__u8 *s, const __u8 *pwcs, int inlen, int maxlen)
                                                   >>  45 {
                                                   >>  46         const __u8 *ip;
                                                   >>  47         __u8 *op;
                                                   >>  48         int size;
                                                   >>  49         __u16 c;
                                                   >>  50 
                                                   >>  51         op = s;
                                                   >>  52         ip = pwcs;
                                                   >>  53         while ((*ip || ip[1]) && (maxlen > 0) && (inlen > 0)) {
                                                   >>  54                 c = (*ip << 8) | ip[1];
                                                   >>  55                 if (c > 0x7f) {
                                                   >>  56                         size = utf8_wctomb(op, c, maxlen);
                                                   >>  57                         if (size == -1) {
                                                   >>  58                                 /* Ignore character and move on */
                                                   >>  59                                 maxlen--;
                                                   >>  60                         } else {
                                                   >>  61                                 op += size;
                                                   >>  62                                 maxlen -= size;
                                                   >>  63                         }
                                                   >>  64                 } else {
                                                   >>  65                         *op++ = (__u8) c;
                                                   >>  66                 }
                                                   >>  67                 ip += 2;
                                                   >>  68                 inlen--;
                                                   >>  69         }
                                                   >>  70         return (op - s);
                                                   >>  71 }
                                                   >>  72 
 41 int                                                73 int
 42 get_joliet_filename(struct iso_directory_recor     74 get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, struct inode * inode)
 43 {                                                  75 {
                                                   >>  76         unsigned char utf8;
 44         struct nls_table *nls;                     77         struct nls_table *nls;
 45         unsigned char len = 0;                     78         unsigned char len = 0;
 46                                                    79 
 47         nls = ISOFS_SB(inode->i_sb)->s_nls_ioc !!  80         utf8 = inode->i_sb->u.isofs_sb.s_utf8;
                                                   >>  81         nls = inode->i_sb->u.isofs_sb.s_nls_iocharset;
 48                                                    82 
 49         if (!nls) {                            !!  83         if (utf8) {
 50                 len = utf16s_to_utf8s((const w !!  84                 len = wcsntombs_be(outname, de->name,
 51                                 de->name_len[0 !!  85                                    de->name_len[0] >> 1, PAGE_SIZE);
 52                                 outname, PAGE_ << 
 53         } else {                                   86         } else {
 54                 len = uni16_to_x8(outname, (__ !!  87                 len = uni16_to_x8(outname, (u16 *) de->name,
 55                                 de->name_len[0 !!  88                                   de->name_len[0] >> 1, nls);
 56         }                                          89         }
 57         if ((len > 2) && (outname[len-2] == '; !!  90         if ((len > 2) && (outname[len-2] == ';') && (outname[len-1] == '1')) {
 58                 len -= 2;                          91                 len -= 2;
                                                   >>  92         }
 59                                                    93 
 60         /*                                         94         /*
 61          * Windows doesn't like periods at the     95          * Windows doesn't like periods at the end of a name,
 62          * so neither do we                        96          * so neither do we
 63          */                                        97          */
 64         while (len >= 2 && (outname[len-1] ==  !!  98         while (len >= 2 && (outname[len-1] == '.')) {
 65                 len--;                             99                 len--;
                                                   >> 100         }
 66                                                   101 
 67         return len;                               102         return len;
 68 }                                                 103 }
 69                                                   104 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php