summaryrefslogtreecommitdiff
path: root/source3/utils/profiles.c
diff options
context:
space:
mode:
authorRichard Sharpe <sharpe@samba.org>2002-11-05 02:11:42 +0000
committerRichard Sharpe <sharpe@samba.org>2002-11-05 02:11:42 +0000
commit48e10c116d2ae79ef2e56aab89a706a76948a171 (patch)
tree3ad6ae4a755d504a3e6cc8fb7d2b1bf74b4406f8 /source3/utils/profiles.c
parentad6ac942ca511e44d2b6b5cf08a3dff232f578e8 (diff)
downloadsamba-48e10c116d2ae79ef2e56aab89a706a76948a171.tar.gz
samba-48e10c116d2ae79ef2e56aab89a706a76948a171.tar.bz2
samba-48e10c116d2ae79ef2e56aab89a706a76948a171.zip
Make all of the required (I think) changes to make this code work for
big endian and little endian systems. (This used to be commit f50051120f93b5f95f72dcb3df201979e6302f5b)
Diffstat (limited to 'source3/utils/profiles.c')
-rw-r--r--source3/utils/profiles.c86
1 files changed, 61 insertions, 25 deletions
diff --git a/source3/utils/profiles.c b/source3/utils/profiles.c
index fabc118d81..96ab6d612c 100644
--- a/source3/utils/profiles.c
+++ b/source3/utils/profiles.c
@@ -456,6 +456,8 @@ int get_sid(DOM_SID *sid, char *sid_str)
* Replace SID1, component by component with SID2
* Assumes will never be called with unequal length SIDS
* so only touches 21-x-y-z-rid portion
+ * This routine does not need to deal with endianism as
+ * long as the incoming SIDs are both in the same (LE) format.
*/
void change_sid(DOM_SID *s1, DOM_SID *s2)
{
@@ -498,15 +500,16 @@ void process_acl(ACL *acl, char *prefix)
int ace_cnt, i;
ACE *ace;
- ace_cnt = acl->num_aces;
+ ace_cnt = IVAL(&acl->num_aces, 0);
ace = (ACE *)&acl->aces;
if (verbose) fprintf(stdout, "%sACEs: %u\n", prefix, ace_cnt);
for (i=0; i<ace_cnt; i++) {
- if (verbose) fprintf(stdout, "%s Perms: %08X, SID: ", prefix, ace->perms);
+ if (verbose) fprintf(stdout, "%s Perms: %08X, SID: ", prefix,
+ IVAL(&ace->perms, 0));
if (change)
process_sid(&ace->trustee, &old_sid, &new_sid);
print_sid(&ace->trustee);
- ace = (ACE *)((char *)ace + ace->length);
+ ace = (ACE *)((char *)ace + SVAL(&ace->length, 0));
}
}
@@ -514,6 +517,7 @@ void usage(voi)
{
fprintf(stderr, "usage: profiles [-c <OLD-SID> -n <NEW-SID>] <profilefile>\n");
fprintf(stderr, "Version: %s\n", VERSION);
+ fprintf(stderr, "\n\t-v\t sets verbose mode");
fprintf(stderr, "\n\t-c S-1-5-21-z-y-x-oldrid - provides SID to change");
fprintf(stderr, "\n\t-n S-1-5-21-a-b-c-newrid - provides SID to change to");
fprintf(stderr, "\n\t\tBoth must be present if the other is.");
@@ -547,7 +551,7 @@ int main(int argc, char *argv[])
* Now, process the arguments
*/
- while ((opt = getopt(argc, argv, "c:n:")) != EOF) {
+ while ((opt = getopt(argc, argv, "c:n:v")) != EOF) {
switch (opt) {
case 'c':
change = 1;
@@ -568,6 +572,10 @@ int main(int argc, char *argv[])
break;
+ case 'v':
+ verbose++;
+ break;
+
default:
usage();
exit(255);
@@ -607,64 +615,92 @@ int main(int argc, char *argv[])
exit(4);
}
+ /*
+ * In what follows, and in places above, in order to work on both LE and
+ * BE platforms, we have to use the Samba macros to extract SHORT, LONG
+ * and associated UNSIGNED quantities from the data in the mmap'd file.
+ * NOTE, however, that we do not need to do anything with memory
+ * addresses that we construct from pointers in our address space.
+ * For example,
+ *
+ * sec_desc = (MY_SEC_DESC *)&(sk_hdr->sec_desc[0]);
+ *
+ * is simply taking the address of a structure we already have the address
+ * of in our address space, while, the fields within it, will have to
+ * be accessed with the macros:
+ *
+ * owner_sid = (DOM_SID *)(&sk_hdr->sec_desc[0] +
+ * IVAL(&sec_desc->owner_off, 0));
+ *
+ * Which is pulling out an offset and adding it to an existing pointer.
+ *
+ */
+
regf_hdr = (REGF_HDR *)base;
if (verbose) fprintf(stdout, "Registry file size: %u\n", sbuf.st_size);
- if (regf_hdr->REGF_ID != REG_REGF_ID) {
+ if (IVAL(&regf_hdr->REGF_ID, 0) != REG_REGF_ID) {
fprintf(stderr, "Incorrect Registry file (doesn't have header ID): %s\n", argv[optind]);
exit(5);
}
if (verbose) fprintf(stdout, "First Key Off: %u, Data Block Size: %u\n",
- regf_hdr->first_key, regf_hdr->dblk_size);
+ IVAL(&regf_hdr->first_key, 0),
+ IVAL(&regf_hdr->dblk_size, 0));
- hbin_hdr = (HBIN_HDR *)(base + 0x1000);
+ hbin_hdr = (HBIN_HDR *)(base + 0x1000); /* No need for Endian stuff */
/*
* This should be the hbin_hdr
*/
- if (hbin_hdr->HBIN_ID != REG_HBIN_ID) {
+ if (IVAL(&hbin_hdr->HBIN_ID, 0) != REG_HBIN_ID) {
fprintf(stderr, "Incorrect hbin hdr: %s\n", argv[optind]);
exit(6);
}
if (verbose) fprintf(stdout, "Next Off: %u, Prev Off: %u\n",
- hbin_hdr->next_off, hbin_hdr->prev_off);
+ IVAL(&hbin_hdr->next_off, 0),
+ IVAL(&hbin_hdr->prev_off, 0));
- nk_hdr = (NK_HDR *)(base + 0x1000 + regf_hdr->first_key + 4);
+ nk_hdr = (NK_HDR *)(base + 0x1000 + IVAL(&regf_hdr->first_key, 0) + 4);
- if (nk_hdr->NK_ID != REG_NK_ID) {
+ if (SVAL(&nk_hdr->NK_ID, 0) != REG_NK_ID) {
fprintf(stderr, "Incorrect NK Header: %s\n", argv[optind]);
exit(7);
}
+ sk_off = first_sk_off = IVAL(&nk_hdr->sk_off, 0);
if (verbose) {
- fprintf(stdout, "Type: %0x\n", nk_hdr->type);
- fprintf(stdout, "SK Off : %o\n", (0x1000 + nk_hdr->sk_off + 4));
+ fprintf(stdout, "Type: %0x\n", SVAL(&nk_hdr->type, 0));
+ fprintf(stdout, "SK Off : %o\n", (0x1000 + sk_off + 4));
}
- sk_hdr = (SK_HDR *)(base + 0x1000 + nk_hdr->sk_off + 4);
- sk_off = first_sk_off = nk_hdr->sk_off;
+ sk_hdr = (SK_HDR *)(base + 0x1000 + sk_off + 4);
do {
DOM_SID *owner_sid, *group_sid;
ACL *sacl, *dacl;
- if (sk_hdr->SK_ID != REG_SK_ID) {
+ if (SVAL(&sk_hdr->SK_ID, 0) != REG_SK_ID) {
fprintf(stderr, "Incorrect SK Header format: %08X\n",
- (0x1000 + nk_hdr->sk_off + 4));
+ (0x1000 + sk_off + 4));
exit(8);
}
ptr = (int *)sk_hdr;
if (verbose) fprintf(stdout, "Off: %08X, Refs: %u, Size: %u\n",
- sk_off, sk_hdr->ref_cnt, sk_hdr->rec_size);
+ sk_off, IVAL(&sk_hdr->ref_cnt, 0),
+ IVAL(&sk_hdr->rec_size, 0));
sec_desc = (MY_SEC_DESC *)&(sk_hdr->sec_desc[0]);
- owner_sid = (DOM_SID *)(&sk_hdr->sec_desc[0] + sec_desc->owner_off);
- group_sid = (DOM_SID *)(&sk_hdr->sec_desc[0] + sec_desc->group_off);
- sacl = (ACL *)(&sk_hdr->sec_desc[0] + sec_desc->sacl_off);
- dacl = (ACL *)(&sk_hdr->sec_desc[0] + sec_desc->dacl_off);
+ owner_sid = (DOM_SID *)(&sk_hdr->sec_desc[0] +
+ IVAL(&sec_desc->owner_off, 0));
+ group_sid = (DOM_SID *)(&sk_hdr->sec_desc[0] +
+ IVAL(&sec_desc->group_off, 0));
+ sacl = (ACL *)(&sk_hdr->sec_desc[0] +
+ IVAL(&sec_desc->sacl_off, 0));
+ dacl = (ACL *)(&sk_hdr->sec_desc[0] +
+ IVAL(&sec_desc->dacl_off, 0));
if (verbose)fprintf(stdout, " Owner SID: ");
if (change) process_sid(owner_sid, &old_sid, &new_sid);
if (verbose) print_sid(owner_sid);
@@ -672,7 +708,7 @@ int main(int argc, char *argv[])
if (change) process_sid(group_sid, &old_sid, &new_sid);
if (verbose) print_sid(group_sid);
fprintf(stdout, " SACL: ");
- if (!sec_desc->sacl_off) {
+ if (!sec_desc->sacl_off) { /* LE zero == BE zero */
if (verbose) fprintf(stdout, "NONE\n");
}
else
@@ -683,8 +719,8 @@ int main(int argc, char *argv[])
}
else
process_acl(dacl, " ");
- sk_off = sk_hdr->prev_off;
- sk_hdr = (SK_HDR *)(base + OFF(sk_hdr->prev_off));
+ sk_off = IVAL(&sk_hdr->prev_off, 0);
+ sk_hdr = (SK_HDR *)(base + OFF(IVAL(&sk_hdr->prev_off, 0)));
} while (sk_off != first_sk_off);
munmap(base, sbuf.st_size);