librpc: Add autogenerated file offset calculation for Cabinet files
authorGünther Deschner <gd@samba.org>
Sat, 24 Sep 2016 00:51:20 +0000 (02:51 +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 f90adbf7546abb3506b9701f340019fcd54a1d2d..3923aece6d089c932818a148e4890650bbff9386 100644 (file)
@@ -148,13 +148,19 @@ _PUBLIC_ enum ndr_err_code ndr_push_cab_file(struct ndr_push *ndr, int ndr_flags
                ndr_set_flags(&ndr->flags, LIBNDR_PRINT_ARRAY_HEX|LIBNDR_FLAG_LITTLE_ENDIAN|LIBNDR_FLAG_NOALIGN);
                NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
                if (ndr_flags & NDR_SCALARS) {
+                       uint32_t next_offset = 0;
                        NDR_CHECK(ndr_push_align(ndr, 4));
                        NDR_CHECK(ndr_push_CFHEADER(ndr, NDR_SCALARS, &r->cfheader));
                        for (cntr_cffolders_0 = 0; cntr_cffolders_0 < (r->cfheader.cFolders); cntr_cffolders_0++) {
                                NDR_CHECK(ndr_push_CFFOLDER(ndr, NDR_SCALARS, &r->cffolders[cntr_cffolders_0]));
                        }
                        for (cntr_cffiles_0 = 0; cntr_cffiles_0 < (r->cfheader.cFiles); cntr_cffiles_0++) {
+                               uint32_t offset = ndr->offset + 4;
                                NDR_CHECK(ndr_push_CFFILE(ndr, NDR_SCALARS, &r->cffiles[cntr_cffiles_0]));
+                               if (cntr_cffiles_0 > 0) {
+                                       next_offset += r->cffiles[cntr_cffiles_0 - 1].cbFile;
+                               }
+                               SIVAL(ndr->data, offset, next_offset);
                        }
 #if 0
                        NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_count_cfdata(r)));