Package: release.debian.org Severity: normal Tags: bookworm X-Debbugs-Cc: gnuch...@packages.debian.org Control: affects -1 + src:gnuchess User: release.debian....@packages.debian.org Usertags: pu
Fix for low severity issue which doesn't warrant a DSA, debdiff below. Cheers, Moritz diff -Nru gnuchess-6.2.7/debian/changelog gnuchess-6.2.7/debian/changelog --- gnuchess-6.2.7/debian/changelog 2020-10-24 09:16:35.000000000 +0200 +++ gnuchess-6.2.7/debian/changelog 2025-01-01 16:58:08.000000000 +0100 @@ -1,3 +1,10 @@ +gnuchess (6.2.7-1+deb12u1) bookworm; urgency=medium + + * CVE-2021-30184 (Closes: #1070372) + * Add missing build dep on help2man + + -- Moritz Mühlenhoff <j...@debian.org> Wed, 01 Jan 2025 16:58:08 +0100 + gnuchess (6.2.7-1) unstable; urgency=medium * New upstream release (Closes: #936023) diff -Nru gnuchess-6.2.7/debian/control gnuchess-6.2.7/debian/control --- gnuchess-6.2.7/debian/control 2020-10-24 09:16:35.000000000 +0200 +++ gnuchess-6.2.7/debian/control 2025-01-01 16:58:08.000000000 +0100 @@ -2,7 +2,7 @@ Section: games Priority: optional Maintainer: Vincent Legout <vleg...@debian.org> -Build-Depends: debhelper-compat (= 12) +Build-Depends: debhelper-compat (= 12), help2man Standards-Version: 4.5.0 Homepage: https://www.gnu.org/software/chess/ Vcs-Git: https://salsa.debian.org/debian/gnuchess.git diff -Nru gnuchess-6.2.7/debian/patches/CVE-2021-30184.patch gnuchess-6.2.7/debian/patches/CVE-2021-30184.patch --- gnuchess-6.2.7/debian/patches/CVE-2021-30184.patch 1970-01-01 01:00:00.000000000 +0100 +++ gnuchess-6.2.7/debian/patches/CVE-2021-30184.patch 2025-01-01 16:57:57.000000000 +0100 @@ -0,0 +1,195 @@ +From f6a65783ebb41bb87811e57754e65933550a44c0 Mon Sep 17 00:00:00 2001 +From: Antonio Ceballos <acebal...@gmail.com> +Date: Sun, 27 Jun 2021 01:39:06 +0200 +Subject: Fixed CVE-2021-30184: buffer overflow on pgnload and pgnreplay + +--- gnuchess-6.2.7.orig/src/frontend/cmd.cc ++++ gnuchess-6.2.7/src/frontend/cmd.cc +@@ -59,6 +59,7 @@ char *endptr; + static int hardFlag=0; + static int postFlag=0; + ++static const char setboard_cmd[] = "setboard "; + + static void split_input(void) + { +@@ -93,6 +94,20 @@ static int tokeneq(const char *s, const + } + + /* ++ * Remove a trailing \n and return error if last character is not \n. ++ */ ++char *trim_newline(char *line) ++{ ++ char *result = NULL; ++ unsigned int last_char_index = strlen(line) - 1; ++ if (line[last_char_index] == '\n') { ++ line[last_char_index] = '\0'; ++ result = line; ++ } ++ return result; ++} ++ ++/* + * Reads a PGN file and returns the equivalent EPD content + * + * The conversion relies on a temporary file in EPD format, +@@ -109,10 +124,53 @@ static char *load_pgn_as_epd( const char + char *s = fgets( epdline, MAXSTR, epdfile ); + fclose( epdfile ); + remove( tmp_epd ); ++ if (s != NULL) { ++ s = trim_newline(epdline); ++ } + + return s; + } + ++/* ++ * Takes an EPD filename as input and returns the contents as a ++ * 'setboard <epd-position>' command. ++ */ ++char *build_setboard_cmd_from_epd_file(char *data, const char *epd_filename) ++{ ++ char *result = NULL; ++ char epdline[MAXSTR]=""; ++ ++ FILE *epdfile = fopen(epd_filename, "r"); ++ if (epdfile != NULL) { ++ if (fgets(epdline, MAXSTR, epdfile) && trim_newline(epdline) && strlen(setboard_cmd) + strlen(epdline) < MAXSTR) { ++ strcpy(data, setboard_cmd); ++ strcat(data, epdline); ++ result = data; ++ } ++ fclose(epdfile); ++ } ++ ++ return result; ++} ++ ++/* ++ * Takes a PGN filename as input and returns the contents as a ++ * 'setboard <epd-position>' command. ++ */ ++char *build_setboard_cmd_from_pgn_file(char *data, const char *pgn_filename) ++{ ++ char *result = NULL; ++ char epdline[MAXSTR]=""; ++ ++ if (load_pgn_as_epd(pgn_filename, epdline, 0) && strlen(setboard_cmd) + strlen(epdline) < MAXSTR) { ++ strcpy(data, setboard_cmd); ++ strcat(data, epdline); ++ result = data; ++ } ++ ++ return result; ++} ++ + void cmd_accepted(void) + { + SetDataToEngine( token[0] ); +@@ -317,8 +375,9 @@ void cmd_list(void) + + void cmd_load(void) + { ++ char *epd_filename = token[1]; + char data[MAXSTR]=""; +- LoadEPD (token[1]); ++ LoadEPD (epd_filename); + pgnloaded = 0; + check_board(); + if (!ValidateBoard()) { +@@ -326,31 +385,11 @@ void cmd_load(void) + printf (_("Board is wrong!\n")); + } else { + /* Read EPD file and send contents to engine */ +- FILE *epdfile = fopen( token[1], "r" ); +- char epdline[MAXSTR]=""; +- if ( epdfile == NULL ) { +- printf(_("Error reading file '%s'.\n"), token[1] ); ++ if (build_setboard_cmd_from_epd_file(data, epd_filename)) { ++ SetDataToEngine( data ); ++ SetAutoGo( true ); + } else { +- if ( fgets( epdline, MAXSTR, epdfile ) == NULL ) { +- printf(_("Error reading file '%s'.\n"), token[1] ); +- } else { +- const char setboardCmd[] = "setboard "; +- unsigned int setboardLen = strlen(setboardCmd); +- strcpy( data, setboardCmd ); +- int i=0; +- while ( epdline[i] != '\n' ) { +- if (i + setboardLen < MAXSTR - 1) { +- data[i+setboardLen] = epdline[i]; +- ++i; +- } else { +- printf(_("Error reading contents of file '%s'.\n"), token[1] ); +- break; +- } +- } +- data[i+setboardLen] = '\0'; +- SetDataToEngine( data ); +- SetAutoGo( true ); +- } ++ printf(_("Error reading EPD file '%s'.\n"), epd_filename ); + } + } + } +@@ -468,49 +507,22 @@ void cmd_otim(void) + */ + void cmd_pgnload(void) + { ++ const char *pgn_filename = token[1]; + char data[MAXSTR]=""; +- char epdline[MAXSTR]=""; + +- char *s = load_pgn_as_epd( token[1], epdline, 0 ); +- if ( s == NULL ) { +- printf( _("Incorrect epd file.\n") ); +- return; +- } +- +- strcpy( data, "setboard " ); +- int i=0; +- while ( epdline[i] != '\n' ) { +- data[i+9] = epdline[i]; +- ++i; +- } +- data[i+9] = '\0'; +- SetDataToEngine( data ); +- SetAutoGo( true ); + pgnloaded = 0; ++ if (build_setboard_cmd_from_pgn_file(data, pgn_filename)) { ++ SetDataToEngine( data ); ++ SetAutoGo( true ); ++ } else { ++ printf( _("Error loading PGN file '%s'.\n"), pgn_filename ); ++ } + } + + /* See comment above in cmd_pgnload about PGN -> EPD conversion. */ + void cmd_pgnreplay(void) + { +- char data[MAXSTR]=""; +- char epdline[MAXSTR]=""; +- +- char *s = load_pgn_as_epd( token[1], epdline, 1 ); +- if ( s == NULL ) { +- printf( _("Incorrect epd file.\n") ); +- return; +- } +- +- strcpy( data, "setboard " ); +- int i=0; +- while ( epdline[i] != '\n' ) { +- data[i+9] = epdline[i]; +- ++i; +- } +- data[i+9] = '\0'; +- +- SetDataToEngine( data ); +- SetAutoGo( true ); ++ cmd_pgnload(); + + pgnloaded = 1; + pgncnt = GameCnt; diff -Nru gnuchess-6.2.7/debian/patches/series gnuchess-6.2.7/debian/patches/series --- gnuchess-6.2.7/debian/patches/series 1970-01-01 01:00:00.000000000 +0100 +++ gnuchess-6.2.7/debian/patches/series 2025-01-01 16:57:41.000000000 +0100 @@ -0,0 +1 @@ +CVE-2021-30184.patch