rpc_parse/parse_buffer.c

ソースコードを見る。

関数

void rpcbuf_init (RPC_BUFFER *buffer, uint32 size, TALLOC_CTX *ctx)
BOOL prs_rpcbuffer (const char *desc, prs_struct *ps, int depth, RPC_BUFFER *buffer)
BOOL prs_rpcbuffer_p (const char *desc, prs_struct *ps, int depth, RPC_BUFFER **buffer)
BOOL rpcbuf_alloc_size (RPC_BUFFER *buffer, uint32 buffer_size)
void rpcbuf_move (RPC_BUFFER *src, RPC_BUFFER **dest)
uint32 rpcbuf_get_size (RPC_BUFFER *buffer)
BOOL smb_io_relstr (const char *desc, RPC_BUFFER *buffer, int depth, UNISTR *string)
BOOL smb_io_relarraystr (const char *desc, RPC_BUFFER *buffer, int depth, uint16 **string)
BOOL smb_io_relsecdesc (const char *desc, RPC_BUFFER *buffer, int depth, SEC_DESC **secdesc)
uint32 size_of_relative_string (UNISTR *string)


関数

void rpcbuf_init ( RPC_BUFFER buffer,
uint32  size,
TALLOC_CTX ctx 
)

parse_buffer.c34 行で定義されています。

参照先 RPC_BUFFER::prsprs_init()RPC_BUFFER::sizeRPC_BUFFER::string_at_endRPC_BUFFER::struct_start.

参照元 _spoolss_xcvdataport()_svcctl_enum_dependent_services()_svcctl_query_service_config2()_svcctl_query_service_sec()_svcctl_query_service_status_ex()rpccli_spoolss_enum_ports()rpccli_spoolss_enum_printers()rpccli_spoolss_enumforms()rpccli_spoolss_enumjobs()rpccli_spoolss_enumprinterdrivers()rpccli_spoolss_getform()rpccli_spoolss_getjob()rpccli_spoolss_getprinter()rpccli_spoolss_getprinterdriver()rpccli_spoolss_getprinterdriverdir()rpccli_spoolss_getprintprocessordirectory().

00035 {
00036         buffer->size = size;
00037         buffer->string_at_end = size;
00038         prs_init(&buffer->prs, size, ctx, MARSHALL);
00039         buffer->struct_start = prs_offset(&buffer->prs);
00040 }

BOOL prs_rpcbuffer ( const char *  desc,
prs_struct ps,
int  depth,
RPC_BUFFER buffer 
)

parse_buffer.c46 行で定義されています。

参照先 RPC_BUFFER::prsprs_debug()prs_init()prs_mem_free()RPC_BUFFER::sizeRPC_BUFFER::string_at_end.

参照元 prs_rpcbuffer_p()spoolss_io_q_xcvdataport()spoolss_io_r_xcvdataport()svcctl_io_q_set_service_sec()svcctl_io_r_enum_dependent_services()svcctl_io_r_enum_services_status()svcctl_io_r_query_service_config2()svcctl_io_r_query_service_sec()svcctl_io_r_query_service_status_ex().

00047 {
00048         prs_debug(ps, depth, desc, "prs_rpcbuffer");
00049         depth++;
00050 
00051         /* reading */
00052         if (UNMARSHALLING(ps)) {
00053                 buffer->size=0;
00054                 buffer->string_at_end=0;
00055                 
00056                 if (!prs_uint32("size", ps, depth, &buffer->size))
00057                         return False;
00058                                         
00059                 /*
00060                  * JRA. I'm not sure if the data in here is in big-endian format if
00061                  * the client is big-endian. Leave as default (little endian) for now.
00062                  */
00063 
00064                 if (!prs_init(&buffer->prs, buffer->size, prs_get_mem_context(ps), UNMARSHALL))
00065                         return False;
00066 
00067                 if (!prs_append_some_prs_data(&buffer->prs, ps, prs_offset(ps), buffer->size))
00068                         return False;
00069 
00070                 if (!prs_set_offset(&buffer->prs, 0))
00071                         return False;
00072 
00073                 if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
00074                         return False;
00075 
00076                 buffer->string_at_end=buffer->size;
00077                 
00078                 return True;
00079         }
00080         else {
00081                 BOOL ret = False;
00082 
00083                 if (!prs_uint32("size", ps, depth, &buffer->size))
00084                         goto out;
00085 
00086                 if (!prs_append_some_prs_data(ps, &buffer->prs, 0, buffer->size))
00087                         goto out;
00088 
00089                 ret = True;
00090         out:
00091 
00092                 /* We have finished with the data in buffer->prs - free it. */
00093                 prs_mem_free(&buffer->prs);
00094 
00095                 return ret;
00096         }
00097 }

BOOL prs_rpcbuffer_p ( const char *  desc,
prs_struct ps,
int  depth,
RPC_BUFFER **  buffer 
)

parse_buffer.c103 行で定義されています。

参照先 prs_rpcbuffer().

参照元 spoolss_io_q_addjob()spoolss_io_q_enumforms()spoolss_io_q_enumjobs()spoolss_io_q_enumports()spoolss_io_q_enumprinterdrivers()spoolss_io_q_enumprinters()spoolss_io_q_enumprintmonitors()spoolss_io_q_enumprintprocdatatypes()spoolss_io_q_enumprintprocessors()spoolss_io_q_getform()spoolss_io_q_getjob()spoolss_io_q_getprinter()spoolss_io_q_getprinterdriver2()spoolss_io_q_getprinterdriverdir()spoolss_io_q_getprintprocessordirectory()spoolss_io_r_addjob()spoolss_io_r_enumforms()spoolss_io_r_enumjobs()spoolss_io_r_enumports()spoolss_io_r_enumprinterdrivers()spoolss_io_r_enumprinters()spoolss_io_r_enumprintmonitors()spoolss_io_r_enumprintprocdatatypes()spoolss_io_r_enumprintprocessors()spoolss_io_r_getform()spoolss_io_r_getjob()spoolss_io_r_getprinter()spoolss_io_r_getprinterdriver2()spoolss_io_r_getprinterdriverdir()spoolss_io_r_getprintprocessordirectory().

00104 {
00105         uint32 data_p;
00106 
00107         /* caputure the pointer value to stream */
00108 
00109         data_p = *buffer ? 0xf000baaa : 0;
00110 
00111         if ( !prs_uint32("ptr", ps, depth, &data_p ))
00112                 return False;
00113 
00114         /* we're done if there is no data */
00115 
00116         if ( !data_p )
00117                 return True;
00118 
00119         if ( UNMARSHALLING(ps) ) {
00120                 if ( !(*buffer = PRS_ALLOC_MEM(ps, RPC_BUFFER, 1)) )
00121                         return False;
00122         } else {
00123                 /* Marshalling case. - coverity paranoia - should already be ok if data_p != 0 */
00124                 if (!*buffer) {
00125                         return True;
00126                 }
00127         }
00128 
00129         return prs_rpcbuffer( desc, ps, depth, *buffer);
00130 }

BOOL rpcbuf_alloc_size ( RPC_BUFFER buffer,
uint32  buffer_size 
)

parse_buffer.c136 行で定義されています。

参照先 RPC_BUFFER::prsRPC_BUFFER::string_at_end.

参照元 _spoolss_enumforms()_spoolss_getform()enum_all_printers_info_1()enum_all_printers_info_1_remote()enum_all_printers_info_2()enumjobs_level1()enumjobs_level2()enumports_level_1()enumports_level_2()enumprinterdrivers_level1()enumprinterdrivers_level2()enumprinterdrivers_level3()enumprintmonitors_level_1()enumprintmonitors_level_2()enumprintprocdatatypes_level_1()enumprintprocessors_level_1()getjob_level_1()getjob_level_2()getprinter_level_0()getprinter_level_1()getprinter_level_2()getprinter_level_3()getprinter_level_4()getprinter_level_5()getprinter_level_7()getprinterdriver2_level1()getprinterdriver2_level2()getprinterdriver2_level3()getprinterdriver2_level6()getprinterdriverdir_level_1()getprintprocessordirectory_level_1().

00137 {
00138         prs_struct *ps;
00139         uint32 extra_space;
00140         uint32 old_offset;
00141         
00142         /* if we don't need anything. don't do anything */
00143         
00144         if ( buffer_size == 0x0 )
00145                 return True;
00146 
00147         if (!buffer) {
00148                 return False;
00149         }
00150 
00151         ps= &buffer->prs;
00152 
00153         /* damn, I'm doing the reverse operation of prs_grow() :) */
00154         if (buffer_size < prs_data_size(ps))
00155                 extra_space=0;
00156         else    
00157                 extra_space = buffer_size - prs_data_size(ps);
00158 
00159         /*
00160          * save the offset and move to the end of the buffer
00161          * prs_grow() checks the extra_space against the offset
00162          */
00163         old_offset=prs_offset(ps);      
00164         prs_set_offset(ps, prs_data_size(ps));
00165         
00166         if (!prs_grow(ps, extra_space))
00167                 return False;
00168 
00169         prs_set_offset(ps, old_offset);
00170 
00171         buffer->string_at_end=prs_data_size(ps);
00172 
00173         return True;
00174 }

void rpcbuf_move ( RPC_BUFFER src,
RPC_BUFFER **  dest 
)

parse_buffer.c183 行で定義されています。

参照先 RPC_BUFFER::prsprs_mem_clear().

参照元 _spoolss_addjob()_spoolss_enumforms()_spoolss_enumjobs()_spoolss_enumports()_spoolss_enumprinterdrivers()_spoolss_enumprinters()_spoolss_enumprintmonitors()_spoolss_enumprintprocdatatypes()_spoolss_enumprintprocessors()_spoolss_getform()_spoolss_getjob()_spoolss_getprinter()_spoolss_getprinterdriver2()_spoolss_getprinterdriverdirectory()_spoolss_getprintprocessordirectory().

00184 {
00185         if ( !src ) {
00186                 *dest = NULL;
00187                 return;
00188         }
00189 
00190         prs_switch_type( &src->prs, MARSHALL );
00191 
00192         if ( !prs_set_offset(&src->prs, 0) )
00193                 return;
00194 
00195         prs_force_dynamic( &src->prs );
00196         prs_mem_clear( &src->prs );
00197 
00198         *dest = src;
00199 }

uint32 rpcbuf_get_size ( RPC_BUFFER buffer  ) 

parse_buffer.c205 行で定義されています。

参照先 RPC_BUFFER::size.

参照元 xcvlocal_monitorui()xcvtcp_monitorui().

00206 {
00207         return (buffer->size);
00208 }

BOOL smb_io_relstr ( const char *  desc,
RPC_BUFFER buffer,
int  depth,
UNISTR string 
)

parse_buffer.c231 行で定義されています。

参照先 RPC_BUFFER::prssize_of_relative_string()smb_io_unistr()stringRPC_BUFFER::string_at_endRPC_BUFFER::struct_start.

参照元 smb_io_form_1()smb_io_job_info_1()smb_io_job_info_2()smb_io_port_1()smb_io_port_2()smb_io_port_info_1()smb_io_port_info_2()smb_io_printer_driver_info_1()smb_io_printer_driver_info_2()smb_io_printer_driver_info_3()smb_io_printer_driver_info_6()smb_io_printer_info_0()smb_io_printer_info_1()smb_io_printer_info_2()smb_io_printer_info_4()smb_io_printer_info_5()smb_io_printer_info_7()smb_io_printmonitor_info_1()smb_io_printmonitor_info_2()smb_io_printprocdatatype_info_1()smb_io_printprocessor_info_1()svcctl_io_enum_services_status().

00232 {
00233         prs_struct *ps=&buffer->prs;
00234         
00235         if (MARSHALLING(ps)) {
00236                 uint32 struct_offset = prs_offset(ps);
00237                 uint32 relative_offset;
00238                 
00239                 buffer->string_at_end -= (size_of_relative_string(string) - 4);
00240                 if(!prs_set_offset(ps, buffer->string_at_end))
00241                         return False;
00242 #if 0   /* JERRY */
00243                 /*
00244                  * Win2k does not align strings in a buffer
00245                  * Tested against WinNT 4.0 SP 6a & 2k SP2  --jerry
00246                  */
00247                 if (!prs_align(ps))
00248                         return False;
00249 #endif
00250                 buffer->string_at_end = prs_offset(ps);
00251                 
00252                 /* write the string */
00253                 if (!smb_io_unistr(desc, string, ps, depth))
00254                         return False;
00255 
00256                 if(!prs_set_offset(ps, struct_offset))
00257                         return False;
00258                 
00259                 relative_offset=buffer->string_at_end - buffer->struct_start;
00260                 /* write its offset */
00261                 if (!prs_uint32("offset", ps, depth, &relative_offset))
00262                         return False;
00263         }
00264         else {
00265                 uint32 old_offset;
00266                 
00267                 /* read the offset */
00268                 if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
00269                         return False;
00270 
00271                 if (buffer->string_at_end == 0)
00272                         return True;
00273 
00274                 old_offset = prs_offset(ps);
00275                 if(!prs_set_offset(ps, buffer->string_at_end+buffer->struct_start))
00276                         return False;
00277 
00278                 /* read the string */
00279                 if (!smb_io_unistr(desc, string, ps, depth))
00280                         return False;
00281 
00282                 if(!prs_set_offset(ps, old_offset))
00283                         return False;
00284         }
00285         return True;
00286 }

BOOL smb_io_relarraystr ( const char *  desc,
RPC_BUFFER buffer,
int  depth,
uint16 **  string 
)

parse_buffer.c293 行で定義されています。

参照先 UNISTR::bufferRPC_BUFFER::prssmb_io_unistr()str_len_uni()RPC_BUFFER::string_at_endRPC_BUFFER::struct_start.

参照元 smb_io_printer_driver_info_3()smb_io_printer_driver_info_6().

00294 {
00295         UNISTR chaine;
00296         
00297         prs_struct *ps=&buffer->prs;
00298         
00299         if (MARSHALLING(ps)) {
00300                 uint32 struct_offset = prs_offset(ps);
00301                 uint32 relative_offset;
00302                 uint16 *p;
00303                 uint16 *q;
00304                 uint16 zero=0;
00305                 p=*string;
00306                 q=*string;
00307 
00308                 /* first write the last 0 */
00309                 buffer->string_at_end -= 2;
00310                 if(!prs_set_offset(ps, buffer->string_at_end))
00311                         return False;
00312 
00313                 if(!prs_uint16("leading zero", ps, depth, &zero))
00314                         return False;
00315 
00316                 while (p && (*p!=0)) {  
00317                         while (*q!=0)
00318                                 q++;
00319 
00320                         /* Yes this should be malloc not talloc. Don't change. */
00321 
00322                         chaine.buffer = (uint16 *)
00323                                 SMB_MALLOC((q-p+1)*sizeof(uint16));
00324                         if (chaine.buffer == NULL)
00325                                 return False;
00326 
00327                         memcpy(chaine.buffer, p, (q-p+1)*sizeof(uint16));
00328 
00329                         buffer->string_at_end -= (q-p+1)*sizeof(uint16);
00330 
00331                         if(!prs_set_offset(ps, buffer->string_at_end)) {
00332                                 SAFE_FREE(chaine.buffer);
00333                                 return False;
00334                         }
00335 
00336                         /* write the string */
00337                         if (!smb_io_unistr(desc, &chaine, ps, depth)) {
00338                                 SAFE_FREE(chaine.buffer);
00339                                 return False;
00340                         }
00341                         q++;
00342                         p=q;
00343 
00344                         SAFE_FREE(chaine.buffer);
00345                 }
00346                 
00347                 if(!prs_set_offset(ps, struct_offset))
00348                         return False;
00349                 
00350                 relative_offset=buffer->string_at_end - buffer->struct_start;
00351                 /* write its offset */
00352                 if (!prs_uint32("offset", ps, depth, &relative_offset))
00353                         return False;
00354 
00355         } else {
00356 
00357                 /* UNMARSHALLING */
00358 
00359                 uint32 old_offset;
00360                 uint16 *chaine2=NULL;
00361                 int l_chaine=0;
00362                 int l_chaine2=0;
00363                 size_t realloc_size = 0;
00364 
00365                 *string=NULL;
00366                                 
00367                 /* read the offset */
00368                 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
00369                         return False;
00370 
00371                 old_offset = prs_offset(ps);
00372                 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
00373                         return False;
00374         
00375                 do {
00376                         if (!smb_io_unistr(desc, &chaine, ps, depth))
00377                                 return False;
00378                         
00379                         l_chaine=str_len_uni(&chaine);
00380                         
00381                         /* we're going to add two more bytes here in case this
00382                            is the last string in the array and we need to add 
00383                            an extra NULL for termination */
00384                         if (l_chaine > 0) {
00385                                 realloc_size = (l_chaine2+l_chaine+2)*sizeof(uint16);
00386 
00387                                 /* Yes this should be realloc - it's freed below. JRA */
00388 
00389                                 if((chaine2=(uint16 *)SMB_REALLOC(chaine2, realloc_size)) == NULL) {
00390                                         return False;
00391                                 }
00392                                 memcpy(chaine2+l_chaine2, chaine.buffer, (l_chaine+1)*sizeof(uint16));
00393                                 l_chaine2+=l_chaine+1;
00394                         }
00395                 
00396                 } while(l_chaine!=0);
00397                 
00398                 /* the end should be bould NULL terminated so add 
00399                    the second one here */
00400                 if (chaine2)
00401                 {
00402                         chaine2[l_chaine2] = '\0';
00403                         *string=(uint16 *)TALLOC_MEMDUP(prs_get_mem_context(ps),chaine2,realloc_size);
00404                         if (!*string) {
00405                                 return False;
00406                         }
00407                         SAFE_FREE(chaine2);
00408                 }
00409 
00410                 if(!prs_set_offset(ps, old_offset))
00411                         return False;
00412         }
00413         return True;
00414 }

BOOL smb_io_relsecdesc ( const char *  desc,
RPC_BUFFER buffer,
int  depth,
SEC_DESC **  secdesc 
)

parse_buffer.c420 行で定義されています。

参照先 RPC_BUFFER::prsprs_debug()sec_desc_size()sec_io_desc()RPC_BUFFER::string_at_endRPC_BUFFER::struct_start.

参照元 smb_io_printer_info_2().

00421 {
00422         prs_struct *ps= &buffer->prs;
00423 
00424         prs_debug(ps, depth, desc, "smb_io_relsecdesc");
00425         depth++;
00426 
00427         if (MARSHALLING(ps)) {
00428                 uint32 struct_offset = prs_offset(ps);
00429                 uint32 relative_offset;
00430 
00431                 if (! *secdesc) {
00432                         relative_offset = 0;
00433                         if (!prs_uint32("offset", ps, depth, &relative_offset))
00434                                 return False;
00435                         return True;
00436                 }
00437                 
00438                 if (*secdesc != NULL) {
00439                         buffer->string_at_end -= sec_desc_size(*secdesc);
00440 
00441                         if(!prs_set_offset(ps, buffer->string_at_end))
00442                                 return False;
00443                         /* write the secdesc */
00444                         if (!sec_io_desc(desc, secdesc, ps, depth))
00445                                 return False;
00446 
00447                         if(!prs_set_offset(ps, struct_offset))
00448                                 return False;
00449                 }
00450 
00451                 relative_offset=buffer->string_at_end - buffer->struct_start;
00452                 /* write its offset */
00453 
00454                 if (!prs_uint32("offset", ps, depth, &relative_offset))
00455                         return False;
00456         } else {
00457                 uint32 old_offset;
00458                 
00459                 /* read the offset */
00460                 if (!prs_uint32("offset", ps, depth, &buffer->string_at_end))
00461                         return False;
00462 
00463                 old_offset = prs_offset(ps);
00464                 if(!prs_set_offset(ps, buffer->string_at_end + buffer->struct_start))
00465                         return False;
00466 
00467                 /* read the sd */
00468                 if (!sec_io_desc(desc, secdesc, ps, depth))
00469                         return False;
00470 
00471                 if(!prs_set_offset(ps, old_offset))
00472                         return False;
00473         }
00474         return True;
00475 }

uint32 size_of_relative_string ( UNISTR string  ) 

parse_buffer.c485 行で定義されています。

参照先 sizestr_len_uni()string.

参照元 smb_io_relstr()spoolss_size_form_1()spoolss_size_job_info_1()spoolss_size_job_info_2()spoolss_size_port_info_1()spoolss_size_port_info_2()spoolss_size_printer_driver_info_1()spoolss_size_printer_driver_info_2()spoolss_size_printer_driver_info_3()spoolss_size_printer_driver_info_6()spoolss_size_printer_info_0()spoolss_size_printer_info_1()spoolss_size_printer_info_2()spoolss_size_printer_info_4()spoolss_size_printer_info_5()spoolss_size_printer_info_7()spoolss_size_printmonitor_info_1()spoolss_size_printmonitor_info_2()spoolss_size_printprocdatatype_info_1()spoolss_size_printprocessor_info_1()svcctl_sizeof_enum_services_status().

00486 {
00487         uint32 size=0;
00488         
00489         size=str_len_uni(string);       /* the string length       */
00490         size=size+1;                    /* add the trailing zero   */
00491         size=size*2;                    /* convert in char         */
00492         size=size+4;                    /* add the size of the ptr */   
00493 
00494 #if 0   /* JERRY */
00495         /* 
00496          * Do not include alignment as Win2k does not align relative
00497          * strings within a buffer   --jerry 
00498          */
00499         /* Ensure size is 4 byte multiple (prs_align is being called...). */
00500         /* size += ((4 - (size & 3)) & 3); */
00501 #endif 
00502 
00503         return size;
00504 }


Sambaに対してSat Aug 29 21:24:07 2009に生成されました。  doxygen 1.4.7