librpc: Add autogenerated total cabinet size for Cabinet files
authorGünther Deschner <gd@samba.org>
Tue, 20 Sep 2016 23:46:54 +0000 (01:46 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Thu, 24 Nov 2016 19:24:26 +0000 (20:24 +0100)
Guenther

Signed-off-by: Guenther Deschner <gd@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
librpc/ndr/ndr_cab.c

index 611e378cb34ac3fa99fc7f7579e0cdb50933a5ae..f90adbf7546abb3506b9701f340019fcd54a1d2d 100644 (file)
@@ -112,6 +112,32 @@ uint32_t ndr_cab_generate_checksum(const struct CFDATA *r)
                                        csumPartial);
 }
 
+static uint32_t ndr_size_cab_file(const struct cab_file *r)
+{
+       uint32_t size = 0;
+       int i;
+
+       /* header */
+       size += 36;
+
+       /* folder */
+       for (i = 0; i < r->cfheader.cFolders; i++) {
+               size += 8;
+       }
+
+       /* files */
+       for (i = 0; i < r->cfheader.cFiles; i++) {
+               size += ndr_size_CFFILE(&r->cffiles[i], 0);
+       }
+
+       /* data */
+       for (i = 0; i < ndr_count_cfdata(r); i++) {
+               size += 8 + r->cfdata[i].cbData;
+       }
+
+       return size;
+}
+
 _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;
@@ -142,6 +168,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_cab_file(struct ndr_push *ndr, int ndr_flags
                }
                ndr->flags = _flags_save_STRUCT;
        }
+
+       SIVAL(ndr->data, 8, ndr_size_cab_file(r));
+
        return NDR_ERR_SUCCESS;
 }