diff --git a/cde/programs/dtlogin/dm.c b/cde/programs/dtlogin/dm.c index 3bf7cd510..aa2bbdb75 100644 --- a/cde/programs/dtlogin/dm.c +++ b/cde/programs/dtlogin/dm.c @@ -1450,16 +1450,6 @@ SetTitle( char *name, char *ptr ) * *****************************************************************************/ -#if defined (_AIX) && defined (_POWER) -#define GETTYPATH "/usr/sbin/getty" -#elif defined(__OpenBSD__) -#define GETTYPATH "/usr/libexec/getty" -#elif defined(__linux__) -#define GETTYPATH "/sbin/getty" -#else -#define GETTYPATH "/etc/getty" -#endif - static int StartGetty( struct display *d ) { diff --git a/cde/programs/dtlogin/dm.h b/cde/programs/dtlogin/dm.h index 946a8b664..5b589c506 100644 --- a/cde/programs/dtlogin/dm.h +++ b/cde/programs/dtlogin/dm.h @@ -100,6 +100,7 @@ #define DEF_SUPATH "/usr/sbin:/usr/bin" /* same as ROOTPATH */ #define LANGLISTSIZE 2048 +#define LANGUAGESIZE 50 #define DELIM " \t" /* delimiters in language list */ diff --git a/cde/programs/dtlogin/dpylist.c b/cde/programs/dtlogin/dpylist.c index 05ef932bb..fa31a073c 100644 --- a/cde/programs/dtlogin/dpylist.c +++ b/cde/programs/dtlogin/dpylist.c @@ -51,6 +51,7 @@ * a simple linked list of known displays */ +# include # include "dm.h" # include "vgmsg.h" @@ -190,7 +191,7 @@ RemoveDisplay( struct display *old ) IfFree (d->peer); IfFree (d->from); XdmcpDisposeARRAY8(&d->clientAddr); - IfFree (d->language); + munmap (d->language, LANGUAGESIZE + 1); IfFree (d->langList); IfFree (d->utmpId); IfFree (d->gettyLine); @@ -216,8 +217,17 @@ RemoveDisplay( struct display *old ) struct display * NewDisplay( char *name, char *class ) { + char *language; struct display *d; + language = mmap (NULL, LANGUAGESIZE + 1, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + + if (language == MAP_FAILED) { + LogOutOfMem (ReadCatalog(MC_LOG_SET,MC_LOG_NEW_DPY,MC_DEF_LOG_NEW_DPY)); + return 0; + } + d = (struct display *) malloc (sizeof (struct display)); if (!d) { LogOutOfMem (ReadCatalog(MC_LOG_SET,MC_LOG_NEW_DPY,MC_DEF_LOG_NEW_DPY)); @@ -290,7 +300,7 @@ NewDisplay( char *name, char *class ) d->useChooser = 0; d->clientAddr.data = NULL; d->clientAddr.length = 0; - d->language = NULL; + d->language = language; d->langList = NULL; d->utmpId = NULL; d->gettyLine = NULL; @@ -303,4 +313,3 @@ NewDisplay( char *name, char *class ) displays = d; return d; } - diff --git a/cde/programs/dtlogin/resource.c b/cde/programs/dtlogin/resource.c index f1e2024cb..f93fc7676 100644 --- a/cde/programs/dtlogin/resource.c +++ b/cde/programs/dtlogin/resource.c @@ -672,6 +672,8 @@ LoadDisplayResources( struct display *d ) } } + lang = d->language; + d->language = NULL; for (i = 0; i < NUM_DISPLAY_RESOURCES; i++) { sprintf (name, "%s.%s.%s", AppName, @@ -682,6 +684,13 @@ LoadDisplayResources( struct display *d ) (char **) (((char *) d) + DisplayResources[i].offset), DisplayResources[i].default_value); } + if (!strlen(lang) && d->language && strlen(d->language)) + *(strncpy(lang, d->language, LANGUAGESIZE) + LANGUAGESIZE) = + '\0'; + + free(d->language); + d->language = lang; + #ifdef _AIX if(d->language == NULL || strlen(d->language) == 0) SetDefaultLanguage(d); diff --git a/cde/programs/dtlogin/session.c b/cde/programs/dtlogin/session.c index 20461ff36..56d2b19af 100644 --- a/cde/programs/dtlogin/session.c +++ b/cde/programs/dtlogin/session.c @@ -2406,12 +2406,10 @@ RunGreeter( struct display *d, struct greet_info *greet, Debug("Greeter returned language (NULL)\n"); - if (strcmp(d->language, "default") == 0) { - int len = strlen(defaultLanguage) + 1; - d->language = (d->language == NULL ? - malloc(len) : realloc (d->language, len)); - strcpy(d->language, defaultLanguage); - } + if (strcmp(d->language, "default") == 0) + *(strncpy(d->language, defaultLanguage, LANGUAGESIZE) + + LANGUAGESIZE) = '\0'; + return; #ifdef BLS case NOTIFY_BAD_SECLEVEL: @@ -2678,7 +2676,7 @@ ManageGreeter( struct display *d, struct greet_info *greet, Debug("GREET_STATE_AUTHENTICATE\n"); r = (ResponseChallenge *)state->response; - + if (greet->name == NULL) { greet->name = strdup(((char *)r) + r->offResponse); @@ -2805,17 +2803,14 @@ ManageGreeter( struct display *d, struct greet_info *greet, */ ResponseLang *r; char *lang; - int len; Debug("GREET_STATE_LANG\n"); r = (ResponseLang *)state->response; lang = ((char *)r) + r->offLang; - len = strlen(lang) + 1; - d->language = (d->language == NULL ? - malloc(len) : realloc(d->language, len)); - strcpy(d->language, lang); + *(strncpy(d->language, lang, LANGUAGESIZE) + LANGUAGESIZE) = '\0'; + Debug("Language returned: %s\n", d->language); } break; diff --git a/cde/programs/dtlogin/util.c b/cde/programs/dtlogin/util.c index a46b7ca0c..0ae40af1c 100644 --- a/cde/programs/dtlogin/util.c +++ b/cde/programs/dtlogin/util.c @@ -766,7 +766,6 @@ SetDefaultLanguage(struct display *d) * If LANG is set for hft, we need to change it for X. * Currently there are four hft LANG variables. */ - d->language = (char *)malloc(strlen(lang)+1); if(strcmp(lang, "En_JP") == 0) strcpy(d->language, "Ja_JP"); else if(strcmp(lang, "en_JP") == 0) @@ -776,7 +775,7 @@ SetDefaultLanguage(struct display *d) else if(strcmp(lang, "en_TW") == 0) strcpy(d->language, "zh_TW"); else - strcpy(d->language, lang); + *(strncpy(d->language, lang, LANGUAGESIZE) + LANGUAGESIZE) = '\0'; } } #endif /* _AIX */ @@ -820,7 +819,7 @@ setLang( struct display *d, char **env , char *langptr) if (set_def_lang) { env = setEnv(env, "LANG", "C"); - d->language = strdup("C"); + strcpy(d->language, "C"); } return env; }