From e317048e218bc183295aca119ba0a182d1d90990 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Tue, 21 Mar 2023 07:33:00 -0700 Subject: [PATCH] Fix segfault in tbr.alt.c, swap tbr.alt.c code The segfault has been fixed when EOF is sent to the program (causing fgets() to return NULL). Since fgets() is far safer than gets() and since the gets() version will intersperse the warning and the first line of output I have changed the alt version to be the original (fixed to compile with modern compilers) and the tbr is the one with fgets(). --- 1990/tbr/README.md | 23 +++++++++++++---------- 1990/tbr/tbr.alt.c | 2 +- 1990/tbr/tbr.c | 3 +-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/1990/tbr/README.md b/1990/tbr/README.md index eab1c0f7b..1c95708d3 100644 --- a/1990/tbr/README.md +++ b/1990/tbr/README.md @@ -19,22 +19,24 @@ [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed this to work with modern computers; `exit(3)` returns void but the function was used in a binary -expression so this would not even compile. Thank you Cody for your assistance! +expression so this wouldn't even compile. Cody also changed the code to use +`fgets()` instead of `gets()` so one would not get a warning about the use of +`gets()` at execution which was interspersed with the output. Thank you Cody for +your assistance! +For the original version with `gets()` see the alternative code section below. ## Alternative code: -Cody also made a version that uses `fgets()` instead of `gets()` so one would -not get a warning that was interspersed with the output of the initial prompt -when running the program, to make it both safer and to have a better look. Thank -you Cody! - -To build try: +If you wish to see the original source (fixed so it can compile) that uses +`gets()` instead of `fgets()` you can look at [tbr.alt.c](tbr.alt.c). To compile +it: make alt -NOTE: it will segfault if you send EOF; to quit send an interrupt like ctrl-c. -Cody will look at this later. +Use `./tbr.alt` instead of `./tbr` for this version. You'll likely get a warning +about the usage of `gets()`. + ## To run: @@ -53,7 +55,8 @@ NOTE: globs do not work with this entry. Why? vi tbr.c # then figure out how to exit vi :-) -What happens if you try using `cd -` to return to previous directory? +What happens if you try using `cd -` to return to previous directory? What about +`cd` with no args? ## Judges' comments: diff --git a/1990/tbr/tbr.alt.c b/1990/tbr/tbr.alt.c index f7bc55d40..70c39ee19 100644 --- a/1990/tbr/tbr.alt.c +++ b/1990/tbr/tbr.alt.c @@ -4,7 +4,7 @@ char *c,q [512 ],m[ 256 ],*v[ 99], **u, *i[3];int f[2],p;main (){for (m[m [60]= m[62 ]=32 ]=m[* m=124 [m]= 9]=6; - e(-8) ,(c=fgets (q,512,stdin),c[strlen(c)-1]='\0',1)||(exit (0),0);r(0,0) + e(-8) ,gets (1+( c=q) )|| (exit (0),0); r(0,0) )for( ;*++ c;); }r(t, o){ *i=i [2]= 0;for (u=v +98 ;m[*--c] ^9;m [*c] &32 ?i[*c &2]= *u,u- v^98 &&++u: diff --git a/1990/tbr/tbr.c b/1990/tbr/tbr.c index 70c39ee19..54668f404 100644 --- a/1990/tbr/tbr.c +++ b/1990/tbr/tbr.c @@ -1,10 +1,9 @@ - #define D ,close( char *c,q [512 ],m[ 256 ],*v[ 99], **u, *i[3];int f[2],p;main (){for (m[m [60]= m[62 ]=32 ]=m[* m=124 [m]= 9]=6; - e(-8) ,gets (1+( c=q) )|| (exit (0),0); r(0,0) + e(-8) ,(c=fgets(q,512,stdin),(c==NULL &&(exit(0),1))||(c[strlen(c)-1]='\0'),1)||(exit(0),0);r(0,0) )for( ;*++ c;); }r(t, o){ *i=i [2]= 0;for (u=v +98 ;m[*--c] ^9;m [*c] &32 ?i[*c &2]= *u,u- v^98 &&++u: