Format check for ExtraOptions of setup dialog.
authorHiroshi Inoue <h-inoue@dream.email.ne.jp>
Fri, 23 Apr 2021 11:25:31 +0000 (20:25 +0900)
committerHiroshi Inoue <h-inoue@dream.email.ne.jp>
Fri, 30 Apr 2021 08:19:58 +0000 (17:19 +0900)
dlg_specific.c
dlg_wingui.c

index 6ac37f7785b217f2f8099eadc18e089f2d42a434..3f2192c91f9d454f39230709ac346992a49137b4 100644 (file)
@@ -71,9 +71,9 @@ UInt4 getExtraOptions(const ConnInfo *ci)
    return flag;
 }
 
-CSTR   hex_format = "%x%s";
-CSTR   dec_format = "%u%s";
-CSTR   octal_format = "%o%s";
+CSTR   hex_format = "%x%1s";
+CSTR   dec_format = "%u%1s";
+CSTR   octal_format = "%o%1s";
 static UInt4   replaceExtraOptions(ConnInfo *ci, UInt4 flag, BOOL overwrite)
 {
    if (overwrite)
@@ -102,6 +102,7 @@ static UInt4    replaceExtraOptions(ConnInfo *ci, UInt4 flag, BOOL overwrite)
 BOOL   setExtraOptions(ConnInfo *ci, const char *optstr, const char *format)
 {
    UInt4   flag = 0, cnt;
+   char    dummy[2];
 
    if (!format)
    {
@@ -126,9 +127,9 @@ BOOL    setExtraOptions(ConnInfo *ci, const char *optstr, const char *format)
            format = dec_format;
    }
 
-   if (cnt = sscanf(optstr, format, &flag), cnt < 1)
+   if (cnt = sscanf(optstr, format, &flag, dummy), cnt < 1) // format error
        return FALSE;
-   else if (cnt > 1)
+   else if (cnt > 1) // format error
        return FALSE;
    replaceExtraOptions(ci, flag, TRUE);
    return TRUE;
index 6f2476ee844f5bca51500fff40384935577aa52e..276d8f160e784fc9920b446606a28306e917326e 100644 (file)
@@ -515,6 +515,13 @@ ds_options_update(HWND hdlg, ConnInfo *ci)
 
    MYLOG(0, "entering got ci=%p\n", ci);
 
+   /* ExtraOptions */
+   GetDlgItemText(hdlg, DS_EXTRA_OPTIONS, buf, sizeof(buf));
+   if (!setExtraOptions(ci, buf, NULL))
+   {
+       MessageBox(hdlg, "ExtraOptions must be hex, decimal or octal", "Format error", MB_ICONEXCLAMATION | MB_OK);
+       return 1;
+   }
    /* Readonly */
    ITOA_FIXED(ci->onlyread, IsDlgButtonChecked(hdlg, DS_READONLY));
 
@@ -555,8 +562,6 @@ ds_options_update(HWND hdlg, ConnInfo *ci)
    else
        ci->numeric_as = DEFAULT_NUMERIC_AS;
 
-   GetDlgItemText(hdlg, DS_EXTRA_OPTIONS, buf, sizeof(buf));
-   setExtraOptions(ci, buf, NULL);
    ITOA_FIXED(ci->show_system_tables, IsDlgButtonChecked(hdlg, DS_SHOWSYSTEMTABLES));
 
    ITOA_FIXED(ci->row_versioning, IsDlgButtonChecked(hdlg, DS_ROWVERSIONING));