diff options
Diffstat (limited to 'source/a/getty-ps/getty.bugfixes.diff')
-rw-r--r-- | source/a/getty-ps/getty.bugfixes.diff | 356 |
1 files changed, 356 insertions, 0 deletions
diff --git a/source/a/getty-ps/getty.bugfixes.diff b/source/a/getty-ps/getty.bugfixes.diff new file mode 100644 index 00000000..6a1ed29e --- /dev/null +++ b/source/a/getty-ps/getty.bugfixes.diff @@ -0,0 +1,356 @@ +This patch contains the following bugfixes: + +* the TIMEOUT (and -t flag) has now different effect for getty and uugetty: + with uugetty, TIMEOUT set will now cause uugetty exit no matter whether + there has been any input from the user (the counting will start immediately + after login() has been spawned - pre- getty-2.1.0 behavior), while for + getty, it will make the counter start after single input has been detected + from the user + * getty.1 manpage updated accordingly + +* @F issue substitution now works as expected + +* @V / VERSION functionality documentation fix in getty.1 manpage + +* fixed a bunch of memleaks (if not all): + * Fputs() made strdup()-free (we now use static structs where possible) + * avoided unnecessary dual strdup() for Version in defs() + * freeing of "DEF **def" including its internals is now handled, as well as + feeing of other variables in defs() pointing to strdup()ed memory areas + +Jan Rafaj + +--- ./man/getty.1.orig 2002-09-13 09:05:03.000000000 +0200 ++++ ./man/getty.1 2005-07-21 10:24:53.000000000 +0200 +@@ -307,7 +307,18 @@ + to exit (which + .I init + should then respawn), if the login is not completed within timeout seconds +-(after the login name is entered) ++(after the login name is entered). This option behaves differently for ++.I getty ++and ++.I uugetty. ++If ++.I getty ++is used, the counting will start after single input from the user has been ++detected, whileas with ++.I uugetty, ++the counting will start immediately after ++.IR login (1m) ++has been spawned, no matter the input from the user. + + Giving + .B \-w +@@ -388,9 +399,12 @@ + If + .I string + begins with a '/' character, it is assumed to be the full pathname of a +-file, and ++text file, and + .B @V +-is set to be the contents of that file. The default is /proc/version. ++is set to be the contents of the first line in that file (line has to be ++terminated by newline character or by end of file). ++.br ++The default is /proc/version. + .TP + LOGIN=\fIname\fR + Sets the name of the login program to +@@ -503,6 +517,14 @@ + to exit if no user name is accepted before the + .I number + of seconds elapse after the login prompt is displayed. ++With ++.I getty, ++the counting will start as soon as a single character ++has been entered by the user, whileas with ++.I uugetty, ++the counting will start immediately after the login prompt ++is displayed, no matter the input from the user. ++.br + The default is to wait indefinitely for the user name. + .TP + CONNECT=\fIstring\fR +@@ -865,6 +887,11 @@ + .IR cu (1) + and others). This prevents two or more processes from having conficting + use of a tty port. ++.br ++.I Uugetty ++also differs from ++.I getty ++by handling the -t parameter and TIMEOUT option. + .PP + When + .I uugetty +--- ./main.c.orig 2004-04-11 03:34:34.000000000 +0200 ++++ ./main.c 2005-07-21 11:37:19.000000000 +0200 +@@ -78,6 +78,8 @@ + void debugstart(); + #endif /* DEBUG */ + ++DEF **def; ++ + /* trivial globals */ + + char buf[MAXLINE]; +@@ -86,7 +88,7 @@ + char tbuf[64]; + + #define Perror(s) { debug(D_INIT, "Line %d: %s: Error %d: %s\n", \ +- __LINE__, s, errno, sys_errlist[errno]); \ ++ __LINE__, s, errno, strerror(errno)); \ + exit(errno); \ + } + +@@ -149,6 +151,50 @@ + } + } + ++/* ++ * Why a lot of programmers ignore the fact that memory area returned ++ * by strdup() and *alloc() has to be freed upon exit? :(( -JR ++ */ ++void free_def(void) ++{ ++ register DEF **deflist = def; ++ ++ for (; *deflist != (DEF *)NULL; deflist++) { ++ free((*deflist)->name); ++ free((*deflist)->value); ++ free(*deflist); ++ } ++} ++ ++void free_sysname(void) ++{ ++ if (SysName) ++ free(SysName); ++ SysName = NULL; ++} ++ ++void free_version(void) ++{ ++ if (Version) ++ free(Version); ++ Version = NULL; ++} ++ ++#ifdef UUGETTY ++void free_lock(void) ++{ ++ if (lock) ++ free(lock); ++ lock = NULL; ++} ++ ++void free_altlock(void) ++{ ++ if (altlock) ++ free(altlock); ++ altlock = NULL; ++} ++#endif + + /* + ** main +@@ -320,7 +366,6 @@ + char **args; + { + register int c; +- DEF **def; + char *p; + char termcap[1024]; + +@@ -416,22 +461,27 @@ + /* now, get all that info in the defaults file */ + + def = defbuild(defname); ++ atexit(free_def); + #ifdef DEBUG + if ((p = defvalue(def, "DEBUG"))) (void) sscanf(p, "%o", &Debug); + if (Debug) debugstart(); + #endif /* DEBUG */ + SysName = strdup(getuname()); ++ atexit(free_sysname); + if (p = defvalue(def, "SYSTEM")) SysName = p; +- if (p = defvalue(def, "VERSION")) +- Version = strdup(p); +- if (*Version == '/') +- { if ((fp = fopen(Version, "r"))) +- { fgets(buf, MAXLINE, fp); +- fclose(fp); +- buf[strlen(buf)-1] = '\0'; +- Version = strdup(buf); ++ if (p = defvalue(def, "VERSION")) { ++ if (*p == '/') { ++ if ((fp = fopen(p, "r"))) { ++ fgets(buf, MAXLINE, fp); ++ fclose(fp); ++ buf[strlen(buf)-1] = '\0'; ++ Version = strdup(buf); + } +- } ++ } else { ++ Version = strdup(p); ++ } ++ atexit(free_version); ++ } + if((p = defvalue(def, "LOGIN"))) login_pgm = p; + if((p = defvalue(def, "ISSUE"))) issue = p; + if((p = defvalue(def, "CLEAR")) && (strequal(p, "NO"))) +@@ -489,12 +539,15 @@ + #ifdef UUGETTY + (void) sprintf(buf, LOCK, Device); + lock = strdup(buf); ++ atexit(free_lock); + if((p = defvalue(def, "ALTLOCK"))) { + (void) sprintf(buf, LOCK, p); + altlock = strdup(buf); ++ atexit(free_altlock); + } else if(! strequal(Device, InitDevice)) { + (void) sprintf(buf, LOCK, InitDevice); + altlock = strdup(buf); ++ atexit(free_altlock); + } + + debug(D_LOCK, "lock = (%s), altlock = (%s)", lock, altlock); +@@ -625,8 +678,8 @@ + with the uts struct filled above. + */ + +- debug(D_UTMP, "adding utmp entry: type: %d, pid: %d, line: %s, +- id: %c%c, time: %d, user: %s, host: %s, addr: %d", ++ debug(D_UTMP, "adding utmp entry: type: %d, pid: %d, line: %s, " ++ "id: %c%c, time: %d, user: %s, host: %s, addr: %d", + uts.ut_type, uts.ut_pid, uts.ut_line, + (uts.ut_id[0] ? uts.ut_id[0] : ' '), + (uts.ut_id[1] ? uts.ut_id[1] : ' '), +@@ -1077,16 +1130,20 @@ + login_prompt: + (void) ioctl(STDIN, TCFLSH, 0); + #ifdef FIDO +- if (emsi && (strcmp(emsi,"yes") == 0)) +- (void) Fputs("**EMSI_REQA77E\r", stdout); ++ if (emsi && (strcmp(emsi,"yes") == 0)) ++ (void) Fputs("**EMSI_REQA77E\r", stdout); + #endif + (void) Fputs(gtab->login, stdout); +- ++#ifndef UUGETTY + login_result=getlogname(&termio, buf, MAXLINE); ++#endif + if(TimeOut > 0) { + (void) signal(SIGALRM, timeout); + (void) alarm((unsigned) TimeOut); + } ++#ifdef UUGETTY ++ login_result=getlogname(&termio, buf, MAXLINE); ++#endif + + switch(login_result) { + #ifdef FIDO +@@ -1114,6 +1171,13 @@ + #ifdef SETTERM + setenv("TERM", term, TRUE); + #endif /* SETTERM */ ++ free_def(); ++ free_sysname(); ++ free_version(); ++#ifdef UUGETTY ++ free_lock(); ++ free_altlock(); ++#endif + debug(D_RUN, "execing login"); + (void) execl(login_pgm, + "login", buf, NULLPTR); +--- ./funcs.c.orig 2002-09-25 08:43:28.000000000 +0200 ++++ ./funcs.c 2005-07-20 19:01:55.000000000 +0200 +@@ -87,12 +87,11 @@ + register char *s; + register FILE *stream; + { +- char c, n, tbuf[20], ubuf[MAXBUF]; +- char *cbuf; ++ char c, n, tbuf[20]; + time_t clock; + struct tm *lt; +- struct utsname utsbuf; +- struct hostent *fqdname; ++ static struct utsname utsbuf; ++ static struct hostent *fqdname; + FILE *fp1; + + char *day_name[] = { "Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat" }; +@@ -119,21 +118,8 @@ + return(EOF); + break; + case 'F': /* FQDName */ +- cbuf = strdup(SysName); +-#if 0 /* The does a seg violation - no idea why.... */ + fqdname = gethostbyname(SysName); +-#endif +-#if 0 /* So, we cheat.....! */ +- /* Which also gets a seg violation! */ +- if (fp1 = fopen("/etc/HOSTNAME", "r")) +- { fgets(cbuf, MAXBUF, fp1); +- fclose(fp1); +- cbuf[strlen(cbuf)] = '\0'; +- } +- if (fqdname != NULL) +- cbuf = strdup(fqdname->h_name); +-#endif +- if (Fputs(cbuf, stream) == EOF) ++ if (fqdname && Fputs(fqdname->h_name, stream) == EOF) + return(EOF); + break; + case 'L': /* line */ +@@ -141,18 +127,15 @@ + return(EOF); + break; + case 'M': /* arch of machine */ +- cbuf = strdup(utsbuf.machine); +- if (Fputs(cbuf, stream) == EOF) ++ if (Fputs(utsbuf.machine, stream) == EOF) + return(EOF); + break; + case 'O': /* O/S name */ +- cbuf = strdup(utsbuf.sysname); +- if (Fputs(cbuf, stream) == EOF) ++ if (Fputs(utsbuf.sysname, stream) == EOF) + return(EOF); + break; + case 'R': /* O/S rev_id */ +- cbuf = strdup(utsbuf.release); +- if (Fputs(cbuf, stream) == EOF) ++ if (Fputs(utsbuf.release, stream) == EOF) + return(EOF); + break; + case 'S': /* system node name */ +@@ -166,8 +149,8 @@ + return(EOF); + break; + case 'U': /* number of active users */ +- (void) sprintf(ubuf, "%d", Nusers); +- if (Fputs(ubuf, stream) == EOF) ++ (void) sprintf(tbuf, "%d", Nusers); ++ if (Fputs(tbuf, stream) == EOF) + return(EOF); + break; + case 'V': /* version */ +@@ -175,12 +158,10 @@ + return(EOF); + break; + case 'u': /* user count str */ +- cbuf = malloc(20); + (void) sprintf(tbuf, "%d User", Nusers); + if (Nusers > 1) +- cbuf = strcat(tbuf,"s"); +- else cbuf=strdup(tbuf); +- if (Fputs(cbuf, stream) == EOF) ++ strcat(tbuf, "s"); ++ if (Fputs(tbuf, stream) == EOF) + return(EOF); + break; + case '@': /* in case '@@' was used */ |