wok diff linux64-cloop/stuff/cloop.u @ rev 24891

lynx: use ncursesw (tanks ceel)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Apr 07 07:20:18 2022 +0000 (2022-04-07)
parents 36e9a3dcd5de
children 5a92a26adcc1
line diff
     1.1 --- a/linux64-cloop/stuff/cloop.u	Mon May 04 09:05:12 2020 +0000
     1.2 +++ b/linux64-cloop/stuff/cloop.u	Thu Apr 07 07:20:18 2022 +0000
     1.3 @@ -1373,3 +1373,178 @@
     1.4     }
     1.5    return 0;
     1.6   init_out_dealloc:
     1.7 +--- cloop.h
     1.8 ++++ cloop.h
     1.9 +@@ -86,11 +86,8 @@
    1.10 + struct cloop_tail
    1.11 + {
    1.12 + 	u_int32_t table_size; 
    1.13 +-	u_int32_t index_size; /* size:4 comp:3 ctrl-c:1 lastlen:24 */
    1.14 ++	u_int32_t index_size; /* size:4 unused:3 ctrl-c:1 lastlen:24 */
    1.15 + #define CLOOP3_INDEX_SIZE(x)    ((unsigned int)((x) & 0xF))
    1.16 +-#define CLOOP3_BLOCKS_FLAGS(x)  ((unsigned int)((x) & 0x70) >> 4)
    1.17 +-#define CLOOP3_TRUNCATED(x)     ((unsigned int)((x) & 0x80) >> 7)
    1.18 +-#define CLOOP3_LASTLEN(x)       (unsigned int)((x) >> 8)
    1.19 + 	u_int32_t num_blocks;
    1.20 + };
    1.21 + 
    1.22 +@@ -104,8 +101,10 @@
    1.23 + };
    1.24 + 
    1.25 + static inline char *build_index(struct block_info *offsets, unsigned long n, 
    1.26 +-			unsigned long block_size, unsigned global_flags)
    1.27 ++			unsigned long block_size)
    1.28 + {
    1.29 ++	static char v[11];
    1.30 ++	u_int32_t flags = 0;
    1.31 + 	u_int32_t *ofs32 = (u_int32_t *) offsets;
    1.32 + 	loff_t    *ofs64 = (loff_t *) offsets;
    1.33 + 
    1.34 +@@ -130,8 +129,6 @@
    1.35 + 		}
    1.36 + 		else { /* V2.0/V4.0 */
    1.37 + 			loff_t last = CLOOP_BLOCK_OFFSET(__be64_to_cpu(ofs64[n]));
    1.38 +-			u_int32_t flags;
    1.39 +-			static char v4[11];
    1.40 + 			unsigned long i = n;
    1.41 + 
    1.42 + 			for (flags = 0; n-- ;) {
    1.43 +@@ -149,12 +146,7 @@
    1.44 + 					offsets[i] = offsets[offsets[i].offset];
    1.45 + 				}
    1.46 + 			}
    1.47 +-			strcpy(v4, (char *) "64BE v4.0a");
    1.48 +-			v4[10] = 'a' + ((flags-1) & 0xF);	// compressors used
    1.49 +-			if (flags > 0x10) {			// with links ?
    1.50 +-				v4[10] += 'A' - 'a';
    1.51 +-			}
    1.52 +-			return v4;
    1.53 ++			strcpy(v, (char *) "64BE v4.0a");
    1.54 + 		}
    1.55 + 	}
    1.56 + 	else if (ofs32[1] == 0 && v3_64 == 0) { /* V1.0 */
    1.57 +@@ -170,7 +162,6 @@
    1.58 + 	else { /* V3.0 or V0.68 */
    1.59 + 		unsigned long i;
    1.60 + 		loff_t j;
    1.61 +-		static char v3[11];
    1.62 + 		
    1.63 + 		for (i = 0; i < n && ntohl(ofs32[i]) < ntohl(ofs32[i+1]); i++);
    1.64 + 		if (i == n && ntohl(ofs32[0]) == (4*n) + 0x8C) { /* V0.68 */
    1.65 +@@ -185,28 +176,33 @@
    1.66 + 		}
    1.67 + 		
    1.68 + 		v3_64 = (ofs32[1] == 0);
    1.69 +-		for (i = n; i-- != 0; )
    1.70 ++		for (i = n; i-- != 0; ) {
    1.71 + 			offsets[i].size = ntohl(ofs32[i << v3_64]); 
    1.72 +-		for (i = 0, j = sizeof(struct cloop_head); i < n; i++) {
    1.73 +-			offsets[i].offset = j;
    1.74 +-			offsets[i].flags = global_flags;
    1.75 + 			if (offsets[i].size == 0xFFFFFFFF) {
    1.76 +-				offsets[i].flags = CLOOP_COMPRESSOR_NONE;
    1.77 +-				offsets[i].size = block_size;
    1.78 ++				offsets[i].size = 0x10000000 | block_size;
    1.79 + 			}
    1.80 +-			if ((offsets[i].size & 0x80000000) == 0) {
    1.81 ++			offsets[i].flags = (offsets[i].size >> 28);
    1.82 ++			offsets[i].size &= 0x0FFFFFFF; 
    1.83 ++		}
    1.84 ++		for (i = 0, j = sizeof(struct cloop_head); i < n; i++) {
    1.85 ++			offsets[i].offset = j;
    1.86 ++			if (offsets[i].flags < 8) {
    1.87 + 				j += offsets[i].size;
    1.88 + 			}
    1.89 + 		}
    1.90 + 		for (i = 0; i < n; i++) {
    1.91 +-			if (offsets[i].size & 0x80000000) {
    1.92 +-				offsets[i] = offsets[offsets[i].size & 0x7FFFFFFF];
    1.93 ++			flags |= 1 << offsets[i].flags;
    1.94 ++			if (offsets[i].flags >= 8) {
    1.95 ++				offsets[i] = offsets[offsets[i].size];
    1.96 + 			}
    1.97 + 		}
    1.98 +-		strcpy(v3, (char *) (v3_64) ? "64BE v3.0a" : "32BE v3.0a");
    1.99 +-		v3[10] += global_flags;
   1.100 +-		return v3;
   1.101 ++		strcpy(v, (char *) (v3_64) ? "64BE v3.0a" : "32BE v3.0a");
   1.102 ++	}
   1.103 ++	v[10] = 'a' + ((flags-1) & 0xF);	// compressors used
   1.104 ++	if (flags > 0x10) {			// with links ?
   1.105 ++		v[10] += 'A' - 'a';
   1.106 + 	}
   1.107 ++	return v;
   1.108 + }
   1.109 + 
   1.110 + /* Cloop suspend IOCTL */
   1.111 +--- cloop.c
   1.112 ++++ cloop.c
   1.113 +@@ -542,7 +542,7 @@
   1.114 +  const unsigned int header_size = sizeof(struct cloop_head);
   1.115 +  unsigned int i, total_offsets=0;
   1.116 +  loff_t fs_read_position = 0, header_pos[2];
   1.117 +- int flags, isblkdev, bytes_read, error = 0;
   1.118 ++ int isblkdev, bytes_read, error = 0;
   1.119 +  if (clo->suspended) return error;
   1.120 +  #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
   1.121 +  inode = file->f_dentry->d_inode;
   1.122 +@@ -698,18 +698,12 @@
   1.123 +        error=-EBADF; goto error_release;
   1.124 +       }
   1.125 +      len = CLOOP3_INDEX_SIZE(ntohl(tail.index_size)) * total_offsets;
   1.126 +-     flags = CLOOP3_BLOCKS_FLAGS(ntohl(tail.index_size));
   1.127 +-// May  3 19:45:20 (none) user.info kernel: cloop: uncompress(clo=e0a78000, block_ptrs=e0c9c000, &len(1440)=ddc05e6c, zbuf=e0c9f000, zlen=43, flag=0)
   1.128 +-printk(KERN_INFO "%s: uncompress(clo=%p, block_ptrs=%p, &len(%ld)=%p, zbuf=%p, zlen=%ld, flag=%d)\n", cloop_name, 
   1.129 +-		clo, clo->block_ptrs, len, &len, zbuf, zlen, flags);
   1.130 +-     ret = uncompress(clo, (void *) clo->block_ptrs, &len, zbuf, zlen, flags);
   1.131 +-// May  3 19:45:20 (none) user.alert kernel: BUG: unable to handle kernel NULL pointer dereference at   (null)
   1.132 +-printk(KERN_INFO "%s: uncompressed !\n", cloop_name);
   1.133 ++     ret = uncompress(clo, (void *) clo->block_ptrs, &len, zbuf, zlen, CLOOP_COMPRESSOR_ZLIB);
   1.134 +      cloop_free(zbuf, zlen);
   1.135 +      if (ret != 0)
   1.136 +       {
   1.137 +-        printk(KERN_ERR "%s: decompression error %i uncompressing index, flags %u\n",
   1.138 +-               cloop_name, ret, flags);
   1.139 ++        printk(KERN_ERR "%s: decompression error %i uncompressing index\n",
   1.140 ++               cloop_name, ret);
   1.141 +        error=-EBADF; goto error_release;
   1.142 +       }
   1.143 +     }
   1.144 +@@ -722,7 +716,6 @@
   1.145 +  else
   1.146 +   {
   1.147 +    unsigned int n, total_bytes;
   1.148 +-   flags = 0;
   1.149 +    clo->block_ptrs = cloop_malloc(sizeof(struct block_info) * total_offsets);
   1.150 +    if (!clo->block_ptrs)
   1.151 +     {
   1.152 +@@ -761,7 +754,7 @@
   1.153 +   }
   1.154 +  {
   1.155 +   int i;
   1.156 +-  char *version = build_index(clo->block_ptrs, clo->head.num_blocks, clo->head.block_size, flags);
   1.157 ++  char *version = build_index(clo->block_ptrs, clo->head.num_blocks, clo->head.block_size);
   1.158 +   clo->largest_block = 0;
   1.159 +   for (i = 0; i < clo->head.num_blocks; i++)
   1.160 +     if (clo->block_ptrs[i].size > clo->largest_block)
   1.161 +@@ -769,9 +762,6 @@
   1.162 +   printk(KERN_INFO "%s: %s: %s: %u blocks, %u bytes/block, largest block is %lu bytes.\n",
   1.163 +          cloop_name, clo->underlying_filename, version, clo->head.num_blocks,
   1.164 +          clo->head.block_size, clo->largest_block);
   1.165 +- }
   1.166 +- {
   1.167 +-  int i;
   1.168 +   clo->num_buffered_blocks = (buffers > 0 && clo->head.block_size >= 512) ?
   1.169 +                               (buffers / clo->head.block_size) : 1;
   1.170 +   clo->buffered_blocknum = cloop_malloc(clo->num_buffered_blocks * sizeof (u_int32_t));
   1.171 +@@ -874,6 +864,10 @@
   1.172 +  cloop_free(clo->block_ptrs, sizeof(struct block_info) * total_offsets);
   1.173 +  clo->block_ptrs=NULL;
   1.174 + error_release:
   1.175 ++#if (defined(CONFIG_ZLIB_INFLATE) || defined(CONFIG_ZLIB_INFLATE_MODULE))
   1.176 ++ zlib_inflateEnd(&clo->zstream);
   1.177 ++ if(clo->zstream.workspace) { cloop_free(clo->zstream.workspace, zlib_inflate_workspacesize()); clo->zstream.workspace = NULL; }
   1.178 ++#endif
   1.179 +  if(bbuf) cloop_free(bbuf, clo->underlying_blksize);
   1.180 +  if(clo->underlying_filename) { kfree(clo->underlying_filename); clo->underlying_filename=NULL; }
   1.181 +  clo->backing_file=NULL;