| .. | .. |
|---|
| 126 | 126 | { |
|---|
| 127 | 127 | struct ubifs_compressor *compr = ubifs_compressors[tfm->compressor]; |
|---|
| 128 | 128 | int err; |
|---|
| 129 | + size_t tmp_len = *dlen; |
|---|
| 129 | 130 | |
|---|
| 130 | 131 | if (compr->compr_type == UBIFS_COMPR_NONE) { |
|---|
| 131 | 132 | memcpy(dst, src, slen); |
|---|
| .. | .. |
|---|
| 133 | 134 | return 0; |
|---|
| 134 | 135 | } |
|---|
| 135 | 136 | |
|---|
| 136 | | - err = compr->decompress(src, slen, dst, (size_t *)dlen); |
|---|
| 137 | + err = compr->decompress(src, slen, dst, &tmp_len); |
|---|
| 137 | 138 | if (err) |
|---|
| 138 | 139 | ubifs_err(c, "cannot decompress %d bytes, compressor %s, " |
|---|
| 139 | 140 | "error %d", slen, compr->name, err); |
|---|
| 140 | 141 | |
|---|
| 142 | + *dlen = tmp_len; |
|---|
| 141 | 143 | return err; |
|---|
| 142 | 144 | |
|---|
| 143 | 145 | return 0; |
|---|
| .. | .. |
|---|
| 466 | 468 | dbg_gen("cannot find next direntry, error %d", err); |
|---|
| 467 | 469 | |
|---|
| 468 | 470 | out_free: |
|---|
| 469 | | - if (file->private_data) |
|---|
| 470 | | - kfree(file->private_data); |
|---|
| 471 | | - if (file) |
|---|
| 472 | | - free(file); |
|---|
| 473 | | - if (dentry) |
|---|
| 474 | | - free(dentry); |
|---|
| 475 | | - if (dir) |
|---|
| 476 | | - free(dir); |
|---|
| 471 | + kfree(file->private_data); |
|---|
| 472 | + free(file); |
|---|
| 473 | + free(dentry); |
|---|
| 474 | + free(dir); |
|---|
| 477 | 475 | |
|---|
| 478 | 476 | return ret; |
|---|
| 479 | 477 | } |
|---|
| .. | .. |
|---|
| 801 | 799 | |
|---|
| 802 | 800 | if (last_block_size) |
|---|
| 803 | 801 | dlen = last_block_size; |
|---|
| 802 | + else if (ret) |
|---|
| 803 | + dlen = UBIFS_BLOCK_SIZE; |
|---|
| 804 | 804 | else |
|---|
| 805 | 805 | dlen = le32_to_cpu(dn->size); |
|---|
| 806 | 806 | |
|---|