From 7e14730b83d2504a454ad5dfbfb4b4f8700f4dc5 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Sat, 21 Jan 2017 14:55:53 +0000 Subject: [PATCH] Include 'build info' in all --version text and About boxes. This shows the build platform (32- vs 64-bit in particular, and also whether Unix GTK builds were compiled with or without the X11 pieces), what compiler was used to build the binary, and any interesting build options that might have been set on the make command line (especially, but not limited to, the security-damaging ones like NO_SECURITY or UNPROTECT). This will probably be useful all over the place, but in particular it should allow the different Windows binaries to be told apart! Commits 21101c739 and 2eb952ca3 laid the groundwork for this, by allowing the various About boxes to contain free text and also ensuring they could be copied and pasted easily as part of a bug report. --- cmdgen.c | 4 ++- misc.c | 62 +++++++++++++++++++++++++++++++++++++++++++++ misc.h | 2 ++ pscp.c | 4 ++- psftp.c | 4 ++- unix/gtkdlg.c | 5 ++-- unix/gtkmain.c | 5 +++- unix/unix.h | 11 ++++++++ unix/uxpgnt.c | 4 ++- unix/uxplink.c | 4 ++- windows/pageant.rc | 8 +++--- windows/puttygen.rc | 8 +++--- windows/win_res.rc2 | 10 ++++---- windows/windlg.c | 6 +++-- windows/winpgen.c | 6 +++-- windows/winpgnt.c | 6 +++-- windows/winplink.c | 4 ++- windows/winstuff.h | 2 ++ 18 files changed, 127 insertions(+), 28 deletions(-) diff --git a/cmdgen.c b/cmdgen.c index 265e5adc..d6c1f721 100644 --- a/cmdgen.c +++ b/cmdgen.c @@ -129,7 +129,9 @@ void sk_cleanup(void) void showversion(void) { - printf("puttygen: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("puttygen: %s\n%s", ver, buildinfo_text); + sfree(buildinfo_text); } void usage(int standalone) diff --git a/misc.c b/misc.c index 7a7cc194..06baf8d6 100644 --- a/misc.c +++ b/misc.c @@ -1147,3 +1147,65 @@ int strendswith(const char *s, const char *t) size_t slen = strlen(s), tlen = strlen(t); return slen >= tlen && !strcmp(s + (slen - tlen), t); } + +char *buildinfo(const char *newline) +{ + strbuf *buf = strbuf_new(); + + strbuf_catf(buf, "Build platform: %d-bit %s", + (int)(CHAR_BIT * sizeof(void *)), + BUILDINFO_PLATFORM); + +#ifdef __clang_version__ + strbuf_catf(buf, "%sCompiler: clang %s", newline, __clang_version__); +#elif defined __GNUC__ && defined __VERSION__ + strbuf_catf(buf, "%sCompiler: gcc %s", newline, __VERSION__); +#elif defined _MSC_VER + strbuf_catf(buf, "%sCompiler: Visual Studio", newline); +#if _MSC_VER == 1900 + strbuf_catf(buf, " 2015 / MSVC++ 14.0"); +#elif _MSC_VER == 1800 + strbuf_catf(buf, " 2013 / MSVC++ 12.0"); +#elif _MSC_VER == 1700 + strbuf_catf(buf, " 2012 / MSVC++ 11.0"); +#elif _MSC_VER == 1600 + strbuf_catf(buf, " 2010 / MSVC++ 10.0"); +#elif _MSC_VER == 1500 + strbuf_catf(buf, " 2008 / MSVC++ 9.0"); +#elif _MSC_VER == 1400 + strbuf_catf(buf, " 2005 / MSVC++ 8.0"); +#elif _MSC_VER == 1310 + strbuf_catf(buf, " 2003 / MSVC++ 7.1"); +#else + strbuf_catf(buf, ", unrecognised version"); +#endif + strbuf_catf(buf, " (_MSC_VER=%d)", (int)_MSC_VER); +#endif + +#ifdef NO_SECURITY + strbuf_catf(buf, "%sBuild option: NO_SECURITY", newline); +#endif +#ifdef NO_SECUREZEROMEMORY + strbuf_catf(buf, "%sBuild option: NO_SECUREZEROMEMORY", newline); +#endif +#ifdef NO_IPV6 + strbuf_catf(buf, "%sBuild option: NO_IPV6", newline); +#endif +#ifdef NO_GSSAPI + strbuf_catf(buf, "%sBuild option: NO_GSSAPI", newline); +#endif +#ifdef STATIC_GSSAPI + strbuf_catf(buf, "%sBuild option: STATIC_GSSAPI", newline); +#endif +#ifdef UNPROTECT + strbuf_catf(buf, "%sBuild option: UNPROTECT", newline); +#endif +#ifdef FUZZING + strbuf_catf(buf, "%sBuild option: FUZZING", newline); +#endif +#ifdef DEBUG + strbuf_catf(buf, "%sBuild option: DEBUG", newline); +#endif + + return strbuf_to_str(buf); +} diff --git a/misc.h b/misc.h index 9ab21a0b..32e7bc32 100644 --- a/misc.h +++ b/misc.h @@ -118,6 +118,8 @@ int get_ssh_uint32(int *datalen, const void **data, unsigned *ret); * form, check if it equals an ordinary C zero-terminated string. */ int match_ssh_id(int stringlen, const void *string, const char *id); +char *buildinfo(const char *newline); + /* * Debugging functions. * diff --git a/pscp.c b/pscp.c index 9ea423fd..25a2a737 100644 --- a/pscp.c +++ b/pscp.c @@ -2263,7 +2263,9 @@ static void usage(void) void version(void) { - printf("pscp: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("pscp: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); cleanup_exit(1); } diff --git a/psftp.c b/psftp.c index d35b8fa3..513f202b 100644 --- a/psftp.c +++ b/psftp.c @@ -2665,7 +2665,9 @@ static void usage(void) static void version(void) { - printf("psftp: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("psftp: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); cleanup_exit(1); } diff --git a/unix/gtkdlg.c b/unix/gtkdlg.c index 34773137..4eb4b010 100644 --- a/unix/gtkdlg.c +++ b/unix/gtkdlg.c @@ -3701,9 +3701,10 @@ void about_box(void *window) gtk_widget_show(w); { + char *buildinfo_text = buildinfo("\n"); char *label_text = dupprintf - ("%s\n\n%s\n\n%s", - appname, ver, + ("%s\n\n%s\n\n%s\n\n%s", + appname, ver, buildinfo_text, "Copyright " SHORT_COPYRIGHT_DETAILS ". All rights reserved"); w = gtk_label_new(label_text); gtk_label_set_justify(GTK_LABEL(w), GTK_JUSTIFY_CENTER); diff --git a/unix/gtkmain.c b/unix/gtkmain.c index a7b4a4e9..c681b93d 100644 --- a/unix/gtkmain.c +++ b/unix/gtkmain.c @@ -287,10 +287,13 @@ static void help(FILE *fp) { } static void version(FILE *fp) { - if(fprintf(fp, "%s: %s\n", appname, ver) < 0 || fflush(fp) < 0) { + char *buildinfo_text = buildinfo("\n"); + if(fprintf(fp, "%s: %s\n%s\n", appname, ver, buildinfo_text) < 0 || + fflush(fp) < 0) { perror("output error"); exit(1); } + sfree(buildinfo_text); } static struct gui_data *the_inst; diff --git a/unix/unix.h b/unix/unix.h index 029d32ff..76ec7531 100644 --- a/unix/unix.h +++ b/unix/unix.h @@ -30,6 +30,17 @@ #define META_MANUAL_MASK (GDK_MOD1_MASK) #define JUST_USE_GTK_CLIPBOARD_UTF8 /* low-level gdk_selection_* fails */ #define DEFAULT_CLIPBOARD GDK_SELECTION_CLIPBOARD /* OS X has no PRIMARY */ + +#define BUILDINFO_PLATFORM "OS X (GTK)" + +#elif defined NOT_X_WINDOWS + +#define BUILDINFO_PLATFORM "Unix (pure GTK)" + +#else + +#define BUILDINFO_PLATFORM "Unix (GTK + X11)" + #endif struct Filename { diff --git a/unix/uxpgnt.c b/unix/uxpgnt.c index 4f3dde2d..14f1366c 100644 --- a/unix/uxpgnt.c +++ b/unix/uxpgnt.c @@ -141,7 +141,9 @@ static void usage(void) static void version(void) { - printf("pageant: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("pageant: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); exit(1); } diff --git a/unix/uxplink.c b/unix/uxplink.c index 82693ba8..bf55ea73 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -594,7 +594,9 @@ static void usage(void) static void version(void) { - printf("plink: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("plink: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); exit(1); } diff --git a/windows/pageant.rc b/windows/pageant.rc index 91432cc7..b1756a64 100644 --- a/windows/pageant.rc +++ b/windows/pageant.rc @@ -36,14 +36,14 @@ BEGIN END /* Accelerators used: cl */ -213 DIALOG DISCARDABLE 140, 40, 214, 74 +213 DIALOG DISCARDABLE 140, 40, 214, 90 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pageant" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Close", IDOK, 160, 56, 48, 14 - PUSHBUTTON "View &Licence", 101, 6, 56, 70, 14 - EDITTEXT 1000, 10, 6, 194, 48, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE + DEFPUSHBUTTON "&Close", IDOK, 160, 72, 48, 14 + PUSHBUTTON "View &Licence", 101, 6, 72, 70, 14 + EDITTEXT 1000, 10, 6, 194, 64, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE END /* No accelerators used */ diff --git a/windows/puttygen.rc b/windows/puttygen.rc index 5c61ee7d..cd4072ea 100644 --- a/windows/puttygen.rc +++ b/windows/puttygen.rc @@ -29,14 +29,14 @@ BEGIN END /* Accelerators used: cl */ -213 DIALOG DISCARDABLE 140, 40, 214, 74 +213 DIALOG DISCARDABLE 140, 40, 214, 90 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About PuTTYgen" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Close", IDOK, 160, 56, 48, 14 - PUSHBUTTON "View &Licence", 101, 6, 56, 70, 14 - EDITTEXT 1000, 10, 6, 194, 48, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE + DEFPUSHBUTTON "&Close", IDOK, 160, 72, 48, 14 + PUSHBUTTON "View &Licence", 101, 6, 72, 70, 14 + EDITTEXT 1000, 10, 6, 194, 64, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE END /* No accelerators used */ diff --git a/windows/win_res.rc2 b/windows/win_res.rc2 index 28e66320..92d39cd5 100644 --- a/windows/win_res.rc2 +++ b/windows/win_res.rc2 @@ -16,15 +16,15 @@ IDI_MAINICON ICON "putty.ico" IDI_CFGICON ICON "puttycfg.ico" /* Accelerators used: clw */ -IDD_ABOUTBOX DIALOG DISCARDABLE 140, 40, 214, 74 +IDD_ABOUTBOX DIALOG DISCARDABLE 140, 40, 270, 106 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About PuTTY" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Close", IDOK, 160, 56, 48, 14 - PUSHBUTTON "View &Licence", IDA_LICENCE, 6, 56, 70, 14 - PUSHBUTTON "Visit &Web Site", IDA_WEB, 84, 56, 70, 14 - EDITTEXT IDA_TEXT, 10, 6, 194, 48, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE + DEFPUSHBUTTON "&Close", IDOK, 216, 88, 48, 14 + PUSHBUTTON "View &Licence", IDA_LICENCE, 6, 88, 70, 14 + PUSHBUTTON "Visit &Web Site", IDA_WEB, 140, 88, 70, 14 + EDITTEXT IDA_TEXT, 10, 6, 250, 80, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE END /* Accelerators used: aco */ diff --git a/windows/windlg.c b/windows/windlg.c index 17327866..e29f1291 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -200,10 +200,12 @@ static INT_PTR CALLBACK AboutProc(HWND hwnd, UINT msg, SetWindowText(hwnd, str); sfree(str); { + char *buildinfo_text = buildinfo("\r\n"); char *text = dupprintf - ("%s\r\n\r\n%s\r\n\r\n%s", - appname, ver, + ("%s\r\n\r\n%s\r\n\r\n%s\r\n\r\n%s", + appname, ver, buildinfo_text, "\251 " SHORT_COPYRIGHT_DETAILS ". All rights reserved."); + sfree(buildinfo_text); SetDlgItemText(hwnd, IDA_TEXT, text); sfree(text); } diff --git a/windows/winpgen.c b/windows/winpgen.c index 8468f805..4dd8272a 100644 --- a/windows/winpgen.c +++ b/windows/winpgen.c @@ -297,10 +297,12 @@ static INT_PTR CALLBACK AboutProc(HWND hwnd, UINT msg, } { + char *buildinfo_text = buildinfo("\r\n"); char *text = dupprintf - ("PuTTYgen\r\n\r\n%s\r\n\r\n%s", - ver, + ("PuTTYgen\r\n\r\n%s\r\n\r\n%s\r\n\r\n%s", + ver, buildinfo_text, "\251 " SHORT_COPYRIGHT_DETAILS ". All rights reserved."); + sfree(buildinfo_text); SetDlgItemText(hwnd, 1000, text); sfree(text); } diff --git a/windows/winpgnt.c b/windows/winpgnt.c index 06c5fac1..604d092f 100644 --- a/windows/winpgnt.c +++ b/windows/winpgnt.c @@ -152,10 +152,12 @@ static INT_PTR CALLBACK AboutProc(HWND hwnd, UINT msg, switch (msg) { case WM_INITDIALOG: { + char *buildinfo_text = buildinfo("\r\n"); char *text = dupprintf - ("Pageant\r\n\r\n%s\r\n\r\n%s", - ver, + ("Pageant\r\n\r\n%s\r\n\r\n%s\r\n\r\n%s", + ver, buildinfo_text, "\251 " SHORT_COPYRIGHT_DETAILS ". All rights reserved."); + sfree(buildinfo_text); SetDlgItemText(hwnd, 1000, text); sfree(text); } diff --git a/windows/winplink.c b/windows/winplink.c index 3b20a0ab..d916104e 100644 --- a/windows/winplink.c +++ b/windows/winplink.c @@ -223,7 +223,9 @@ static void usage(void) static void version(void) { - printf("plink: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("plink: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); exit(1); } diff --git a/windows/winstuff.h b/windows/winstuff.h index b9602243..9829f087 100644 --- a/windows/winstuff.h +++ b/windows/winstuff.h @@ -27,6 +27,8 @@ #include "winhelp.h" +#define BUILDINFO_PLATFORM "Windows" + struct Filename { char *path; }; -- 2.45.1