summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurelien Aptel <aaptel@suse.com>2017-05-23 15:41:24 +0200
committerJeremy Allison <jra@samba.org>2017-07-19 21:22:13 +0200
commit43a1952b17c71b336af79411d9e26b5d91900998 (patch)
tree88518a1f3e6638d13c87f5e120ad1017692a918e
parent7c20a87097f506215423ea7494956fd1d993e36d (diff)
downloadsamba-43a1952b17c71b336af79411d9e26b5d91900998.tar.gz
librpc/ndr: simplify cabinet file size calculation
Signed-off-by: Aurelien Aptel <aaptel@suse.com> Reviewed-by: Guenther Deschner <gd@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
-rw-r--r--librpc/ndr/ndr_cab.c53
1 files changed, 3 insertions, 50 deletions
diff --git a/librpc/ndr/ndr_cab.c b/librpc/ndr/ndr_cab.c
index 98800ebd7b5..efd337d5daa 100644
--- a/librpc/ndr/ndr_cab.c
+++ b/librpc/ndr/ndr_cab.c
@@ -116,57 +116,11 @@ uint32_t ndr_cab_generate_checksum(const struct CFDATA *r)
csumPartial);
}
-static bool ndr_size_cab_file(const struct cab_file *r, uint32_t *psize)
-{
- uint32_t size = 0;
- int i;
-
- /* header */
- size += 36;
-
- /* folder */
- for (i = 0; i < r->cfheader.cFolders; i++) {
- if (size + 8 < size) {
- /* Integer wrap. */
- return false;
- }
- size += 8;
- }
-
- /* files */
- for (i = 0; i < r->cfheader.cFiles; i++) {
- uint32_t cfsize = ndr_size_CFFILE(&r->cffiles[i], 0);
- if (size + cfsize < size) {
- /* Integer wrap. */
- return false;
- }
- size += cfsize;
- }
-
- /* data */
- for (i = 0; i < ndr_count_cfdata(r); i++) {
- if (size + 8 < size) {
- /* Integer wrap. */
- return false;
- }
- size += 8;
- if (size + r->cfdata[i].cbData < size) {
- /* Integer wrap. */
- return false;
- }
- size += r->cfdata[i].cbData;
- }
-
- *psize = size;
- return true;
-}
-
_PUBLIC_ enum ndr_err_code ndr_push_cab_file(struct ndr_push *ndr, int ndr_flags, const struct cab_file *r)
{
uint32_t cntr_cffolders_0;
uint32_t cntr_cffiles_0;
uint32_t cntr_cfdata_0;
- uint32_t cab_size = 0;
{
uint32_t _flags_save_STRUCT = ndr->flags;
ndr_set_flags(&ndr->flags, LIBNDR_PRINT_ARRAY_HEX|LIBNDR_FLAG_LITTLE_ENDIAN|LIBNDR_FLAG_NOALIGN);
@@ -199,10 +153,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_cab_file(struct ndr_push *ndr, int ndr_flags
ndr->flags = _flags_save_STRUCT;
}
- if (ndr_size_cab_file(r, &cab_size) == false) {
- return NDR_ERR_VALIDATE;
- }
- SIVAL(ndr->data, 8, cab_size);
+
+ /* write total file size in header */
+ SIVAL(ndr->data, 8, ndr->offset);
return NDR_ERR_SUCCESS;
}