diff --git a/NT/init_nt b/NT/init_nt index c247bd85cfc9bcd7a241160ced4b667b94de81e8..eeb3e110471ef24d7d7d88e78c2eb3da306e48f0 100755 --- a/NT/init_nt +++ b/NT/init_nt @@ -35,7 +35,7 @@ fi IFS=' ' -export NTHOST NTDRIVE NTCC CC PATH NTTOOLS MNTREPLACE MNTREPLACE NTPORT USE_SPRSH +export NTHOST NTDRIVE NTCC CC PATH NTTOOLS MNTREPLACE MNTREPLACE NTPORT USE_SPRSH NTMOUNT IFS case /$SHELL-$TERM in */bash-xterm) diff --git a/src/main.c b/src/main.c index eaa105ac3ffb865beb794c8fec1f6194a471ef2b..38877aaf4b273f537d8acb0c46c62d5393e35bb4 100644 --- a/src/main.c +++ b/src/main.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: main.c,v 1.58 1998/09/02 01:05:45 grubba Exp $"); +RCSID("$Id: main.c,v 1.59 1998/10/22 00:33:31 hubbe Exp $"); #include "fdlib.h" #include "backend.h" #include "module.h" @@ -360,7 +360,7 @@ int dbm_main(int argc, char **argv) } #else /* !HAVE_GETRLIMIT || !RLIMIT_STACK */ /* 128 MB seems a bit extreme, most OS's seem to have their limit at ~8MB */ - stack_top += STACK_DIRECTION * (1024*1024 * 128 - 8192 * sizeof(char *)); + stack_top += STACK_DIRECTION * (1024*1024 * 8 - 8192 * sizeof(char *)); #ifdef STACK_DEBUG fprintf(stderr, "2: C-stack: 0x%08p - 0x%08p, direction:%d\n", &argv, stack_top, STACK_DIRECTION); diff --git a/src/modules/system/nt.c b/src/modules/system/nt.c index 6337ef252f51d9bfac0bbf34391f4fddfd9d0f1a..96e892370534774854d0659575bcf85330faeac7 100644 --- a/src/modules/system/nt.c +++ b/src/modules/system/nt.c @@ -1,5 +1,5 @@ /* - * $Id: nt.c,v 1.5 1998/10/21 23:46:56 marcus Exp $ + * $Id: nt.c,v 1.6 1998/10/22 00:33:55 hubbe Exp $ * * NT system calls for Pike * @@ -183,7 +183,7 @@ static void low_encode_user_info_0(USER_INFO_0 *tmp) { #define SAFE_PUSH_WSTR(X) \ if(X) \ - push_string(make_shared_string1((INT16 *) X)); \ + push_string(make_shared_string1((p_wchar1 *) X)); \ else \ push_int(0) @@ -332,16 +332,10 @@ static netuserenumtype netuserenum; static netapibufferfreetype netapibufferfree; HINSTANCE netapilib; -LPWSTR make_wstr(struct pike_string *s) -{ - LPWSTR ret=(LPWSTR)xalloc(sizeof(WCHAR)*(s->len+1)); - INT32 e; - for(e=0;e<=s->len;e++) ret[e]=s->str[e]; - return ret; -} void f_NetUserGetInfo(INT32 args) { + char *to_free1,*to_free2; BYTE *tmp=0; DWORD level; LPWSTR server, user; @@ -364,21 +358,28 @@ void f_NetUserGetInfo(INT32 args) if(sp[-args].type==T_STRING) { - server=make_wstr(sp[-args].u.string); + server=(LPWSTR)require_wstring1(sp[-args].u.string,&to_free1); + if(!server) + error("NetUserGetInfo, server name string is too wide.\n"); }else{ server=NULL; } - user=make_wstr(sp[1-args].u.string); + user=(LPWSTR)require_wstring1(sp[1-args].u.string,&to_free2); + if(!user) + { + if(to_free1) free(to_free1); + error("NetUserGetInfo, user name string is too wide.\n"); + } THREADS_ALLOW(); ret=netusergetinfo(server,user,level,&tmp); THREADS_DISALLOW(); pop_n_elems(args); - if(server) free(server); - free(user); - + if(to_free1) free(to_free1); + if(to_free2) free(to_free2); + switch(ret) { case ERROR_ACCESS_DENIED: @@ -405,6 +406,7 @@ void f_NetUserGetInfo(INT32 args) void f_NetUserEnum(INT32 args) { + char *to_free1; DWORD level=0; DWORD filter=0; LPWSTR server=NULL; @@ -429,7 +431,7 @@ void f_NetUserEnum(INT32 args) case 1: if(sp[-args].type==T_STRING) - server=make_wstr(sp[-args].u.string); + server=(LPWSTR)require_wstring1(sp[-args].u.string,&to_free1); case 0: break; } @@ -464,10 +466,12 @@ void f_NetUserEnum(INT32 args) switch(ret) { case ERROR_ACCESS_DENIED: + if(to_free1) free(to_free1); error("NetGetUserInfo: Access denied.\n"); break; case NERR_InvalidComputer: + if(to_free1) free(to_free1); error("NetGetUserInfo: Invalid computer.\n"); break; @@ -490,6 +494,7 @@ void f_NetUserEnum(INT32 args) } break; } + if(to_free1) free(to_free1); } void init_nt_system_calls(void) diff --git a/src/signal_handler.c b/src/signal_handler.c index 550fd0d9fa9dc1fed2f9571aa7166348a53e1f84..2023cb08d07eb04d74d4706c9d796fcdc7d1c0e3 100644 --- a/src/signal_handler.c +++ b/src/signal_handler.c @@ -22,7 +22,7 @@ #include "builtin_functions.h" #include <signal.h> -RCSID("$Id: signal_handler.c,v 1.87 1998/10/02 15:02:47 grubba Exp $"); +RCSID("$Id: signal_handler.c,v 1.88 1998/10/22 00:33:32 hubbe Exp $"); #ifdef HAVE_PASSWD_H # include <passwd.h> @@ -624,14 +624,6 @@ static void f_pid_status_pid(INT32 args) } #ifdef __NT__ -static TCHAR *convert_string(char *str, int len) -{ - int e; - TCHAR *ret=(TCHAR *)xalloc((len+1) * sizeof(TCHAR)); - for(e=0;e<len;e++) ret[e]=EXTRACT_UCHAR(str+e); - ret[e]=0; - return ret; -} static HANDLE get_inheritable_handle(struct mapping *optional, char *name, @@ -873,7 +865,7 @@ void f_create_process(INT32 args) { if(tmp=simple_mapping_string_lookup(optional, "cwd")) if(tmp->type == T_STRING) - dir=convert_string(tmp->u.string->str, tmp->u.string->len); + dir=(TCHAR *)STR0(tmp->u.string); t1=get_inheritable_handle(optional, "stdin",1); if(t1!=INVALID_HANDLE_VALUE) info.hStdInput=t1; @@ -932,9 +924,6 @@ void f_create_process(INT32 args) &proc); THREADS_DISALLOW_UID(); - if(dir) free((char *)dir); - if(command_line) free((char *)command_line); - if(filename) free((char *)filename); if(env) pop_stack(); #if 1 diff --git a/src/stralloc.c b/src/stralloc.c index f329e2c65e5829f26e132accfc0c2ad092c05aff..0ee4de7b79f0ed6868276148943bc8d900eb6cc2 100644 --- a/src/stralloc.c +++ b/src/stralloc.c @@ -15,7 +15,7 @@ #include <ctype.h> -RCSID("$Id: stralloc.c,v 1.46 1998/10/15 02:38:49 grubba Exp $"); +RCSID("$Id: stralloc.c,v 1.47 1998/10/22 00:33:33 hubbe Exp $"); #define BEGIN_HASH_SIZE 997 #define MAX_AVG_LINK_LENGTH 3 @@ -83,9 +83,9 @@ static INLINE unsigned INT32 generic_extract (const void *str, int size, int pos case 0: return ((unsigned char *)str)[pos]; case 1: return ((unsigned INT16 *)str)[pos]; case 2: return ((unsigned INT32 *)str)[pos]; - default: - fatal("Illegal shift size!\n"); } + fatal("Illegal shift size!\n"); + return 0; } INLINE unsigned INT32 index_shared_string(struct pike_string *s, int pos) @@ -509,7 +509,7 @@ struct pike_string * debug_make_shared_binary_string(const char *str,int len) return s; } -struct pike_string * debug_make_shared_binary_string1(const INT16 *str,int len) +struct pike_string * debug_make_shared_binary_string1(const p_wchar1 *str,int len) { struct pike_string *s; int h; @@ -518,7 +518,7 @@ struct pike_string * debug_make_shared_binary_string1(const INT16 *str,int len) { /* Wrong size, convert */ s=begin_shared_string(len); - convert_1_to_0(s->str,str,len); + convert_1_to_0(STR0(s),str,len); return end_shared_string(s); } @@ -537,7 +537,7 @@ struct pike_string * debug_make_shared_binary_string1(const INT16 *str,int len) return s; } -struct pike_string * debug_make_shared_binary_string2(const INT32 *str,int len) +struct pike_string * debug_make_shared_binary_string2(const p_wchar2 *str,int len) { struct pike_string *s; int h; @@ -547,7 +547,7 @@ struct pike_string * debug_make_shared_binary_string2(const INT32 *str,int len) case 0: /* Wrong size, convert */ s=begin_shared_string(len); - convert_2_to_0(s->str,str,len); + convert_2_to_0(STR0(s),str,len); return end_shared_string(s); case 1: @@ -577,14 +577,14 @@ struct pike_string *debug_make_shared_string(const char *str) return make_shared_binary_string(str, strlen(str)); } -struct pike_string *debug_make_shared_string1(const INT16 *str) +struct pike_string *debug_make_shared_string1(const p_wchar1 *str) { INT32 len; for(len=0;str[len];len++); return debug_make_shared_binary_string1(str,len); } -struct pike_string *debug_make_shared_string2(const INT32 *str) +struct pike_string *debug_make_shared_string2(const p_wchar2 *str) { INT32 len; for(len=0;str[len];len++); @@ -1271,10 +1271,9 @@ struct pike_string *string_slice(struct pike_string *s, case 2: return make_shared_binary_string2(STR2(s)+start,len); - - default: - fatal("Illegal shift size!\n"); } + fatal("Illegal shift size!\n"); + return 0; } /*** replace function ***/ @@ -1632,11 +1631,11 @@ PCHARP MEMCHR_PCHARP(PCHARP ptr, int chr, int len) switch(ptr.shift) { case 0: return MKPCHARP(MEMCHR0(ptr.ptr,chr,len),0); - case 1: return MKPCHARP(MEMCHR1(ptr.ptr,chr,len),1); - case 2: return MKPCHARP(MEMCHR2(ptr.ptr,chr,len),2); - default: - fatal("Illegal shift in MEMCHR_PCHARP.\n"); + case 1: return MKPCHARP(MEMCHR1((p_wchar1 *)ptr.ptr,chr,len),1); + case 2: return MKPCHARP(MEMCHR2((p_wchar2 *)ptr.ptr,chr,len),2); } + fatal("Illegal shift in MEMCHR_PCHARP.\n"); + return MKPCHARP(0,0); /* make wcc happy */ } #define DIGIT(x) (isdigit(x) ? (x) - '0' : \ @@ -1697,3 +1696,71 @@ long STRTOL_PCHARP(PCHARP str, PCHARP *ptr, int base) if (ptr) *ptr = str; return (neg ? val : -val); } + +p_wchar0 *require_wstring0(struct pike_string *s, + char **to_free) +{ + switch(s->size_shift) + { + case 0: + *to_free=0; + return STR0(s); + case 1: + case 2: + return 0; + + default: + fatal("Illegal shift size in string.\n"); + } + return 0; +} + +p_wchar1 *require_wstring1(struct pike_string *s, + char **to_free) +{ + switch(s->size_shift) + { + case 0: + *to_free=xalloc((s->len+1)*2); + convert_0_to_1((p_wchar1 *)*to_free, STR0(s),s->len+1); + return (p_wchar1 *)*to_free; + + case 1: + *to_free=0; + return STR1(s); + + case 2: + return 0; + + default: + fatal("Illegal shift size in string.\n"); + } + return 0; +} + + +p_wchar2 *require_wstring2(struct pike_string *s, + char **to_free) +{ + switch(s->size_shift) + { + case 0: + *to_free=xalloc((s->len+1)*4); + convert_0_to_2((p_wchar2 *)*to_free, STR0(s),s->len+1); + return (p_wchar2 *)*to_free; + + case 1: + *to_free=xalloc((s->len+1)*4); + convert_1_to_2((p_wchar2 *)*to_free, STR1(s),s->len+1); + return (p_wchar2 *)*to_free; + + case 2: + *to_free=0; + return STR2(s); + + default: + fatal("Illegal shift size in string.\n"); + } + return 0; +} + diff --git a/src/stralloc.h b/src/stralloc.h index 17d99f282fe6e36c337ecd95ad16c06704168882..478a570dc9a5738c75642638e3f8c1b6000e8e7d 100644 --- a/src/stralloc.h +++ b/src/stralloc.h @@ -5,7 +5,7 @@ \*/ /* - * $Id: stralloc.h,v 1.23 1998/10/21 19:47:41 hubbe Exp $ + * $Id: stralloc.h,v 1.24 1998/10/22 00:33:34 hubbe Exp $ */ #ifndef STRALLOC_H #define STRALLOC_H @@ -65,14 +65,14 @@ struct pike_string *debug_findstring(const struct pike_string *foo); typedef struct p_wchar_p { - void *ptr; + char *ptr; int shift; } PCHARP; #define INDEX_PCHARP(X,Y) INDEX_CHARP((X).ptr,(Y),(X).shift) #define SET_INDEX_PCHARP(X,Y,Z) INDEX_CHARP((X).ptr,(Y),(X).shift,(Z)) #define EXTRACT_PCHARP(X) INDEX_CHARP((X).ptr,(0),(X).shift) -#define INC_PCHARP(X,Y) (((char *)(X).ptr)+=(Y) << (X).shift) +#define INC_PCHARP(X,Y) (((X).ptr)+=(Y) << (X).shift) #define LOW_COMPARE_PCHARP(X,CMP,Y) (((char *)((X).ptr)) CMP ((char *)((Y).ptr))) #define LOW_SUBTRACT_PCHARP(X,Y) LOW_COMPARE_PCHARP((X),-,(Y)) @@ -151,19 +151,13 @@ INLINE INT32 PIKE_CONCAT4(compare_,FROM,_to_,TO)(const PIKE_CONCAT(p_wchar,TO) * /* Prototypes begin here */ INLINE unsigned INT32 index_shared_string(struct pike_string *s, int pos); INLINE void low_set_index(struct pike_string *s, int pos, int value); -INLINE struct pike_string *debug_check_size_shift(struct pike_string *a,int shift); +struct INLINE pike_string *debug_check_size_shift(struct pike_string *a,int shift); CONVERT(0,1) CONVERT(0,2) CONVERT(1,0) CONVERT(1,2) CONVERT(2,0) CONVERT(2,1) - - - - - - int generic_compare_strings(const void *a,int alen, int asize, const void *b,int blen, int bsize); void generic_memcpy(PCHARP to, @@ -178,11 +172,11 @@ struct pike_string *debug_begin_wide_shared_string(int len, int shift); struct pike_string *low_end_shared_string(struct pike_string *s); struct pike_string *end_shared_string(struct pike_string *s); struct pike_string * debug_make_shared_binary_string(const char *str,int len); -struct pike_string * debug_make_shared_binary_string1(const INT16 *str,int len); -struct pike_string * debug_make_shared_binary_string2(const INT32 *str,int len); +struct pike_string * debug_make_shared_binary_string1(const p_wchar1 *str,int len); +struct pike_string * debug_make_shared_binary_string2(const p_wchar2 *str,int len); struct pike_string *debug_make_shared_string(const char *str); -struct pike_string *debug_make_shared_string1(const INT16 *str); -struct pike_string *debug_make_shared_string2(const INT32 *str); +struct pike_string *debug_make_shared_string1(const p_wchar1 *str); +struct pike_string *debug_make_shared_string2(const p_wchar2 *str); void unlink_pike_string(struct pike_string *s); void really_free_string(struct pike_string *s); void debug_free_string(struct pike_string *s); @@ -240,6 +234,12 @@ void free_string_builder(struct string_builder *s); struct pike_string *finish_string_builder(struct string_builder *s); PCHARP MEMCHR_PCHARP(PCHARP ptr, int chr, int len); long STRTOL_PCHARP(PCHARP str, PCHARP *ptr, int base); +p_wchar0 *require_wstring0(struct pike_string *s, + char **to_free); +p_wchar1 *require_wstring1(struct pike_string *s, + char **to_free); +p_wchar2 *require_wstring2(struct pike_string *s, + char **to_free); /* Prototypes end here */ #ifdef DEBUG_MALLOC