mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-02 00:46:03 +00:00
a9950e3cee
The failures in rpcrt4:server on Windows are caused by an access violation thrown in NdrVaryingArrayUnmarshall() called from get_5numbers(). I've created a minimum get_5numbers() test with Microsoft tools and that throws the same access violation. The access violation disappears when zeroing out the StubMsg before calling NdrClientInitializeNew(), so my guess is Windows NdrVaryingArrayUnmarshall() uses an uninitialized member.
344 lines
6.9 KiB
Text
344 lines
6.9 KiB
Text
/*
|
|
* A simple interface to test the RPC server.
|
|
*
|
|
* Copyright (C) Google 2007 (Dan Hipschman)
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#include "server_defines.h"
|
|
|
|
typedef struct tag_vector
|
|
{
|
|
int x;
|
|
int y;
|
|
int z;
|
|
} vector_t;
|
|
|
|
[
|
|
uuid(00000000-4114-0704-2301-000000000000),
|
|
#ifndef __midl
|
|
implicit_handle(handle_t IServer_IfHandle)
|
|
#endif
|
|
]
|
|
interface IServer
|
|
{
|
|
cpp_quote("#if 0")
|
|
typedef wchar_t WCHAR;
|
|
cpp_quote("#endif")
|
|
|
|
typedef [string] char *str_t;
|
|
typedef [string] WCHAR *wstr_t;
|
|
|
|
typedef struct
|
|
{
|
|
int *pi;
|
|
int **ppi;
|
|
int ***pppi;
|
|
} pints_t;
|
|
|
|
typedef struct
|
|
{
|
|
char *pc;
|
|
short *ps;
|
|
long *pl;
|
|
float *pf;
|
|
double *pd;
|
|
} ptypes_t;
|
|
|
|
typedef struct
|
|
{
|
|
vector_t *pu;
|
|
vector_t **pv;
|
|
} pvectors_t;
|
|
|
|
typedef struct
|
|
{
|
|
[switch_is(s)] union
|
|
{
|
|
[case(SUN_I)] int i;
|
|
[case(SUN_F1, SUN_F2)] float f;
|
|
[case(SUN_PI)] int *pi;
|
|
} u;
|
|
|
|
int s;
|
|
} sun_t;
|
|
|
|
int int_return(void);
|
|
int square(int x);
|
|
int sum(int x, int y);
|
|
void square_out(int x, [out] int *y);
|
|
void square_ref([in, out] int *x);
|
|
int str_length([string] const char *s);
|
|
int str_t_length(str_t s);
|
|
int cstr_length([string, size_is(n)] const char *s, int n);
|
|
int dot_self(vector_t *v);
|
|
double square_half(double x, [out] double *y);
|
|
float square_half_float(float x, [out] float *y);
|
|
long square_half_long(long x, [out] long *y);
|
|
int sum_fixed_array(int a[5]);
|
|
int pints_sum(pints_t *pints);
|
|
double ptypes_sum(ptypes_t *ptypes);
|
|
int dot_pvectors(pvectors_t *pvectors);
|
|
|
|
/* don't use this anywhere except in sp_t */
|
|
typedef struct
|
|
{
|
|
int x;
|
|
} sp_inner_t;
|
|
|
|
typedef struct
|
|
{
|
|
int x;
|
|
sp_inner_t *s;
|
|
} sp_t;
|
|
|
|
int sum_sp(sp_t *sp);
|
|
double square_sun(sun_t *su);
|
|
|
|
typedef struct test_list
|
|
{
|
|
int t;
|
|
[switch_is(t)] union
|
|
{
|
|
[case(TL_NULL)] char x; /* end of list */
|
|
[case(TL_LIST)] struct test_list *tail;
|
|
} u;
|
|
} test_list_t;
|
|
|
|
int test_list_length(test_list_t *ls);
|
|
int sum_fixed_int_3d(int m[2][3][4]);
|
|
int sum_conf_array([size_is(n)] int x[], int n);
|
|
int sum_conf_ptr_by_conf_ptr(int n1, [size_is(n1)] int *n2_then_x1, [size_is(*n2_then_x1)] int *x2);
|
|
int sum_unique_conf_array([size_is(n), unique] int x[], int n);
|
|
int sum_unique_conf_ptr([size_is(n), unique] int *x, int n);
|
|
int sum_var_array([length_is(n)] int x[20], int n);
|
|
int dot_two_vectors(vector_t vs[2]);
|
|
|
|
typedef struct
|
|
{
|
|
int n;
|
|
[size_is(n)] int ca[];
|
|
} cs_t;
|
|
|
|
typedef struct
|
|
{
|
|
int *pn;
|
|
[size_is(*pn)] int *ca1;
|
|
[size_is(n * 2)] int *ca2;
|
|
int n;
|
|
} cps_t;
|
|
|
|
typedef struct
|
|
{
|
|
[size_is(c ? a : b)] int *ca;
|
|
int a;
|
|
int b;
|
|
int c;
|
|
} cpsc_t;
|
|
|
|
int sum_cs(cs_t *cs);
|
|
int sum_cps(cps_t *cps);
|
|
int sum_cpsc(cpsc_t *cpsc);
|
|
|
|
typedef [wire_marshal(int)] void *puint_t;
|
|
int square_puint(puint_t p);
|
|
|
|
typedef struct
|
|
{
|
|
[size_is(n)] puint_t *ps;
|
|
int n;
|
|
} puints_t;
|
|
|
|
/* Same thing as puints_t, but make it complex (needs padding). */
|
|
typedef struct
|
|
{
|
|
[size_is(n)] puint_t *ps;
|
|
char n;
|
|
} cpuints_t;
|
|
|
|
int sum_puints(puints_t *p);
|
|
int sum_cpuints(cpuints_t *p);
|
|
int dot_copy_vectors(vector_t u, vector_t v);
|
|
|
|
typedef struct wire_us *wire_us_t;
|
|
typedef [wire_marshal(wire_us_t)] struct us us_t;
|
|
struct us
|
|
{
|
|
void *x;
|
|
};
|
|
struct wire_us
|
|
{
|
|
int x;
|
|
};
|
|
typedef struct
|
|
{
|
|
us_t us;
|
|
} test_us_t;
|
|
|
|
int square_test_us(test_us_t *tus);
|
|
|
|
typedef union encu switch (int t)
|
|
{
|
|
case ENCU_I: int i;
|
|
case ENCU_F: float f;
|
|
} encu_t;
|
|
|
|
typedef [switch_type(int)] union unencu
|
|
{
|
|
[case (ENCU_I)] int i;
|
|
[case (ENCU_F)] float f;
|
|
} unencu_t;
|
|
|
|
typedef enum
|
|
{
|
|
E1 = 23,
|
|
E2 = 4,
|
|
E3 = 0,
|
|
E4 = 64
|
|
} e_t;
|
|
|
|
typedef union encue switch (e_t t)
|
|
{
|
|
case E1: int i1;
|
|
case E2: float f2;
|
|
} encue_t;
|
|
|
|
typedef struct
|
|
{
|
|
e_t f;
|
|
} se_t;
|
|
|
|
double square_encu(encu_t *eu);
|
|
double square_unencu(int t, [switch_is(t)] unencu_t *eu);
|
|
int sum_parr(int *a[3]);
|
|
int sum_pcarr([size_is(n)] int *a[], int n);
|
|
int enum_ord(e_t e);
|
|
double square_encue(encue_t *eue);
|
|
void check_se2(se_t *s);
|
|
|
|
int sum_toplev_conf_2n([size_is(n * 2)] int *x, int n);
|
|
int sum_toplev_conf_cond([size_is(c ? a : b)] int *x, int a, int b, int c);
|
|
|
|
typedef struct
|
|
{
|
|
char c;
|
|
int i;
|
|
short s;
|
|
double d;
|
|
} aligns_t;
|
|
|
|
double sum_aligns(aligns_t *a);
|
|
|
|
typedef struct
|
|
{
|
|
int i;
|
|
char c;
|
|
} padded_t;
|
|
|
|
int sum_padded(padded_t *p);
|
|
int sum_padded2(padded_t ps[2]);
|
|
int sum_padded_conf([size_is(n)] padded_t *ps, int n);
|
|
|
|
typedef struct
|
|
{
|
|
int *p1;
|
|
} bogus_helper_t;
|
|
|
|
typedef struct
|
|
{
|
|
bogus_helper_t h;
|
|
int *p2;
|
|
int *p3;
|
|
char c;
|
|
} bogus_t;
|
|
|
|
int sum_bogus(bogus_t *b);
|
|
void check_null([unique] int *null);
|
|
|
|
typedef struct
|
|
{
|
|
str_t s;
|
|
} str_struct_t;
|
|
|
|
typedef struct
|
|
{
|
|
wstr_t s;
|
|
} wstr_struct_t;
|
|
|
|
int str_struct_len(str_struct_t *s);
|
|
int wstr_struct_len(wstr_struct_t *s);
|
|
|
|
typedef struct
|
|
{
|
|
unsigned int n;
|
|
[size_is(n)] byte a[];
|
|
} doub_carr_1_t;
|
|
|
|
typedef struct
|
|
{
|
|
int n;
|
|
[size_is(n)] doub_carr_1_t *a[];
|
|
} doub_carr_t;
|
|
|
|
int sum_doub_carr(doub_carr_t *dc);
|
|
void make_pyramid_doub_carr(unsigned char n, [out] doub_carr_t **dc);
|
|
|
|
typedef struct
|
|
{
|
|
short n;
|
|
[size_is(n)] short data[];
|
|
} user_bstr_t;
|
|
|
|
typedef [unique] user_bstr_t *wire_bstr_t;
|
|
typedef [wire_marshal(wire_bstr_t)] short *bstr_t;
|
|
unsigned hash_bstr(bstr_t s);
|
|
|
|
typedef struct
|
|
{
|
|
[string, size_is(size)] char *name;
|
|
unsigned int size;
|
|
} name_t;
|
|
void get_name([in,out] name_t *name);
|
|
|
|
int sum_pcarr2(int n, [size_is(, n)] int **pa);
|
|
int sum_L1_norms(int n, [size_is(n)] vector_t *vs);
|
|
|
|
/* Don't use this except in the get_s123 test. */
|
|
typedef struct
|
|
{
|
|
int f1;
|
|
int f2;
|
|
int f3;
|
|
} s123_t;
|
|
|
|
/* Make sure WIDL generates a type format string for a previously unseen
|
|
type as a return value. */
|
|
s123_t *get_s123(void);
|
|
|
|
typedef struct
|
|
{
|
|
unsigned int length;
|
|
unsigned int size;
|
|
[size_is(size), length_is(length)] pints_t numbers[];
|
|
} numbers_struct_t;
|
|
|
|
void get_numbers([in] int length, [in] int size, [out, length_is(length), size_is(size)] pints_t pn[]);
|
|
void get_numbers_struct([out] numbers_struct_t **ns);
|
|
|
|
str_t get_filename(void);
|
|
void context_handle_test(void);
|
|
void stop(void);
|
|
}
|