Add safeguard against buffer overflow when calling scanf.
authorYann Dirson <ydirson@free.fr>
Tue, 15 Oct 2013 21:58:43 +0000 (23:58 +0200)
committerYann Dirson <ydirson@free.fr>
Sat, 19 Oct 2013 13:45:21 +0000 (15:45 +0200)
gnushogi/commondsp.c
gnushogi/cursesdsp.c
gnushogi/cursesdsp.h
gnushogi/dspwrappers.c
gnushogi/dspwrappers.h
gnushogi/rawdsp.c
gnushogi/rawdsp.h

index 36cc789..ea38293 100644 (file)
@@ -449,7 +449,7 @@ GetGame(void)
     } else {
         /* Enter file name */
         ShowMessage(CP[63]);
-        RequestInputString(fname);
+        RequestInputString(fname, sizeof(fname)-1);
     }
 
     /* shogi.000 */
@@ -674,7 +674,7 @@ SaveGame(void)
     } else {
         /* Enter file name */
         ShowMessage(CP[63]);
-        RequestInputString(fname);
+        RequestInputString(fname, sizeof(fname)-1);
     }
 
     if (fname[0] == '\0')        /* shogi.000 */
@@ -818,7 +818,7 @@ GetXGame(void)
 
     /* Enter file name */
     ShowMessage(CP[63]);
-    RequestInputString(fname);
+    RequestInputString(fname, sizeof(fname)-1);
 
     if (fname[0] == '\0') /* XSHOGI.position.read */
         strcpy(fname, CP[205]);
@@ -946,7 +946,7 @@ SaveXGame(void)
 
     /* Enter file name */
     ShowMessage(CP[63]);
-    RequestInputString(fname);
+    RequestInputString(fname, sizeof(fname)-1);
 
     if (fname[0] == '\0') /* XSHOGI.position.read */
         strcpy(fname, CP[205]);
@@ -1024,7 +1024,7 @@ BookSave(void)
     } else {
         /* Enter file name */
         ShowMessage(CP[63]);
-        RequestInputString(fname);
+        RequestInputString(fname, sizeof(fname)-1);
     }
 
     if (fname[0] == '\0')
index dd6b10f..27a2f72 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <ctype.h>
 #include <signal.h>
+#include <stdio.h>
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -162,9 +163,9 @@ Curses_Printf(const char *format, ...)
 
 
 void
-Curses_RequestInputString(char* buffer)
+Curses_doRequestInputString(const char* fmt, char* buffer)
 {
-    FLUSH_SCANW("%s", buffer);
+    FLUSH_SCANW(fmt, buffer);
 }
 
 
index a83338f..8ad5554 100644 (file)
@@ -59,7 +59,7 @@ void Curses_ShowGameType(void);
 void Curses_ShowLine(unsigned short *bstline);
 void Curses_ShowMessage(char *s);
 void Curses_Printf(const char *format, ...);
-void Curses_RequestInputString(char* buffer);
+void Curses_doRequestInputString(const char* fmt, char* buffer);
 void Curses_ShowPatternCount(short side, short n);
 void Curses_ShowPostnValue(short sq);
 void Curses_ShowPostnValues(void);
index 10b06b4..8a7a0cf 100644 (file)
@@ -38,6 +38,7 @@
 #include "cursesdsp.h"
 
 #include <stdarg.h>
+#include <stdio.h>
 
 #define CASE_DSP_RAW(func,args) \
   case DISPLAY_RAW:             \
@@ -99,7 +100,6 @@ DISPLAY_VOIDFUNC(ShowGameType)
 DISPLAY_FUNC(ShowLine, (unsigned short *bstline), (bstline))
 DISPLAY_FUNC(ShowMessage, (char *s), (s))
 DISPLAY_STDARGFUNC(Printf, (const char *format, ...), format, (format, ap))
-DISPLAY_FUNC(RequestInputString, (char* buffer), (buffer))
 DISPLAY_FUNC(ShowPatternCount, (short side, short n), (side, n))
 DISPLAY_FUNC(ShowPostnValue, (short sq), (sq))
 DISPLAY_VOIDFUNC(ShowPostnValues)
@@ -110,3 +110,17 @@ DISPLAY_VOIDFUNC(ShowStage)
 DISPLAY_FUNC(TerminateSearch, (int sig), (sig))
 DISPLAY_FUNC(UpdateDisplay, (short f, short t, short redraw, short isspec), (f, t, redraw, isspec))
 DISPLAY_VOIDFUNC(help)
+
+DISPLAY_FUNC(doRequestInputString, (const char* fmt, char* buffer), (fmt, buffer))
+void RequestInputString(char* buffer, unsigned bufsize)
+{
+    static char fmt[10];
+    int ret = snprintf(fmt, sizeof(fmt), "%%%us", bufsize);
+    if (ret >= sizeof(fmt)) {
+        fprintf(stderr,
+                "Insufficient format-buffer size in %s for bufsize=%u\n",
+                __FUNCTION__, bufsize);
+        exit(1);
+    }
+    doRequestInputString(fmt, buffer);
+}
index a1d4f17..52d21a7 100644 (file)
@@ -57,7 +57,7 @@ extern void ShowGameType(void);
 extern void ShowLine(unsigned short *bstline);
 extern void ShowMessage(char *s);
 extern void Printf(const char *format, ...);
-extern void RequestInputString(char* buffer);
+extern void RequestInputString(char* buffer, unsigned bufsize);
 extern void ShowPatternCount(short side, short n);
 extern void ShowPostnValue(short sq);
 extern void ShowPostnValues(void);
index e073bae..8512633 100644 (file)
@@ -133,9 +133,9 @@ Raw_Printf(const char *format, ...)
 }
 
 void
-Raw_RequestInputString(char* buffer)
+Raw_doRequestInputString(const char* fmt, char* buffer)
 {
-    scanf("%s", buffer);
+    scanf(fmt, buffer);
 }
 
 
index 9f22a6b..0a9be68 100644 (file)
@@ -59,7 +59,7 @@ void Raw_ShowGameType(void);
 void Raw_ShowLine(unsigned short *bstline);
 void Raw_ShowMessage(char *s);
 void Raw_Printf(const char *format, ...);
-void Raw_RequestInputString(char* buffer);
+void Raw_doRequestInputString(const char* fmt, char* buffer);
 void Raw_ShowPatternCount(short side, short n);
 void Raw_ShowPostnValue(short sq);
 void Raw_ShowPostnValues(void);