Lines Matching +full:rs +full:-

1 // SPDX-License-Identifier: GPL-2.0
45 if (rr->u.SP.magic[0] != 0xbe) in check_sp()
46 return -1; in check_sp()
47 if (rr->u.SP.magic[1] != 0xef) in check_sp()
48 return -1; in check_sp()
49 ISOFS_SB(inode->i_sb)->s_rock_offset = rr->u.SP.skip; in check_sp()
54 struct inode *inode, struct rock_state *rs) in setup_rock_ridge() argument
56 rs->len = sizeof(struct iso_directory_record) + de->name_len[0]; in setup_rock_ridge()
57 if (rs->len & 1) in setup_rock_ridge()
58 (rs->len)++; in setup_rock_ridge()
59 rs->chr = (unsigned char *)de + rs->len; in setup_rock_ridge()
60 rs->len = *((unsigned char *)de) - rs->len; in setup_rock_ridge()
61 if (rs->len < 0) in setup_rock_ridge()
62 rs->len = 0; in setup_rock_ridge()
64 if (ISOFS_SB(inode->i_sb)->s_rock_offset != -1) { in setup_rock_ridge()
65 rs->len -= ISOFS_SB(inode->i_sb)->s_rock_offset; in setup_rock_ridge()
66 rs->chr += ISOFS_SB(inode->i_sb)->s_rock_offset; in setup_rock_ridge()
67 if (rs->len < 0) in setup_rock_ridge()
68 rs->len = 0; in setup_rock_ridge()
72 static void init_rock_state(struct rock_state *rs, struct inode *inode) in init_rock_state() argument
74 memset(rs, 0, sizeof(*rs)); in init_rock_state()
75 rs->inode = inode; in init_rock_state()
83 * and -ve on error.
85 static int rock_continue(struct rock_state *rs) in rock_continue() argument
88 int blocksize = 1 << rs->inode->i_blkbits; in rock_continue()
91 kfree(rs->buffer); in rock_continue()
92 rs->buffer = NULL; in rock_continue()
94 if ((unsigned)rs->cont_offset > blocksize - min_de_size || in rock_continue()
95 (unsigned)rs->cont_size > blocksize || in rock_continue()
96 (unsigned)(rs->cont_offset + rs->cont_size) > blocksize) { in rock_continue()
99 rs->cont_extent, rs->cont_offset, rs->cont_size); in rock_continue()
100 ret = -EIO; in rock_continue()
104 if (rs->cont_extent) { in rock_continue()
107 rs->buffer = kmalloc(rs->cont_size, GFP_KERNEL); in rock_continue()
108 if (!rs->buffer) { in rock_continue()
109 ret = -ENOMEM; in rock_continue()
112 ret = -EIO; in rock_continue()
113 if (++rs->cont_loops >= RR_MAX_CE_ENTRIES) in rock_continue()
115 bh = sb_bread(rs->inode->i_sb, rs->cont_extent); in rock_continue()
117 memcpy(rs->buffer, bh->b_data + rs->cont_offset, in rock_continue()
118 rs->cont_size); in rock_continue()
120 rs->chr = rs->buffer; in rock_continue()
121 rs->len = rs->cont_size; in rock_continue()
122 rs->cont_extent = 0; in rock_continue()
123 rs->cont_size = 0; in rock_continue()
124 rs->cont_offset = 0; in rock_continue()
127 printk("Unable to read rock-ridge attributes\n"); in rock_continue()
130 kfree(rs->buffer); in rock_continue()
131 rs->buffer = NULL; in rock_continue()
136 * We think there's a record of type `sig' at rs->chr. Parse the signature
139 static int rock_check_overflow(struct rock_state *rs, int sig) in rock_check_overflow() argument
185 if (len > rs->len) { in rock_check_overflow()
189 sig, len, rs->len); in rock_check_overflow()
190 return -EIO; in rock_check_overflow()
196 * return length of name field; 0: not found, -1: to be ignored
201 struct rock_state rs; in get_rock_ridge_filename() local
210 if (!ISOFS_SB(inode->i_sb)->s_rock) in get_rock_ridge_filename()
214 init_rock_state(&rs, inode); in get_rock_ridge_filename()
215 setup_rock_ridge(de, inode, &rs); in get_rock_ridge_filename()
218 while (rs.len > 2) { /* There may be one byte for padding somewhere */ in get_rock_ridge_filename()
219 rr = (struct rock_ridge *)rs.chr; in get_rock_ridge_filename()
221 * Ignore rock ridge info if rr->len is out of range, but in get_rock_ridge_filename()
222 * don't return -EIO because that would make the file in get_rock_ridge_filename()
225 if (rr->len < 3) in get_rock_ridge_filename()
227 sig = isonum_721(rs.chr); in get_rock_ridge_filename()
228 if (rock_check_overflow(&rs, sig)) in get_rock_ridge_filename()
230 rs.chr += rr->len; in get_rock_ridge_filename()
231 rs.len -= rr->len; in get_rock_ridge_filename()
233 * As above, just ignore the rock ridge info if rr->len in get_rock_ridge_filename()
236 if (rs.len < 0) in get_rock_ridge_filename()
241 if ((rr->u.RR.flags[0] & RR_NM) == 0) in get_rock_ridge_filename()
249 rs.cont_extent = isonum_733(rr->u.CE.extent); in get_rock_ridge_filename()
250 rs.cont_offset = isonum_733(rr->u.CE.offset); in get_rock_ridge_filename()
251 rs.cont_size = isonum_733(rr->u.CE.size); in get_rock_ridge_filename()
256 if (rr->len < 5) in get_rock_ridge_filename()
262 * care anyways, since we can just use the non-RR in get_rock_ridge_filename()
265 if (rr->u.NM.flags & 6) in get_rock_ridge_filename()
268 if (rr->u.NM.flags & ~1) { in get_rock_ridge_filename()
270 rr->u.NM.flags); in get_rock_ridge_filename()
273 len = rr->len - 5; in get_rock_ridge_filename()
278 p = memchr(rr->u.NM.name, '\0', len); in get_rock_ridge_filename()
280 len = p - rr->u.NM.name; in get_rock_ridge_filename()
281 memcpy(retname + retnamlen, rr->u.NM.name, len); in get_rock_ridge_filename()
286 kfree(rs.buffer); in get_rock_ridge_filename()
287 return -1; in get_rock_ridge_filename()
292 ret = rock_continue(&rs); in get_rock_ridge_filename()
298 kfree(rs.buffer); in get_rock_ridge_filename()
301 ret = -EIO; in get_rock_ridge_filename()
318 struct rock_state rs; in parse_rock_ridge_inode_internal() local
321 if (!ISOFS_SB(inode->i_sb)->s_rock) in parse_rock_ridge_inode_internal()
324 init_rock_state(&rs, inode); in parse_rock_ridge_inode_internal()
325 setup_rock_ridge(de, inode, &rs); in parse_rock_ridge_inode_internal()
327 rs.chr += 14; in parse_rock_ridge_inode_internal()
328 rs.len -= 14; in parse_rock_ridge_inode_internal()
329 if (rs.len < 0) in parse_rock_ridge_inode_internal()
330 rs.len = 0; in parse_rock_ridge_inode_internal()
334 while (rs.len > 2) { /* There may be one byte for padding somewhere */ in parse_rock_ridge_inode_internal()
335 rr = (struct rock_ridge *)rs.chr; in parse_rock_ridge_inode_internal()
337 * Ignore rock ridge info if rr->len is out of range, but in parse_rock_ridge_inode_internal()
338 * don't return -EIO because that would make the file in parse_rock_ridge_inode_internal()
341 if (rr->len < 3) in parse_rock_ridge_inode_internal()
343 sig = isonum_721(rs.chr); in parse_rock_ridge_inode_internal()
344 if (rock_check_overflow(&rs, sig)) in parse_rock_ridge_inode_internal()
346 rs.chr += rr->len; in parse_rock_ridge_inode_internal()
347 rs.len -= rr->len; in parse_rock_ridge_inode_internal()
349 * As above, just ignore the rock ridge info if rr->len in parse_rock_ridge_inode_internal()
352 if (rs.len < 0) in parse_rock_ridge_inode_internal()
358 if ((rr->u.RR.flags[0] & in parse_rock_ridge_inode_internal()
368 rs.cont_extent = isonum_733(rr->u.CE.extent); in parse_rock_ridge_inode_internal()
369 rs.cont_offset = isonum_733(rr->u.CE.offset); in parse_rock_ridge_inode_internal()
370 rs.cont_size = isonum_733(rr->u.CE.size); in parse_rock_ridge_inode_internal()
374 if (rr->u.ER.len_id + offsetof(struct rock_ridge, u.ER.data) > rr->len) in parse_rock_ridge_inode_internal()
376 ISOFS_SB(inode->i_sb)->s_rock = 1; in parse_rock_ridge_inode_internal()
380 for (p = 0; p < rr->u.ER.len_id; p++) in parse_rock_ridge_inode_internal()
381 printk(KERN_CONT "%c", rr->u.ER.data[p]); in parse_rock_ridge_inode_internal()
386 inode->i_mode = isonum_733(rr->u.PX.mode); in parse_rock_ridge_inode_internal()
387 set_nlink(inode, isonum_733(rr->u.PX.n_links)); in parse_rock_ridge_inode_internal()
388 i_uid_write(inode, isonum_733(rr->u.PX.uid)); in parse_rock_ridge_inode_internal()
389 i_gid_write(inode, isonum_733(rr->u.PX.gid)); in parse_rock_ridge_inode_internal()
394 high = isonum_733(rr->u.PN.dev_high); in parse_rock_ridge_inode_internal()
395 low = isonum_733(rr->u.PN.dev_low); in parse_rock_ridge_inode_internal()
407 inode->i_rdev = in parse_rock_ridge_inode_internal()
410 inode->i_rdev = in parse_rock_ridge_inode_internal()
423 if (rr->u.TF.flags & TF_CREATE) { in parse_rock_ridge_inode_internal()
425 iso_date(rr->u.TF.times[cnt++].time, 0), in parse_rock_ridge_inode_internal()
428 if (rr->u.TF.flags & TF_MODIFY) { in parse_rock_ridge_inode_internal()
429 inode->i_mtime.tv_sec = in parse_rock_ridge_inode_internal()
430 iso_date(rr->u.TF.times[cnt++].time, in parse_rock_ridge_inode_internal()
432 inode->i_mtime.tv_nsec = 0; in parse_rock_ridge_inode_internal()
434 if (rr->u.TF.flags & TF_ACCESS) { in parse_rock_ridge_inode_internal()
435 inode->i_atime.tv_sec = in parse_rock_ridge_inode_internal()
436 iso_date(rr->u.TF.times[cnt++].time, in parse_rock_ridge_inode_internal()
438 inode->i_atime.tv_nsec = 0; in parse_rock_ridge_inode_internal()
440 if (rr->u.TF.flags & TF_ATTRIBUTES) { in parse_rock_ridge_inode_internal()
442 iso_date(rr->u.TF.times[cnt++].time, 0), in parse_rock_ridge_inode_internal()
451 slen = rr->len - 5; in parse_rock_ridge_inode_internal()
452 slp = &rr->u.SL.link; in parse_rock_ridge_inode_internal()
453 inode->i_size = symlink_len; in parse_rock_ridge_inode_internal()
456 switch (slp->flags & ~1) { in parse_rock_ridge_inode_internal()
458 inode->i_size += in parse_rock_ridge_inode_internal()
459 slp->len; in parse_rock_ridge_inode_internal()
462 inode->i_size += 1; in parse_rock_ridge_inode_internal()
465 inode->i_size += 2; in parse_rock_ridge_inode_internal()
469 inode->i_size += 1; in parse_rock_ridge_inode_internal()
475 slen -= slp->len + 2; in parse_rock_ridge_inode_internal()
478 (((char *)slp) + slp->len + 2); in parse_rock_ridge_inode_internal()
481 if (((rr->u.SL. in parse_rock_ridge_inode_internal()
484 ((oldslp-> in parse_rock_ridge_inode_internal()
486 inode->i_size += in parse_rock_ridge_inode_internal()
496 && (oldslp->flags & 1) == 0) in parse_rock_ridge_inode_internal()
497 inode->i_size += 1; in parse_rock_ridge_inode_internal()
500 symlink_len = inode->i_size; in parse_rock_ridge_inode_internal()
513 reloc_block = isonum_733(rr->u.CL.location); in parse_rock_ridge_inode_internal()
514 if (reloc_block == ISOFS_I(inode)->i_iget5_block && in parse_rock_ridge_inode_internal()
515 ISOFS_I(inode)->i_iget5_offset == 0) { in parse_rock_ridge_inode_internal()
521 ISOFS_I(inode)->i_first_extent = reloc_block; in parse_rock_ridge_inode_internal()
522 reloc = isofs_iget_reloc(inode->i_sb, reloc_block, 0); in parse_rock_ridge_inode_internal()
527 inode->i_mode = reloc->i_mode; in parse_rock_ridge_inode_internal()
528 set_nlink(inode, reloc->i_nlink); in parse_rock_ridge_inode_internal()
529 inode->i_uid = reloc->i_uid; in parse_rock_ridge_inode_internal()
530 inode->i_gid = reloc->i_gid; in parse_rock_ridge_inode_internal()
531 inode->i_rdev = reloc->i_rdev; in parse_rock_ridge_inode_internal()
532 inode->i_size = reloc->i_size; in parse_rock_ridge_inode_internal()
533 inode->i_blocks = reloc->i_blocks; in parse_rock_ridge_inode_internal()
534 inode->i_atime = reloc->i_atime; in parse_rock_ridge_inode_internal()
536 inode->i_mtime = reloc->i_mtime; in parse_rock_ridge_inode_internal()
543 if (ISOFS_SB(inode->i_sb)->s_nocompress) in parse_rock_ridge_inode_internal()
545 algo = isonum_721(rr->u.ZF.algorithm); in parse_rock_ridge_inode_internal()
548 isonum_711(&rr->u.ZF.parms[1]); in parse_rock_ridge_inode_internal()
559 ISOFS_I(inode)->i_file_format = in parse_rock_ridge_inode_internal()
566 ISOFS_I(inode)->i_format_parm[0] = in parse_rock_ridge_inode_internal()
567 isonum_711(&rr->u.ZF.parms[0]); in parse_rock_ridge_inode_internal()
568 ISOFS_I(inode)->i_format_parm[1] = in parse_rock_ridge_inode_internal()
569 isonum_711(&rr->u.ZF.parms[1]); in parse_rock_ridge_inode_internal()
570 inode->i_size = in parse_rock_ridge_inode_internal()
571 isonum_733(rr->u.ZF. in parse_rock_ridge_inode_internal()
578 rr->u.ZF.algorithm[0], in parse_rock_ridge_inode_internal()
579 rr->u.ZF.algorithm[1]); in parse_rock_ridge_inode_internal()
588 ret = rock_continue(&rs); in parse_rock_ridge_inode_internal()
594 kfree(rs.buffer); in parse_rock_ridge_inode_internal()
597 ret = -EIO; in parse_rock_ridge_inode_internal()
607 slen = rr->len - 5; in get_symlink_chunk()
608 slp = &rr->u.SL.link; in get_symlink_chunk()
611 switch (slp->flags & ~1) { in get_symlink_chunk()
613 if (slp->len > plimit - rpnt) in get_symlink_chunk()
615 memcpy(rpnt, slp->text, slp->len); in get_symlink_chunk()
616 rpnt += slp->len; in get_symlink_chunk()
624 if (2 > plimit - rpnt) in get_symlink_chunk()
637 slp->flags); in get_symlink_chunk()
639 slen -= slp->len + 2; in get_symlink_chunk()
641 slp = (struct SL_component *)((char *)slp + slp->len + 2); in get_symlink_chunk()
648 if ((!rootflag) && (rr->u.SL.flags & 1) && in get_symlink_chunk()
649 !(oldslp->flags & 1)) { in get_symlink_chunk()
660 if (!rootflag && !(oldslp->flags & 1)) { in get_symlink_chunk()
679 if ((ISOFS_SB(inode->i_sb)->s_rock_offset == -1) in parse_rock_ridge_inode()
680 && (ISOFS_SB(inode->i_sb)->s_rock == 2)) { in parse_rock_ridge_inode()
689 * makes it uptodate and returns 0 or returns error (-EIO)
693 struct page *page = &folio->page; in rock_ridge_symlink_read_folio()
694 struct inode *inode = page->mapping->host; in rock_ridge_symlink_read_folio()
696 struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb); in rock_ridge_symlink_read_folio()
706 struct rock_state rs; in rock_ridge_symlink_read_folio() local
709 if (!sbi->s_rock) in rock_ridge_symlink_read_folio()
712 init_rock_state(&rs, inode); in rock_ridge_symlink_read_folio()
713 block = ei->i_iget5_block; in rock_ridge_symlink_read_folio()
714 bh = sb_bread(inode->i_sb, block); in rock_ridge_symlink_read_folio()
718 offset = ei->i_iget5_offset; in rock_ridge_symlink_read_folio()
719 pnt = (unsigned char *)bh->b_data + offset; in rock_ridge_symlink_read_folio()
734 setup_rock_ridge(raw_de, inode, &rs); in rock_ridge_symlink_read_folio()
737 while (rs.len > 2) { /* There may be one byte for padding somewhere */ in rock_ridge_symlink_read_folio()
738 rr = (struct rock_ridge *)rs.chr; in rock_ridge_symlink_read_folio()
739 if (rr->len < 3) in rock_ridge_symlink_read_folio()
741 sig = isonum_721(rs.chr); in rock_ridge_symlink_read_folio()
742 if (rock_check_overflow(&rs, sig)) in rock_ridge_symlink_read_folio()
744 rs.chr += rr->len; in rock_ridge_symlink_read_folio()
745 rs.len -= rr->len; in rock_ridge_symlink_read_folio()
746 if (rs.len < 0) in rock_ridge_symlink_read_folio()
751 if ((rr->u.RR.flags[0] & RR_SL) == 0) in rock_ridge_symlink_read_folio()
760 link + (PAGE_SIZE - 1)); in rock_ridge_symlink_read_folio()
766 rs.cont_extent = isonum_733(rr->u.CE.extent); in rock_ridge_symlink_read_folio()
767 rs.cont_offset = isonum_733(rr->u.CE.offset); in rock_ridge_symlink_read_folio()
768 rs.cont_size = isonum_733(rr->u.CE.size); in rock_ridge_symlink_read_folio()
774 ret = rock_continue(&rs); in rock_ridge_symlink_read_folio()
790 kfree(rs.buffer); in rock_ridge_symlink_read_folio()
793 printk("unable to read i-node block"); in rock_ridge_symlink_read_folio()
802 return -EIO; in rock_ridge_symlink_read_folio()