Serious (and I *mean* serious) attempt to fix little/bigendian RPC issues.
authorJeremy Allison <jra@samba.org>
Fri, 9 Mar 2001 23:48:58 +0000 (23:48 +0000)
committerJeremy Allison <jra@samba.org>
Fri, 9 Mar 2001 23:48:58 +0000 (23:48 +0000)
We were reading the endainness in the RPC header and then never propagating
it to the internal parse_structs used to parse the data.
Also removed the "align" argument to prs_init as it was *always* set to
4, and if needed can be set differently on a case by case basis.
Now ready for AS/U testing when Herb gets it set up :-).
Jeremy.

24 files changed:
source/client/smbmount.c
source/include/ntdomain.h
source/include/proto.h
source/lib/msrpc-client.c
source/libsmb/cli_lsarpc.c
source/libsmb/clisecdesc.c
source/printing/nt_printing.c
source/rpc_client/cli_lsarpc.c
source/rpc_client/cli_netlogon.c
source/rpc_client/cli_pipe.c
source/rpc_client/cli_reg.c
source/rpc_client/cli_samr.c
source/rpc_client/cli_spoolss.c
source/rpc_client/cli_spoolss_notify.c
source/rpc_client/cli_srvsvc.c
source/rpc_client/cli_wkssvc.c
source/rpc_client/msrpc_spoolss.c
source/rpc_parse/parse_creds.c
source/rpc_parse/parse_prs.c
source/rpc_parse/parse_rpc.c
source/rpc_parse/parse_spoolss.c
source/rpc_server/srv_pipe.c
source/rpc_server/srv_pipe_hnd.c
source/smbd/nttrans.c

index ec3f32bd366717d1658c64662e3a0a85c6070a29..3c0b13293796499105d369b5aa732af4229a3def 100644 (file)
 #include <asm/types.h>
 #include <linux/smb_fs.h>
 
-/* Uncomment this to allow debug the mount.smb daemon */
-/* WARNING!  This option is incompatible with autofs/automount because
-       it does not close the stdout pipe back to the automount
-       process, which automount depends on.  This will cause automount
-       to hang!  Use with caution! */
-/* #define SMBFS_DEBUG 1 */
-
 extern struct in_addr ipzero;
 extern int DEBUGLEVEL;
 
 extern BOOL in_client;
 extern pstring user_socket_options;
+extern BOOL append_log;
+extern fstring remote_machine;
 
+static pstring credentials;
 static pstring my_netbios_name;
 static pstring password;
 static pstring username;
 static pstring workgroup;
 static pstring mpoint;
 static pstring service;
+static pstring options;
 
 static struct in_addr dest_ip;
 static BOOL have_ip;
@@ -73,7 +70,7 @@ static void daemonize(void)
        signal( SIGTERM, exit_parent );
 
        if ((child_pid = sys_fork()) < 0) {
-               fprintf(stderr,"could not fork\n");
+               DEBUG(0,("could not fork\n"));
        }
 
        if (child_pid > 0) {
@@ -138,8 +135,6 @@ static struct cli_state *do_connection(char *service)
        share++;
 
        server_n = server;
-       
-       ip = ipzero;
 
        make_nmb_name(&calling, my_netbios_name, 0x0);
        make_nmb_name(&called , server, 0x20);
@@ -151,13 +146,24 @@ static struct cli_state *do_connection(char *service)
        /* have to open a new connection */
        if (!(c=cli_initialise(NULL)) || (cli_set_port(c, smb_port) == 0) ||
            !cli_connect(c, server_n, &ip)) {
-               fprintf(stderr,"Connection to %s failed\n", server_n);
+               DEBUG(0,("%d: Connection to %s failed\n", getpid(), server_n));
+               if (c) {
+                       cli_shutdown(c);
+                       free(c);
+               }
                return NULL;
        }
 
        if (!cli_session_request(c, &calling, &called)) {
-               fprintf(stderr, "session request to %s failed\n", called.name);
+               char *p;
+               DEBUG(0,("%d: session request to %s failed (%s)\n", 
+                        getpid(), called.name, cli_errstr(c)));
                cli_shutdown(c);
+               free(c);
+               if ((p=strchr(called.name, '.'))) {
+                       *p = 0;
+                       goto again;
+               }
                if (strcmp(called.name, "*SMBSERVER")) {
                        make_nmb_name(&called , "*SMBSERVER", 0x20);
                        goto again;
@@ -165,11 +171,12 @@ static struct cli_state *do_connection(char *service)
                return NULL;
        }
 
-       DEBUG(4,(" session request ok\n"));
+       DEBUG(4,("%d: session request ok\n", getpid()));
 
        if (!cli_negprot(c)) {
-               fprintf(stderr, "protocol negotiation failed\n");
+               DEBUG(0,("%d: protocol negotiation failed\n", getpid()));
                cli_shutdown(c);
+               free(c);
                return NULL;
        }
 
@@ -184,20 +191,25 @@ static struct cli_state *do_connection(char *service)
                               password, strlen(password),
                               password, strlen(password),
                               workgroup)) {
-               fprintf(stderr, "session setup failed: %s\n", cli_errstr(c));
+               DEBUG(0,("%d: session setup failed: %s\n",
+                        getpid(), cli_errstr(c)));
+               cli_shutdown(c);
+               free(c);
                return NULL;
        }
 
-       DEBUG(4,(" session setup ok\n"));
+       DEBUG(4,("%d: session setup ok\n", getpid()));
 
        if (!cli_send_tconX(c, share, "?????",
                            password, strlen(password)+1)) {
-               fprintf(stderr,"tree connect failed: %s\n", cli_errstr(c));
+               DEBUG(0,("%d: tree connect failed: %s\n",
+                        getpid(), cli_errstr(c)));
                cli_shutdown(c);
+               free(c);
                return NULL;
        }
 
-       DEBUG(4,(" tconx ok\n"));
+       DEBUG(4,("%d: tconx ok\n", getpid()));
 
        got_pass = True;
 
@@ -226,29 +238,29 @@ static void smb_umount(char *mount_point)
                the lights to exit anyways...
        */
         if (umount(mount_point) != 0) {
-                fprintf(stderr, "Could not umount %s: %s\n",
-                        mount_point, strerror(errno));
+                DEBUG(0,("%d: Could not umount %s: %s\n",
+                        getpid(), mount_point, strerror(errno)));
                 return;
         }
 
         if ((fd = open(MOUNTED"~", O_RDWR|O_CREAT|O_EXCL, 0600)) == -1) {
-                fprintf(stderr, "Can't get "MOUNTED"~ lock file");
+                DEBUG(0,("%d: Can't get "MOUNTED"~ lock file", getpid()));
                 return;
         }
 
         close(fd);
        
         if ((mtab = setmntent(MOUNTED, "r")) == NULL) {
-                fprintf(stderr, "Can't open " MOUNTED ": %s\n",
-                        strerror(errno));
+                DEBUG(0,("%d: Can't open " MOUNTED ": %s\n",
+                        getpid(), strerror(errno)));
                 return;
         }
 
 #define MOUNTED_TMP MOUNTED".tmp"
 
         if ((new_mtab = setmntent(MOUNTED_TMP, "w")) == NULL) {
-                fprintf(stderr, "Can't open " MOUNTED_TMP ": %s\n",
-                        strerror(errno));
+                DEBUG(0,("%d: Can't open " MOUNTED_TMP ": %s\n",
+                        getpid(), strerror(errno)));
                 endmntent(mtab);
                 return;
         }
@@ -262,21 +274,21 @@ static void smb_umount(char *mount_point)
         endmntent(mtab);
 
         if (fchmod (fileno (new_mtab), S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < 0) {
-                fprintf(stderr, "Error changing mode of %s: %s\n",
-                        MOUNTED_TMP, strerror(errno));
+                DEBUG(0,("%d: Error changing mode of %s: %s\n",
+                        getpid(), MOUNTED_TMP, strerror(errno)));
                 return;
         }
 
         endmntent(new_mtab);
 
         if (rename(MOUNTED_TMP, MOUNTED) < 0) {
-                fprintf(stderr, "Cannot rename %s to %s: %s\n",
-                        MOUNTED, MOUNTED_TMP, strerror(errno));
+                DEBUG(0,("%d: Cannot rename %s to %s: %s\n",
+                        getpid(), MOUNTED, MOUNTED_TMP, strerror(errno)));
                 return;
         }
 
         if (unlink(MOUNTED"~") == -1) {
-                fprintf(stderr, "Can't remove "MOUNTED"~");
+                DEBUG(0,("%d: Can't remove "MOUNTED"~", getpid()));
                 return;
         }
 }
@@ -298,9 +310,10 @@ static void send_fs_socket(char *service, char *mount_point, struct cli_state *c
 
        while (1) {
                if ((fd = open(mount_point, O_RDONLY)) < 0) {
-                       fprintf(stderr, "mount.smbfs: can't open %s\n", mount_point);
+                       DEBUG(0,("mount.smbfs[%d]: can't open %s\n",
+                                getpid(), mount_point));
                        break;
-               }               
+               }
 
                conn_options.fd = c->fd;
                conn_options.protocol = c->protocol;
@@ -317,7 +330,9 @@ static void send_fs_socket(char *service, char *mount_point, struct cli_state *c
 
                res = ioctl(fd, SMB_IOC_NEWCONN, &conn_options);
                if (res != 0) {
-                       fprintf(stderr, "mount.smbfs: ioctl failed, res=%d\n", res);
+                       DEBUG(0,("mount.smbfs[%d]: ioctl failed, res=%d\n",
+                                getpid(), res));
+                       close(fd);
                        break;
                }
 
@@ -332,27 +347,50 @@ static void send_fs_socket(char *service, char *mount_point, struct cli_state *c
 
                close(fd);
 
-#ifndef SMBFS_DEBUG
-               /* Close all open files if we haven't done so yet. */
+               /* This looks wierd but we are only closing the userspace
+                  side, the connection has already been passed to smbfs and 
+                  it has increased the usage count on the socket.
+
+                  If we don't do this we will "leak" sockets and memory on
+                  each reconnection we have to make. */
+               cli_shutdown(c);
+               free(c);
+               c = NULL;
+
                if (!closed) {
-                       extern FILE *dbf;
+                       /* redirect stdout & stderr since we can't know that
+                          the library functions we use are using DEBUG. */
+                       if ( (fd = open("/dev/null", O_WRONLY)) < 0)
+                               DEBUG(2,("mount.smbfs: can't open /dev/null\n"));
+                       close_our_files(fd);
+                       if (fd >= 0) {
+                               dup2(fd, STDOUT_FILENO);
+                               dup2(fd, STDERR_FILENO);
+                               close(fd);
+                       }
+
+                       /* here we are no longer interactive */
+                       pstrcpy(remote_machine, "smbmount");    /* sneaky ... */
+                       setup_logging("mount.smbfs", False);
+                       append_log = True;
+                       reopen_logs();
+                       DEBUG(0, ("mount.smbfs: entering daemon mode for service %s, pid=%d\n", service, getpid()));
+
                        closed = 1;
-                       dbf = NULL;
-                       close_our_files(c?c->fd:-1);
                }
-#endif
 
-               /* Wait for a signal from smbfs ... */
-               CatchSignal(SIGUSR1, &usr1_handler);
-               pause();
-#ifdef SMBFS_DEBUG
-               DEBUG(2,("mount.smbfs: got signal, getting new socket\n"));
-#endif
-               c = do_connection(service);
+               /* Wait for a signal from smbfs ... but don't continue
+                   until we actually get a new connection. */
+               while (!c) {
+                       CatchSignal(SIGUSR1, &usr1_handler);
+                       pause();
+                       DEBUG(2,("mount.smbfs[%d]: got signal, getting new socket\n", getpid()));
+                       c = do_connection(service);
+               }
        }
 
        smb_umount(mount_point);
-       DEBUG(2,("mount.smbfs: exit\n"));
+       DEBUG(2,("mount.smbfs[%d]: exit\n", getpid()));
        exit(1);
 }
 
@@ -436,6 +474,10 @@ static void init_mount(void)
                args[i++] = "-d";
                args[i++] = xstrdup(tmp);
        }
+       if (options) {
+               args[i++] = "-o";
+               args[i++] = options;
+       }
 
        if (sys_fork() == 0) {
                if (file_exist(BINDIR "/smbmnt", NULL)) {
@@ -452,10 +494,12 @@ static void init_mount(void)
                fprintf(stderr,"waitpid failed: Error was %s", strerror(errno) );
                /* FIXME: do some proper error handling */
                exit(1);
-       }       
+       }
 
        if (WIFEXITED(status) && WEXITSTATUS(status) != 0) {
                fprintf(stderr,"smbmnt failed: %d\n", WEXITSTATUS(status));
+               /* FIXME: do some proper error handling */
+               exit(1);
        }
 
        /* Ok...  This is the rubicon for that mount point...  At any point
@@ -467,6 +511,123 @@ static void init_mount(void)
 }
 
 
+/****************************************************************************
+get a password from a a file or file descriptor
+exit on failure (from smbclient, move to libsmb or shared .c file?)
+****************************************************************************/
+static void get_password_file(void)
+{
+       int fd = -1;
+       char *p;
+       BOOL close_it = False;
+       pstring spec;
+       char pass[128];
+
+       if ((p = getenv("PASSWD_FD")) != NULL) {
+               pstrcpy(spec, "descriptor ");
+               pstrcat(spec, p);
+               sscanf(p, "%d", &fd);
+               close_it = False;
+       } else if ((p = getenv("PASSWD_FILE")) != NULL) {
+               fd = sys_open(p, O_RDONLY, 0);
+               pstrcpy(spec, p);
+               if (fd < 0) {
+                       fprintf(stderr, "Error opening PASSWD_FILE %s: %s\n",
+                               spec, strerror(errno));
+                       exit(1);
+               }
+               close_it = True;
+       }
+
+       for(p = pass, *p = '\0'; /* ensure that pass is null-terminated */
+           p && p - pass < sizeof(pass);) {
+               switch (read(fd, p, 1)) {
+               case 1:
+                       if (*p != '\n' && *p != '\0') {
+                               *++p = '\0'; /* advance p, and null-terminate pass */
+                               break;
+                       }
+               case 0:
+                       if (p - pass) {
+                               *p = '\0'; /* null-terminate it, just in case... */
+                               p = NULL; /* then force the loop condition to become false */
+                               break;
+                       } else {
+                               fprintf(stderr, "Error reading password from file %s: %s\n",
+                                       spec, "empty password\n");
+                               exit(1);
+                       }
+
+               default:
+                       fprintf(stderr, "Error reading password from file %s: %s\n",
+                               spec, strerror(errno));
+                       exit(1);
+               }
+       }
+       pstrcpy(password, pass);
+       if (close_it)
+               close(fd);
+}
+
+/****************************************************************************
+get username and password from a credentials file
+exit on failure (from smbclient, move to libsmb or shared .c file?)
+****************************************************************************/
+static void read_credentials_file(char *filename)
+{
+       FILE *auth;
+       fstring buf;
+       uint16 len = 0;
+       char *ptr, *val, *param;
+
+       if ((auth=sys_fopen(filename, "r")) == NULL)
+       {
+               /* fail if we can't open the credentials file */
+               DEBUG(0,("ERROR: Unable to open credentials file!\n"));
+               exit (-1);
+       }
+
+       while (!feof(auth))
+       {
+               /* get a line from the file */
+               if (!fgets (buf, sizeof(buf), auth))
+                       continue;
+               len = strlen(buf);
+
+               if ((len) && (buf[len-1]=='\n'))
+               {
+                       buf[len-1] = '\0';
+                       len--;
+               }
+               if (len == 0)
+                       continue;
+
+               /* break up the line into parameter & value.
+                  will need to eat a little whitespace possibly */
+               param = buf;
+               if (!(ptr = strchr (buf, '=')))
+                       continue;
+               val = ptr+1;
+               *ptr = '\0';
+
+               /* eat leading white space */
+               while ((*val!='\0') && ((*val==' ') || (*val=='\t')))
+                       val++;
+
+               if (strwicmp("password", param) == 0)
+               {
+                       pstrcpy(password, val);
+                       got_pass = True;
+               }
+               else if (strwicmp("username", param) == 0)
+                       pstrcpy(username, val);
+
+               memset(buf, 0, sizeof(buf));
+       }
+       fclose(auth);
+}
+
+
 /****************************************************************************
 usage on the program
 ****************************************************************************/
@@ -491,6 +652,7 @@ static void usage(void)
       workgroup=<arg>                 workgroup on destination
       sockopt=<arg>                   TCP socket options
       scope=<arg>                     NetBIOS scope
+      credentials=<filename>          file with username/password
       guest                           don't prompt for a password
       ro                              mount read-only
       rw                              mount read-write
@@ -517,6 +679,7 @@ static void parse_mount_smb(int argc, char **argv)
        extern char *optarg;
        int val;
        extern pstring global_scope;
+       char *p;
 
        if (argc < 2 || argv[1][0] == '-') {
                usage();
@@ -537,6 +700,9 @@ static void parse_mount_smb(int argc, char **argv)
                return;
        }
 
+       options[0] = 0;
+       p = options;
+
        /*
         * option parsing from nfsmount.c (util-linux-2.9u)
         */
@@ -565,6 +731,8 @@ static void parse_mount_smb(int argc, char **argv)
                                pstrcpy(password,opteq+1);
                                got_pass = True;
                                memset(opteq+1,'X',strlen(password));
+                       } else if(!strcmp(opts, "credentials")) {
+                               pstrcpy(credentials,opteq+1);
                        } else if(!strcmp(opts, "netbiosname")) {
                                pstrcpy(my_netbios_name,opteq+1);
                        } else if(!strcmp(opts, "uid")) {
@@ -593,8 +761,8 @@ static void parse_mount_smb(int argc, char **argv)
                        } else if(!strcmp(opts, "scope")) {
                                pstrcpy(global_scope,opteq+1);
                        } else {
-                               usage();
-                               exit(1);
+                               slprintf(p, sizeof(pstring) - (p - options) - 1, "%s=%s,", opts, opteq+1);
+                               p += strlen(p);
                        }
                } else {
                        val = 1;
@@ -607,6 +775,11 @@ static void parse_mount_smb(int argc, char **argv)
                                mount_ro = 0;
                        } else if(!strcmp(opts, "ro")) {
                                mount_ro = 1;
+                       } else {
+                               strncpy(p, opts, sizeof(pstring) - (p - options) - 1);
+                               p += strlen(opts);
+                               *p++ = ',';
+                               *p = 0;
                        }
                }
        }
@@ -615,6 +788,11 @@ static void parse_mount_smb(int argc, char **argv)
                usage();
                exit(1);
        }
+
+       if (p != options) {
+               *(p-1) = 0;     /* remove trailing , */
+               DEBUG(3,("passthrough options '%s'\n", options));
+       }
 }
 
 /****************************************************************************
@@ -628,7 +806,8 @@ static void parse_mount_smb(int argc, char **argv)
        char *p;
 
        DEBUGLEVEL = 1;
-       
+
+       /* here we are interactive, even if run from autofs */
        setup_logging("mount.smbfs",True);
 
        TimeInit();
@@ -643,26 +822,38 @@ static void parse_mount_smb(int argc, char **argv)
                        *p = 0;
                        pstrcpy(password,p+1);
                        got_pass = True;
+                       memset(strchr(getenv("USER"),'%')+1,'X',strlen(password));
                }
+               strupper(username);
        }
 
        if (getenv("PASSWD")) {
                pstrcpy(password,getenv("PASSWD"));
+               got_pass = True;
+       }
+
+       if (getenv("PASSWD_FD") || getenv("PASSWD_FILE")) {
+               get_password_file();
+               got_pass = True;
        }
 
        if (*username == 0 && getenv("LOGNAME")) {
                pstrcpy(username,getenv("LOGNAME"));
        }
 
-       parse_mount_smb(argc, argv);
-
-       DEBUG(3,("mount.smbfs started (version %s)\n", VERSION));
-
        if (!lp_load(servicesf,True,False,False)) {
                fprintf(stderr, "Can't load %s - run testparm to debug it\n", 
                        servicesf);
        }
 
+       parse_mount_smb(argc, argv);
+
+       if (*credentials != 0) {
+               read_credentials_file(credentials);
+       }
+
+       DEBUG(3,("mount.smbfs started (version %s)\n", VERSION));
+
        codepage_initialise(lp_client_code_page());
 
        if (*workgroup == 0) {
index 7a47f6150e95f7a9e712d871fdf94bdacd48e815..0ae48169fbd5c2c8fb3bd4d012febdc1b71763db 100644 (file)
@@ -79,6 +79,11 @@ typedef struct _prs_struct
 #define MARSHALLING(ps) (!(ps)->io)
 #define UNMARSHALLING(ps) ((ps)->io)
 
+#define RPC_BIG_ENDIAN                 1
+#define RPC_LITTLE_ENDIAN      0
+
+#define RPC_PARSE_ALIGN 4
+
 typedef struct _output_data {
        /*
         * Raw RPC output data. This does not include RPC headers or footers.
@@ -195,6 +200,12 @@ typedef struct pipes_struct
        
        BOOL fault_state;
        
+       /*
+        * Set to RPC_BIG_ENDIAN when dealing with big-endian PDU's
+        */
+       
+       BOOL endian;
+       
        /*
         * Struct to deal with multiple pdu inputs.
         */
index 442354abedf6d24e5d43ebb6ca48cc35f1714d3f..a532830ce1fd1c8741f6c191dec890eb4f63df82 100644 (file)
@@ -2529,7 +2529,7 @@ BOOL net_io_r_sam_logoff(char *desc, NET_R_SAM_LOGOFF *r_l, prs_struct *ps, int
 
 void prs_dump(char *name, int v, prs_struct *ps);
 void prs_debug(prs_struct *ps, int depth, char *desc, char *fn_name);
-BOOL prs_init(prs_struct *ps, uint32 size, uint8 align, TALLOC_CTX *ctx, BOOL io);
+BOOL prs_init(prs_struct *ps, uint32 size, TALLOC_CTX *ctx, BOOL io);
 BOOL prs_read(prs_struct *ps, int fd, size_t len, int timeout);
 void prs_mem_free(prs_struct *ps);
 char *prs_alloc_mem(prs_struct *ps, size_t size);
@@ -2546,7 +2546,7 @@ BOOL prs_set_offset(prs_struct *ps, uint32 offset);
 BOOL prs_append_prs_data(prs_struct *dst, prs_struct *src);
 BOOL prs_append_some_prs_data(prs_struct *dst, prs_struct *src, int32 start, uint32 len);
 BOOL prs_append_data(prs_struct *dst, char *src, uint32 len);
-void prs_set_bigendian_data(prs_struct *ps);
+void prs_set_endian_data(prs_struct *ps, BOOL endian);
 BOOL prs_align(prs_struct *ps);
 BOOL prs_align_needed(prs_struct *ps, uint32 needed);
 char *prs_mem_get(prs_struct *ps, uint32 extra_size);
index 867094a2c6007f385d2b152a8baae7ccb2bc3fa5..7051db563bea03f1566a4ef537b6b2c8513d0cb0 100644 (file)
@@ -36,7 +36,7 @@ BOOL receive_msrpc(int fd, prs_struct *data, unsigned int timeout)
        size_t len;
        RPC_HDR hdr;
 
-       prs_init(data, 0, 4, NULL, True);
+       prs_init(data, 0, NULL, True);
 
        ok = prs_read(data, fd, 16, timeout);
 
index e4da7a7cc7e151d7b2471a70bdbdb256cb81a568..7f5431e4b3a897d6b1317f828ffb22b638e7bac9 100644 (file)
@@ -98,8 +98,8 @@ uint32 cli_lsa_open_policy(struct cli_state *cli, BOOL sec_qos,
 
        /* Initialise parse structures */
 
-       prs_init(&qbuf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, True);
+       prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* Initialise input parameters */
 
@@ -152,8 +152,8 @@ uint32 cli_lsa_close(struct cli_state *cli, POLICY_HND *pol)
 
        /* Initialise parse structures */
 
-       prs_init(&qbuf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, True);
+       prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* Marshall data and send request */
 
@@ -204,8 +204,8 @@ uint32 cli_lsa_lookup_sids(struct cli_state *cli, POLICY_HND *pol,
 
        /* Initialise parse structures */
 
-       prs_init(&qbuf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, True);
+       prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* Marshall data and send request */
 
@@ -310,8 +310,8 @@ uint32 cli_lsa_lookup_names(struct cli_state *cli, POLICY_HND *pol,
 
        /* Initialise parse structures */
 
-       prs_init(&qbuf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, True);
+       prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* Marshall data and send request */
 
@@ -409,8 +409,8 @@ uint32 cli_lsa_query_info_policy(struct cli_state *cli, POLICY_HND *pol,
 
        /* Initialise parse structures */
 
-       prs_init(&qbuf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, True);
+       prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* Marshall data and send request */
 
@@ -494,8 +494,8 @@ uint32 cli_lsa_enum_trust_dom(struct cli_state *cli, POLICY_HND *pol,
 
        /* Initialise parse structures */
 
-       prs_init(&qbuf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, True);
+       prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* Marshall data and send request */
 
index 59d8bdcc71d2e58037ed043da49e3aa1474da005..d34a23537a17975940d2a890c7525aa7004a28b8 100644 (file)
@@ -63,7 +63,7 @@ SEC_DESC *cli_query_secdesc(struct cli_state *cli,int fd)
                goto cleanup;
        }
 
-       prs_init(&pd, rdata_count, 4, mem_ctx, UNMARSHALL);
+       prs_init(&pd, rdata_count, mem_ctx, UNMARSHALL);
        prs_append_data(&pd, rdata, rdata_count);
        pd.data_offset = 0;
 
@@ -104,7 +104,7 @@ BOOL cli_set_secdesc(struct cli_state *cli,int fd, SEC_DESC *sd)
                goto cleanup;
        }
 
-       prs_init(&pd, 0, 4, mem_ctx, MARSHALL);
+       prs_init(&pd, 0, mem_ctx, MARSHALL);
        prs_give_memory(&pd, NULL, 0, True);
 
        if (!sec_io_desc("sd data", &sd, &pd, 1)) {
index a2337c25f309781745dc2761b7f4c3ffb9574d21..e491d9a6b9933c114f988acc10b162c4c6a8ab08 100644 (file)
@@ -2756,7 +2756,7 @@ uint32 nt_printing_setsec(char *printername, SEC_DESC_BUF *secdesc_ctr)
        /* Store the security descriptor in a tdb */
 
        prs_init(&ps, (uint32)sec_desc_size(new_secdesc_ctr->sec) +
-                sizeof(SEC_DESC_BUF), 4, mem_ctx, MARSHALL);
+                sizeof(SEC_DESC_BUF), mem_ctx, MARSHALL);
 
        if (!sec_io_desc_buf("nt_printing_setsec", &new_secdesc_ctr,
                             &ps, 1)) {
index 9ba13552bc52b9448e0c8cb7ee81fe8ac27708ac..649be20a52f23d48ab821c12af22d5beff9209ab 100644 (file)
@@ -43,8 +43,8 @@ BOOL do_lsa_open_policy(struct cli_state *cli,
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL );
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL );
 
        /* create and send a MSRPC command with api LSA_OPENPOLICY */
 
@@ -114,8 +114,8 @@ BOOL do_lsa_query_info_pol(struct cli_state *cli,
        if (hnd == NULL || domain_name == NULL || domain_sid == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL );
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL );
 
        /* create and send a MSRPC command with api LSA_QUERYINFOPOLICY */
 
@@ -213,8 +213,8 @@ BOOL do_lsa_close(struct cli_state *cli, POLICY_HND *hnd)
 
        /* create and send a MSRPC command with api LSA_OPENPOLICY */
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL );
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL );
 
        DEBUG(4,("LSA Close\n"));
 
@@ -305,8 +305,8 @@ uint32 lsa_open_policy(const char *system_name, POLICY_HND *hnd,
 
        if (hnd == NULL) return NT_STATUS_UNSUCCESSFUL;
 
-       prs_init(&buf, MAX_PDU_FRAG_LEN, 4, NULL, False);
-       prs_init(&rbuf, 0, 4, NULL, True);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, NULL, MARSHALL);
+       prs_init(&rbuf, 0, NULL, UNMARSHALL);
 
        /* create and send a MSRPC command with api LSA_OPENPOLICY */
 
@@ -371,8 +371,8 @@ uint32 lsa_close(POLICY_HND *hnd)
 
         /* Create and send a MSRPC command with api LSA_OPENPOLICY */
 
-        prs_init(&buf, MAX_PDU_FRAG_LEN, 4, NULL, False);
-        prs_init(&rbuf, 0, 4, NULL, True);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, NULL, MARSHALL);
+        prs_init(&rbuf, 0, NULL, UNMARSHALL);
 
         DEBUG(4, ("LSA Close\n"));
 
@@ -437,8 +437,8 @@ uint32 lsa_lookup_sids(POLICY_HND *hnd, int num_sids, DOM_SID *sids,
                *names = NULL;
        }
 
-       prs_init(&buf, MAX_PDU_FRAG_LEN, 4, ctx, False);
-       prs_init(&rbuf, 0, 4, ctx, True);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+       prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
        /* Create and send a MSRPC command with api LSA_LOOKUP_SIDS */
 
@@ -580,8 +580,8 @@ uint32 lsa_lookup_names(POLICY_HND *hnd, int num_names, char **names,
 
        if (hnd == NULL || num_sids == 0 || sids == NULL) return False;
 
-       prs_init(&buf, MAX_PDU_FRAG_LEN, 4, ctx, False);
-       prs_init(&rbuf, 0, 4, ctx, True);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+       prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api LSA_LOOKUP_NAMES */
 
index 1ed1db4d0a97548586d1aa47293818e1e335b547..493e5ac152c2f5374ac541cf041dedd66c68a691 100644 (file)
@@ -64,8 +64,8 @@ BOOL cli_net_logon_ctrl2(struct cli_state *cli, uint32 status_level)
   NET_Q_LOGON_CTRL2 q_l;
   BOOL ok = False;
 
-  prs_init(&buf , 1024, 4, cli->mem_ctx, False);
-  prs_init(&rbuf, 0,    4, cli->mem_ctx, True );
+  prs_init(&buf , 1024, cli->mem_ctx, MARSHALL);
+  prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
   /* create and send a MSRPC command with api NET_LOGON_CTRL2 */
 
@@ -126,8 +126,8 @@ BOOL cli_net_auth2(struct cli_state *cli, uint16 sec_chan,
   NET_Q_AUTH_2 q_a;
   BOOL ok = False;
 
-  prs_init(&buf , 1024, 4, cli->mem_ctx, False);
-  prs_init(&rbuf, 0,    4, cli->mem_ctx, True );
+  prs_init(&buf , 1024, cli->mem_ctx, MARSHALL);
+  prs_init(&rbuf, 0,    cli->mem_ctx, UNMARSHALL);
 
   /* create and send a MSRPC command with api NET_AUTH2 */
 
@@ -216,8 +216,8 @@ BOOL cli_net_req_chal(struct cli_state *cli, DOM_CHAL *clnt_chal, DOM_CHAL *srv_
   NET_Q_REQ_CHAL q_c;
   BOOL valid_chal = False;
 
-  prs_init(&buf , 1024, 4, cli->mem_ctx, False);
-  prs_init(&rbuf, 0,    4, cli->mem_ctx, True );
+  prs_init(&buf , 1024, cli->mem_ctx, MARSHALL);
+  prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
   /* create and send a MSRPC command with api NET_REQCHAL */
 
@@ -281,8 +281,8 @@ BOOL cli_net_srv_pwset(struct cli_state *cli, uint8 hashed_mach_pwd[16])
 
   gen_next_creds( cli, &new_clnt_cred);
 
-  prs_init(&buf , 1024, 4, cli->mem_ctx, False);
-  prs_init(&rbuf, 0,    4, cli->mem_ctx, True );
+  prs_init(&buf , 1024, cli->mem_ctx, MARSHALL);
+  prs_init(&rbuf, 0,    cli->mem_ctx, UNMARSHALL);
 
   /* create and send a MSRPC command with api NET_SRV_PWSET */
 
@@ -354,8 +354,8 @@ static uint32 cli_net_sam_logon_internal(struct cli_state *cli, NET_ID_INFO_CTR
 
        gen_next_creds( cli, &new_clnt_cred);
 
-       prs_init(&buf , 1024, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0,    4, cli->mem_ctx, True );
+       prs_init(&buf , 1024, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0,    cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api NET_SAMLOGON */
 
@@ -498,8 +498,8 @@ BOOL cli_net_sam_logoff(struct cli_state *cli, NET_ID_INFO_CTR *ctr)
 
   gen_next_creds( cli, &new_clnt_cred);
 
-  prs_init(&buf , 1024, 4, cli->mem_ctx, False);
-  prs_init(&rbuf, 0,    4, cli->mem_ctx, True );
+  prs_init(&buf , 1024, cli->mem_ctx, MARSHALL);
+  prs_init(&rbuf, 0,    cli->mem_ctx, UNMARSHALL);
 
   /* create and send a MSRPC command with api NET_SAMLOGOFF */
 
index 67cf65a4ff3e68a2c07e99a0f263694af834c8f0..b4ca34ea7d5b58a4e59d412358be595e969990a3 100644 (file)
@@ -106,7 +106,7 @@ static BOOL rpc_read(struct cli_state *cli, prs_struct *rdata, uint32 data_to_re
 }
 
 /****************************************************************************
- Checks the header.
+ Checks the header. This will set the endian bit in the rdata prs_struct. JRA.
  ****************************************************************************/
 
 static BOOL rpc_check_hdr(prs_struct *rdata, RPC_HDR *rhdr, 
@@ -114,6 +114,8 @@ static BOOL rpc_check_hdr(prs_struct *rdata, RPC_HDR *rhdr,
 {
        DEBUG(5,("rpc_check_hdr: rdata->data_size = %u\n", (uint32)prs_data_size(rdata) ));
 
+       /* Next call sets endian bit. */
+
        if(!smb_io_rpc_hdr("rpc_hdr   ", rhdr, rdata, 0)) {
                DEBUG(0,("rpc_check_hdr: Failed to unmarshall RPC_HDR.\n"));
                return False;
@@ -223,7 +225,12 @@ static BOOL rpc_auth_pipe(struct cli_state *cli, prs_struct *rdata, int len, int
 
                memcpy(data, dp, sizeof(data));
                
-               prs_init(&auth_req , 0, 4, cli->mem_ctx, UNMARSHALL);
+               prs_init(&auth_req , 0, cli->mem_ctx, UNMARSHALL);
+
+               /* The endianness must be preserved... JRA. */
+
+               prs_set_endian_data(&auth_req, rdata->bigendian_data);
+
                prs_give_memory(&auth_req, data, RPC_HDR_AUTH_LEN, False);
 
                /*
@@ -267,7 +274,11 @@ static BOOL rpc_auth_pipe(struct cli_state *cli, prs_struct *rdata, int len, int
                memcpy(data, dp, RPC_AUTH_NTLMSSP_CHK_LEN);
                dump_data(100, data, auth_len);
 
-               prs_init(&auth_verf, 0, 4, cli->mem_ctx, UNMARSHALL);
+               prs_init(&auth_verf, 0, cli->mem_ctx, UNMARSHALL);
+
+               /* The endinness must be preserved. JRA. */
+               prs_set_endian_data( &auth_verf, rdata->bigendian_data);
+
                prs_give_memory(&auth_verf, data, RPC_AUTH_NTLMSSP_CHK_LEN, False);
 
                if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &chk, &auth_verf, 0)) {
@@ -369,6 +380,8 @@ static BOOL rpc_api_pipe(struct cli_state *cli, uint16 cmd, prs_struct *data, pr
        prs_give_memory(rdata, prdata, rdata_len, True);
        current_offset = rdata_len;
 
+       /* This next call sets the endian bit correctly in rdata. */
+
        if (!rpc_check_hdr(rdata, &rhdr, &first, &last, &len)) {
                prs_mem_free(rdata);
                return False;
@@ -446,7 +459,7 @@ static BOOL rpc_api_pipe(struct cli_state *cli, uint16 cmd, prs_struct *data, pr
                 * First read the header of the next PDU.
                 */
 
-               prs_init(&hps, 0, 4, cli->mem_ctx, UNMARSHALL);
+               prs_init(&hps, 0, cli->mem_ctx, UNMARSHALL);
                prs_give_memory(&hps, hdr_data, sizeof(hdr_data), False);
 
                num_read = cli_read(cli, cli->nt_pipe_fnum, hdr_data, 0, RPC_HEADER_LEN+RPC_HDR_RESP_LEN);
@@ -463,9 +476,20 @@ static BOOL rpc_api_pipe(struct cli_state *cli, uint16 cmd, prs_struct *data, pr
                        return False;
                }
 
+               /* This call sets the endianness in hps. */
+
                if (!rpc_check_hdr(&hps, &rhdr, &first, &last, &len))
                        return False;
 
+               /* Ensure the endianness in rdata is set correctly - must be same as hps. */
+
+               if (hps.bigendian_data != rdata->bigendian_data) {
+                       DEBUG(0,("rpc_api_pipe: Error : Endianness changed from %s to %s\n",
+                               rdata->bigendian_data ? "big" : "little",
+                               hps.bigendian_data ? "big" : "little" ));
+                       return False;
+               }
+
                if(!smb_io_rpc_hdr_resp("rpc_hdr_resp", &rhdr_resp, &hps, 0)) {
                        DEBUG(0,("rpc_api_pipe: Error in unmarshalling RPC_HDR_RESP.\n"));
                        return False;
@@ -522,7 +546,7 @@ static BOOL create_rpc_bind_req(prs_struct *rpc_out, BOOL do_auth, uint32 rpc_ca
        prs_struct auth_info;
        int auth_len = 0;
 
-       prs_init(&auth_info, 0, 4, prs_get_mem_context(rpc_out), MARSHALL);
+       prs_init(&auth_info, 0, prs_get_mem_context(rpc_out), MARSHALL);
 
        if (do_auth) {
                RPC_HDR_AUTH hdr_auth;
@@ -626,7 +650,7 @@ static BOOL create_rpc_bind_resp(struct pwd_info *pwd,
         * Marshall the variable length data into a temporary parse
         * struct, pointing into a 4k local buffer.
         */
-        prs_init(&auth_info, 0, 4, prs_get_mem_context(rpc_out), MARSHALL);
+       prs_init(&auth_info, 0, prs_get_mem_context(rpc_out), MARSHALL);
 
        /*
         * Use the 4k buffer to store the auth info.
@@ -784,7 +808,7 @@ BOOL rpc_api_pipe_req(struct cli_state *cli, uint8 op_num,
         * Malloc a parse struct to hold it (and enough for alignments).
         */
 
-       if(!prs_init(&outgoing_packet, data_len + 8, 4, cli->mem_ctx, MARSHALL)) {
+       if(!prs_init(&outgoing_packet, data_len + 8, cli->mem_ctx, MARSHALL)) {
                DEBUG(0,("rpc_api_pipe_req: Failed to malloc %u bytes.\n", (unsigned int)data_len ));
                return False;
        }
@@ -1022,7 +1046,7 @@ static BOOL rpc_send_auth_reply(struct cli_state *cli, prs_struct *rdata, uint32
 
        pwd_make_lm_nt_owf(&cli->pwd, rhdr_chal.challenge);
 
-       prs_init(&rpc_out, 0, 4, cli->mem_ctx, MARSHALL);
+       prs_init(&rpc_out, 0, cli->mem_ctx, MARSHALL);
 
        prs_give_memory( &rpc_out, buffer, sizeof(buffer), False);
 
@@ -1094,7 +1118,7 @@ BOOL rpc_pipe_bind(struct cli_state *cli, char *pipe_name, char *my_name)
        if (!valid_pipe_name(pipe_name, &abstract, &transfer))
                return False;
 
-       prs_init(&rpc_out, 0, 4, cli->mem_ctx, MARSHALL);
+       prs_init(&rpc_out, 0, cli->mem_ctx, MARSHALL);
 
        /*
         * Use the MAX_PDU_FRAG_LEN buffer to store the bind request.
@@ -1110,7 +1134,7 @@ BOOL rpc_pipe_bind(struct cli_state *cli, char *pipe_name, char *my_name)
                            global_myname, cli->domain, cli->ntlmssp_cli_flgs);
 
        /* Initialize the incoming data struct. */
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        /* send data on \PIPE\.  receive a response */
        if (rpc_api_pipe(cli, 0x0026, &rpc_out, &rdata)) {
index 32439e9b5d4d70b091c5b7e39af928f0db3f7d11..dc547801df945929df0ba128916d7625505b11f8 100644 (file)
@@ -86,8 +86,8 @@ BOOL do_reg_open_hklm(struct cli_state *cli, uint16 unknown_0, uint32 level,
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_OPEN_HKLM */
 
@@ -147,8 +147,8 @@ BOOL do_reg_open_hku(struct cli_state *cli, uint16 unknown_0, uint32 level,
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_OPEN_HKU */
 
@@ -209,8 +209,8 @@ BOOL do_reg_flush_key(struct cli_state *cli, POLICY_HND *hnd)
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_FLUSH_KEY */
 
@@ -271,8 +271,8 @@ BOOL do_reg_query_key(struct cli_state *cli, POLICY_HND *hnd,
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_QUERY_KEY */
 
@@ -339,8 +339,8 @@ BOOL do_reg_unknown_1a(struct cli_state *cli, POLICY_HND *hnd, uint32 *unk)
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_UNKNOWN_1A */
 
@@ -399,8 +399,8 @@ BOOL do_reg_query_info(struct cli_state *cli, POLICY_HND *hnd,
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_INFO */
 
@@ -459,8 +459,8 @@ BOOL do_reg_set_key_sec(struct cli_state *cli, POLICY_HND *hnd, SEC_DESC_BUF *se
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_SET_KEY_SEC */
 
@@ -515,8 +515,8 @@ BOOL do_reg_get_key_sec(struct cli_state *cli, POLICY_HND *hnd, uint32 *sec_buf_
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_GET_KEY_SEC */
 
@@ -581,8 +581,8 @@ BOOL do_reg_delete_val(struct cli_state *cli, POLICY_HND *hnd, char *val_name)
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_DELETE_VALUE */
 
@@ -638,8 +638,8 @@ BOOL do_reg_delete_key(struct cli_state *cli, POLICY_HND *hnd, char *key_name)
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_DELETE_KEY */
 
@@ -720,8 +720,8 @@ BOOL do_reg_create_key(struct cli_state *cli, POLICY_HND *hnd,
                return False;
        }
 
-       prs_init(&buf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        init_reg_q_create_key(&q_o, hnd, key_name, key_class, sam_access, sec_buf);
 
@@ -778,8 +778,8 @@ BOOL do_reg_enum_key(struct cli_state *cli, POLICY_HND *hnd,
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_ENUM_KEY */
 
@@ -841,8 +841,8 @@ BOOL do_reg_create_val(struct cli_state *cli, POLICY_HND *hnd,
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_CREATE_VALUE */
 
@@ -901,8 +901,8 @@ BOOL do_reg_enum_val(struct cli_state *cli, POLICY_HND *hnd,
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_ENUM_VALUE */
 
@@ -964,8 +964,8 @@ BOOL do_reg_open_entry(struct cli_state *cli, POLICY_HND *hnd,
        if (hnd == NULL)
                return False;
 
-       prs_init(&buf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api REG_OPEN_ENTRY */
 
@@ -1025,8 +1025,8 @@ BOOL do_reg_close(struct cli_state *cli, POLICY_HND *hnd)
 
        /* create and send a MSRPC command with api REG_CLOSE */
 
-       prs_init(&buf, MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("REG Close\n"));
 
index f8c10abae1165e364cd89de79777ce96939a7888..eb9032f7ce7282cde1d049e7682982d4154784a7 100644 (file)
@@ -113,8 +113,8 @@ BOOL do_samr_chgpasswd_user(struct cli_state *cli,
 
        /* create and send a MSRPC command with api SAMR_CHGPASSWD_USER */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("SAMR Change User Password. server:%s username:%s\n",
                srv_name, user_name));
@@ -169,8 +169,8 @@ BOOL do_samr_unknown_38(struct cli_state *cli, char *srv_name)
 
        /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("SAMR Unknown 38 server:%s\n", srv_name));
 
@@ -225,8 +225,8 @@ BOOL do_samr_query_dom_info(struct cli_state *cli,
 
        /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("SAMR Unknown 8 switch:%d\n", switch_value));
 
@@ -287,8 +287,8 @@ BOOL do_samr_enum_dom_users(struct cli_state *cli,
 
        /* create and send a MSRPC command with api SAMR_ENUM_DOM_USERS */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("SAMR Enum SAM DB max size:%x\n", size));
 
@@ -374,8 +374,8 @@ BOOL do_samr_connect(struct cli_state *cli,
 
        /* create and send a MSRPC command with api SAMR_CONNECT */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("SAMR Open Policy server:%s undoc value:%x\n",
                                srv_name, unknown_0));
@@ -435,8 +435,8 @@ BOOL do_samr_open_user(struct cli_state *cli,
 
        /* create and send a MSRPC command with api SAMR_OPEN_USER */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("SAMR Open User.  unk_0: %08x RID:%x\n",
                  unk_0, rid));
@@ -497,8 +497,8 @@ BOOL do_samr_open_domain(struct cli_state *cli,
 
        /* create and send a MSRPC command with api SAMR_OPEN_DOMAIN */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        sid_to_string(sid_str, sid);
        DEBUG(4,("SAMR Open Domain.  SID:%s RID:%x\n", sid_str, rid));
@@ -561,8 +561,8 @@ BOOL do_samr_query_unknown_12(struct cli_state *cli,
 
        /* create and send a MSRPC command with api SAMR_UNKNOWN_12 */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("SAMR Query Unknown 12.\n"));
 
@@ -638,8 +638,8 @@ BOOL do_samr_query_usergroups(struct cli_state *cli,
 
        /* create and send a MSRPC command with api SAMR_QUERY_USERGROUPS */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("SAMR Query User Groups.\n"));
 
@@ -700,8 +700,8 @@ BOOL do_samr_query_userinfo(struct cli_state *cli,
 
        /* create and send a MSRPC command with api SAMR_QUERY_USERINFO */
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        DEBUG(4,("SAMR Query User Info.  level: %d\n", switch_value));
 
@@ -769,8 +769,8 @@ BOOL do_samr_close(struct cli_state *cli, POLICY_HND *hnd)
        if (hnd == NULL)
                return False;
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4, cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api SAMR_CLOSE_HND */
 
index 75e5e66d90a6f11dcb866e9bc864509ea9977cd2..7588ba152fb0e30547cbeffda83ea3e34ced7614 100644 (file)
@@ -47,8 +47,8 @@ uint32 spoolss_enum_printerdrivers(const char *srv_name, const char *environment
         if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
                 return False;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
 
@@ -106,8 +106,8 @@ uint32 spoolss_enum_printers(uint32 flags, fstring srv_name, uint32 level,
         if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
                 return False;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
 
@@ -165,8 +165,8 @@ uint32 spoolss_enum_ports(fstring srv_name, uint32 level,
         if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
                 return False;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMPORTS */
 
@@ -221,8 +221,8 @@ uint32 spoolss_enum_jobs(const POLICY_HND *hnd, uint32 firstjob, uint32 numofjob
         if (hnd == NULL)
                 return NT_STATUS_INVALID_PARAMETER;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
 
@@ -278,8 +278,8 @@ uint32 spoolss_enum_printerdata(const POLICY_HND *hnd, uint32 idx,
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api  SPOOLSS_ENUMPRINTERDATA*/
 
@@ -337,8 +337,8 @@ uint32 spoolss_getprinter(const POLICY_HND *hnd, uint32 level,
         if (hnd == NULL)
                 return NT_STATUS_INVALID_PARAMETER;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
 
@@ -390,8 +390,8 @@ uint32 spoolss_getprinterdriver(const POLICY_HND *hnd,
         if (hnd == NULL)
                 return NT_STATUS_INVALID_PARAMETER;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMJOBS */
 
@@ -464,8 +464,8 @@ BOOL spoolss_open_printer_ex(  const char *printername,
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_OPENPRINTEREX */
 
@@ -538,8 +538,8 @@ BOOL spoolss_addprinterex(POLICY_HND *hnd, const char* srv_name, PRINTER_INFO_2
                DEBUG(0,("spoolss_addprinterex: talloc_init() failed!\n"));
                return NT_STATUS_ACCESS_DENIED;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUMPORTS */
         DEBUG(5,("SPOOLSS Add Printer Ex (Server: %s)\n", srv_name));
@@ -611,8 +611,8 @@ BOOL spoolss_closeprinter(POLICY_HND *hnd)
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         DEBUG(4,("SPOOL Close Printer\n"));
 
@@ -671,8 +671,8 @@ uint32 spoolss_getprinterdata(const POLICY_HND *hnd, const UNISTR2 *valuename,
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_GETPRINTERDATA */
 
@@ -726,8 +726,8 @@ uint32 spoolss_getprinterdriverdir(fstring srv_name, fstring env_name, uint32 le
         if (!cli_connection_init(srv_name, PIPE_SPOOLSS, &con))
                 return False;
 
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, ctx, MARSHALL);
+        prs_init(&rbuf, 0, ctx, UNMARSHALL);
 
         /* create and send a MSRPC command with api SPOOLSS_ENUM_PRINTERS */
 
@@ -787,8 +787,8 @@ uint32 spoolss_addprinterdriver(const char *srv_name, uint32 level, PRINTER_DRIV
                DEBUG(0,("msrpc_spoolss_enum_jobs: talloc_init failed!\n"));
                return False;
        }
-        prs_init(&buf , MAX_PDU_FRAG_LEN, 4, mem_ctx, MARSHALL);
-        prs_init(&rbuf, 0, 4, mem_ctx, UNMARSHALL);
+        prs_init(&buf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+        prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
        
        /* make the ADDPRINTERDRIVER PDU */
        make_spoolss_q_addprinterdriver(mem_ctx, &q_o, srv_name, level, info);
index acd53ced4c7d3a02c14c42574c92e83426621fdc..879a4f129fc50cbbee355b7c42f3e7472d862349 100644 (file)
@@ -141,8 +141,8 @@ BOOL cli_spoolss_reply_open_printer(struct cli_state *cli, char *printer, uint32
        SPOOL_Q_REPLYOPENPRINTER q_s;
        SPOOL_R_REPLYOPENPRINTER r_s;
 
-       prs_init(&buf , 1024, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0,    4, cli->mem_ctx, True );
+       prs_init(&buf, 1024, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL );
 
        /* create and send a MSRPC command with api SPOOLSS_REPLYOPENPRINTER */
 /*
@@ -197,8 +197,8 @@ BOOL cli_spoolss_reply_rrpcn(struct cli_state *cli, POLICY_HND *handle,
        SPOOL_Q_REPLY_RRPCN q_s;
        SPOOL_R_REPLY_RRPCN r_s;
 
-       prs_init(&buf , 1024, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0,    4, cli->mem_ctx, True );
+       prs_init(&buf, 1024, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL );
 
        /* create and send a MSRPC command with api  */
 /*
@@ -251,8 +251,8 @@ BOOL cli_spoolss_reply_close_printer(struct cli_state *cli, POLICY_HND *handle,
        SPOOL_Q_REPLYCLOSEPRINTER q_s;
        SPOOL_R_REPLYCLOSEPRINTER r_s;
 
-       prs_init(&buf , 1024, 4, cli->mem_ctx, False);
-       prs_init(&rbuf, 0,    4, cli->mem_ctx, True );
+       prs_init(&buf, 1024, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL );
 
        /* create and send a MSRPC command with api  */
 /*
index 4a3aed6d159b0953abbc66f03912ea245672bf9b..d4522714f2ef6349ba00b0579b6a9e3a56de4ce8 100644 (file)
@@ -49,8 +49,8 @@ BOOL do_srv_net_srv_conn_enum(struct cli_state *cli,
        if (server_name == NULL || ctr == NULL || preferred_len == 0)
                return False;
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4,  cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4,  cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NETCONNENUM */
 
@@ -129,8 +129,8 @@ BOOL do_srv_net_srv_sess_enum(struct cli_state *cli,
        if (server_name == NULL || ctr == NULL || preferred_len == 0)
                return False;
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4,  cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4,  cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NETSESSENUM */
 
@@ -206,8 +206,8 @@ BOOL do_srv_net_srv_share_enum(struct cli_state *cli,
        if (server_name == NULL || preferred_len == 0)
                return False;
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4,  cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4,  cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NETSHAREENUM */
 
@@ -277,8 +277,8 @@ BOOL do_srv_net_srv_file_enum(struct cli_state *cli,
        if (server_name == NULL || ctr == NULL || preferred_len == 0)
                return False;
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4,  cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4,  cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NETFILEENUM */
 
@@ -355,8 +355,8 @@ BOOL do_srv_net_srv_get_info(struct cli_state *cli,
        if (server_name == NULL || switch_value == 0 || ctr == NULL)
                return False;
 
-       prs_init(&data , MAX_PDU_FRAG_LEN, 4,  cli->mem_ctx, MARSHALL);
-       prs_init(&rdata, 0, 4,  cli->mem_ctx, UNMARSHALL);
+       prs_init(&data, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rdata, 0, cli->mem_ctx, UNMARSHALL);
 
        /* create and send a MSRPC command with api SRV_NET_SRV_GET_INFO */
 
index 16968b39e44076691385e2debe3a5dbe88bcfc10..5d4ad807071b5f8606cd539e886409b52e82442c 100644 (file)
@@ -47,8 +47,8 @@ BOOL do_wks_query_info(struct cli_state *cli,
        if (server_name == 0 || wks100 == NULL)
                return False;
 
-       prs_init(&buf , MAX_PDU_FRAG_LEN, 4, cli->mem_ctx, MARSHALL);
-       prs_init(&rbuf, 0, 4, cli->mem_ctx, UNMARSHALL );
+       prs_init(&buf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL );
 
        /* create and send a MSRPC command with api WKS_QUERY_INFO */
 
index a7a25caaea2c1896ab5db6718760dce32713c1c4..bee30de8541c72a780dbfc74deb4054c421112e6 100644 (file)
@@ -43,7 +43,7 @@ void init_buffer(NEW_BUFFER *buffer, uint32 size, TALLOC_CTX *ctx)
        buffer->ptr = (size!=0)? 1:0;
        buffer->size=size;
        buffer->string_at_end=size;
-       prs_init(&buffer->prs, size, 4, ctx, MARSHALL);
+       prs_init(&buffer->prs, size, ctx, MARSHALL);
        buffer->struct_start = prs_offset(&buffer->prs);
 }
 
index 05b33d4da7413d5dee052e8846754d27fa696f9a..7bdbe658800a34f73dfddc2536b1cb67c006bb26 100644 (file)
@@ -597,7 +597,7 @@ BOOL create_ntuser_creds( prs_struct *ps,
                usr.ptr_ntc = 0;
        }
                
-       prs_init(ps, 1024, 4, NULL, False);
+       prs_init(ps, 1024, NULL, MARSHALL);
 
        ps->data_offset = 4;
        return creds_io_cmd("creds", &cmd, ps, 0);
@@ -623,7 +623,7 @@ BOOL create_user_creds( prs_struct *ps,
        cmd.ptr_creds = usr != NULL ? 1 : 0;
        cmd.cred = usr;
 
-       prs_init(ps, 1024, 4, NULL, False);
+       prs_init(ps, 1024, NULL, MARSHALL);
 
        ps->data_offset = 4;
        return creds_io_cmd("creds", &cmd, ps, 0);
index 1ec3f72d4c974a73de724f8db3722597b54b4065..84ccbd5db62f1a08ace07d7d61ac549a86692c1f 100644 (file)
@@ -67,12 +67,12 @@ void prs_debug(prs_struct *ps, int depth, char *desc, char *fn_name)
 /*******************************************************************
  Initialise a parse structure - malloc the data if requested.
  ********************************************************************/
-BOOL prs_init(prs_struct *ps, uint32 size, uint8 align, TALLOC_CTX *ctx, BOOL io)
+BOOL prs_init(prs_struct *ps, uint32 size, TALLOC_CTX *ctx, BOOL io)
 {
        ZERO_STRUCTP(ps);
        ps->io = io;
-       ps->bigendian_data = False;
-       ps->align = align;
+       ps->bigendian_data = RPC_LITTLE_ENDIAN;
+       ps->align = RPC_PARSE_ALIGN;
        ps->is_dynamic = False;
        ps->data_offset = 0;
        ps->buffer_size = 0;
@@ -387,12 +387,12 @@ BOOL prs_append_data(prs_struct *dst, char *src, uint32 len)
 }
 
 /*******************************************************************
- Set the data as big-endian (external interface).
+ Set the data as X-endian (external interface).
  ********************************************************************/
 
-void prs_set_bigendian_data(prs_struct *ps)
+void prs_set_endian_data(prs_struct *ps, BOOL endian)
 {
-       ps->bigendian_data = True;
+       ps->bigendian_data = endian;
 }
 
 /*******************************************************************
@@ -1010,7 +1010,7 @@ int tdb_prs_fetch(TDB_CONTEXT *tdb, char *keystr, prs_struct *ps, TALLOC_CTX *me
     if (!dbuf.dptr) return -1;
 
     ZERO_STRUCTP(ps);
-    prs_init(ps, 0, 4, mem_ctx, UNMARSHALL);
+    prs_init(ps, 0, mem_ctx, UNMARSHALL);
     prs_give_memory(ps, dbuf.dptr, dbuf.dsize, True);
 
     return 0;
index c40de1044574d2f98732588e2937dbba8063791b..9fe893d4be2ad92a84af42b8317c86e6ff6b75fc 100644 (file)
@@ -203,7 +203,7 @@ BOOL smb_io_rpc_hdr(char *desc,  RPC_HDR *rpc, prs_struct *ps, int depth)
 
        if (ps->io && rpc->pack_type[0] == 0) {
                DEBUG(10,("smb_io_rpc_hdr: PDU data format is big-endian. Setting flag.\n"));
-               prs_set_bigendian_data(ps);
+               prs_set_endian_data(ps, RPC_BIG_ENDIAN);
        }
 
        if(!prs_uint16("frag_len  ", ps, depth, &rpc->frag_len))
@@ -239,7 +239,7 @@ static BOOL smb_io_rpc_iface(char *desc, RPC_IFACE *ifc, prs_struct *ps, int dep
 
        if(!prs_uint8s (False, "data   ", ps, depth, ifc->uuid.remaining, sizeof(ifc->uuid.remaining)))
                return False;
-       if(!prs_uint32 (       "version", ps, depth, &(ifc->version)))
+       if(!prs_uint32 (       "version", ps, depth, &ifc->version))
                return False;
 
        return True;
index 3774a911003a661f03486532d126a85feb519ed6..0073f22cab76881a24bb5ad294d57abd4b4ab516 100644 (file)
@@ -2515,7 +2515,12 @@ static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUF
                buffer->string_at_end=0;
                
                if (buffer->ptr==0) {
-                       if (!prs_init(&buffer->prs, 0, 4, prs_get_mem_context(ps), UNMARSHALL))
+                       /*
+                        * JRA. I'm not sure if the data in here is in big-endian format if
+                        * the client is big-endian. Leave as default (little endian) for now.
+                        */
+
+                       if (!prs_init(&buffer->prs, 0, prs_get_mem_context(ps), UNMARSHALL))
                                return False;
                        return True;
                }
@@ -2523,7 +2528,12 @@ static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUF
                if (!prs_uint32("size", ps, depth, &buffer->size))
                        return False;
                                        
-               if (!prs_init(&buffer->prs, buffer->size, 4, prs_get_mem_context(ps), UNMARSHALL))
+               /*
+                * JRA. I'm not sure if the data in here is in big-endian format if
+                * the client is big-endian. Leave as default (little endian) for now.
+                */
+
+               if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
                        return False;
 
                if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
index c0174280ab2dbf8efedc50747df0862563fea57d..dcefeed8b9711a8c527a4e59e200bb402b94783b 100644 (file)
@@ -167,7 +167,7 @@ BOOL create_next_pdu(pipes_struct *p)
         * data.
         */
 
-       prs_init( &outgoing_pdu, 0, 4, p->mem_ctx, MARSHALL);
+       prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
        prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
 
        /* Store the header in the data stream. */
@@ -586,7 +586,7 @@ static BOOL setup_bind_nak(pipes_struct *p)
         * header and are never sending more than one PDU here.
         */
 
-       prs_init( &outgoing_rpc, 0, 4, p->mem_ctx, MARSHALL);
+       prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
        prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
 
 
@@ -645,7 +645,7 @@ BOOL setup_fault_pdu(pipes_struct *p)
         * header and are never sending more than one PDU here.
         */
 
-       prs_init( &outgoing_pdu, 0, 4, p->mem_ctx, MARSHALL);
+       prs_init( &outgoing_pdu, 0, p->mem_ctx, MARSHALL);
        prs_give_memory( &outgoing_pdu, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
 
        /*
@@ -862,7 +862,7 @@ BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p)
         * header and are never sending more than one PDU here.
         */
 
-       prs_init( &outgoing_rpc, 0, 4, p->mem_ctx, MARSHALL);
+       prs_init( &outgoing_rpc, 0, p->mem_ctx, MARSHALL);
        prs_give_memory( &outgoing_rpc, (char *)p->out_data.current_pdu, sizeof(p->out_data.current_pdu), False);
 
        /*
@@ -870,13 +870,13 @@ BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *rpc_in_p)
         * auth footers.
         */
 
-       if(!prs_init(&out_hdr_ba, 1024, 4, p->mem_ctx, MARSHALL)) {
+       if(!prs_init(&out_hdr_ba, 1024, p->mem_ctx, MARSHALL)) {
                DEBUG(0,("api_pipe_bind_req: malloc out_hdr_ba failed.\n"));
                prs_mem_free(&outgoing_rpc);
                return False;
        }
 
-       if(!prs_init(&out_auth, 1024, 4, p->mem_ctx, MARSHALL)) {
+       if(!prs_init(&out_auth, 1024, p->mem_ctx, MARSHALL)) {
                DEBUG(0,("pi_pipe_bind_req: malloc out_auth failed.\n"));
                prs_mem_free(&outgoing_rpc);
                prs_mem_free(&out_hdr_ba);
index eb369f22b44313d0d0c135dad53ab8434b4a2aa2..554507191361837658c3eb1fba89242fc874803c 100644 (file)
@@ -96,7 +96,7 @@ static BOOL pipe_init_outgoing_data(pipes_struct *p)
         * Initialize the outgoing RPC data buffer.
         * we will use this as the raw data area for replying to rpc requests.
         */     
-       if(!prs_init(&o_data->rdata, MAX_PDU_FRAG_LEN, 4, p->mem_ctx, MARSHALL)) {
+       if(!prs_init(&o_data->rdata, MAX_PDU_FRAG_LEN, p->mem_ctx, MARSHALL)) {
                DEBUG(0,("pipe_init_outgoing_data: malloc fail.\n"));
                return False;
        }
@@ -159,7 +159,7 @@ pipes_struct *open_rpc_pipe_p(char *pipe_name,
         * change the type to UNMARSALLING before processing the stream.
         */
 
-       if(!prs_init(&p->in_data.data, MAX_PDU_FRAG_LEN, 4, p->mem_ctx, MARSHALL)) {
+       if(!prs_init(&p->in_data.data, MAX_PDU_FRAG_LEN, p->mem_ctx, MARSHALL)) {
                DEBUG(0,("open_rpc_pipe_p: malloc fail for in_data struct.\n"));
                return NULL;
        }
@@ -185,6 +185,7 @@ pipes_struct *open_rpc_pipe_p(char *pipe_name,
 
        p->pipe_bound = False;
        p->fault_state = False;
+       p->endian = RPC_LITTLE_ENDIAN;
 
        /*
         * Initialize the incoming RPC struct.
@@ -204,7 +205,7 @@ pipes_struct *open_rpc_pipe_p(char *pipe_name,
        /*
         * Initialize the outgoing RPC data buffer with no memory.
         */     
-       prs_init(&p->out_data.rdata, 0, 4, p->mem_ctx, MARSHALL);
+       prs_init(&p->out_data.rdata, 0, p->mem_ctx, MARSHALL);
        
        ZERO_STRUCT(p->pipe_user);
 
@@ -275,13 +276,16 @@ static ssize_t unmarshall_rpc_header(pipes_struct *p)
                return -1;
        }
 
-       prs_init( &rpc_in, 0, 4, p->mem_ctx, UNMARSHALL);
+       prs_init( &rpc_in, 0, p->mem_ctx, UNMARSHALL);
+       prs_set_endian_data( &rpc_in, p->endian);
+
        prs_give_memory( &rpc_in, (char *)&p->in_data.current_in_pdu[0],
                                        p->in_data.pdu_received_len, False);
 
        /*
         * Unmarshall the header as this will tell us how much
         * data we need to read to get the complete pdu.
+        * This also sets the endian flag in rpc_in.
         */
 
        if(!smb_io_rpc_hdr("", &p->hdr, &rpc_in, 0)) {
@@ -303,16 +307,45 @@ static ssize_t unmarshall_rpc_header(pipes_struct *p)
        }
 
        /*
-        * If there is no data in the incoming buffer and it's a requst pdu then
-        * ensure that the FIRST flag is set. If not then we have
-        * a stream missmatch.
+        * If there's not data in the incoming buffer and it's a
+        * request PDU this should be the start of a new RPC.
         */
 
-       if((p->hdr.pkt_type == RPC_REQUEST) && (prs_offset(&p->in_data.data) == 0) && !(p->hdr.flags & RPC_FLG_FIRST)) {
-               DEBUG(0,("unmarshall_rpc_header: FIRST flag not set in first PDU !\n"));
-               set_incoming_fault(p);
-               prs_mem_free(&rpc_in);
-               return -1;
+       if((p->hdr.pkt_type == RPC_REQUEST) && (prs_offset(&p->in_data.data) == 0)) {
+
+               if (!(p->hdr.flags & RPC_FLG_FIRST)) {
+                       /*
+                        * Ensure that the FIRST flag is set. If not then we have
+                        * a stream missmatch.
+                        */
+
+                       DEBUG(0,("unmarshall_rpc_header: FIRST flag not set in first PDU !\n"));
+                       set_incoming_fault(p);
+                       prs_mem_free(&rpc_in);
+                       return -1;
+               }
+
+               /*
+                * If this is the first PDU then set the endianness
+                * flag in the pipe. We will need this when parsing all
+                * data in this RPC.
+                */
+
+               p->endian = rpc_in.bigendian_data;
+
+       } else {
+
+               /*
+                * If this is *NOT* the first PDU then check the endianness
+                * flag in the pipe is the same as that in the PDU.
+                */
+
+               if (p->endian != rpc_in.bigendian_data) {
+                       DEBUG(0,("unmarshall_rpc_header: FIRST endianness flag different in next PDU !\n"));
+                       set_incoming_fault(p);
+                       prs_mem_free(&rpc_in);
+                       return -1;
+               }
        }
 
        /*
@@ -493,7 +526,10 @@ static ssize_t process_complete_pdu(pipes_struct *p)
                return (ssize_t)data_len;
        }
 
-       prs_init( &rpc_in, 0, 4, p->mem_ctx, UNMARSHALL);
+       prs_init( &rpc_in, 0, p->mem_ctx, UNMARSHALL);
+       /* Ensure we're using the corrent endianness. */
+       prs_set_endian_data( &rpc_in, p->endian);
+
        prs_give_memory( &rpc_in, data_p, (uint32)data_len, False);
 
        DEBUG(10,("process_complete_pdu: processing packet type %u\n",
index c326dd561f5606573fec0ec40fd9e59a5bd3b449..d9a93f8d78013b23fb040726d9078de2112ec07b 100644 (file)
@@ -1085,7 +1085,7 @@ static BOOL set_sd(files_struct *fsp, char *data, uint32 sd_len, uint security_i
                return False;
        }
 
-       prs_init(&pd, 0, 4, mem_ctx, UNMARSHALL);
+       prs_init(&pd, 0, mem_ctx, UNMARSHALL);
 
        /*
         * Setup the prs_struct to point at the memory we just
@@ -1662,7 +1662,7 @@ static int call_nt_transact_query_security_desc(connection_struct *conn,
     return(ERROR(ERRDOS,ERRnomem));
   }
 
-  prs_init(&pd, 0, 4, mem_ctx, MARSHALL);
+  prs_init(&pd, 0, mem_ctx, MARSHALL);
 
   /*
    * Setup the prs_struct to point at the memory we just