Index: lib/xray/xray_inmemory_log.cc =================================================================== --- lib/xray/xray_inmemory_log.cc +++ lib/xray/xray_inmemory_log.cc @@ -112,14 +112,21 @@ // Open a temporary file once for the log. static char TmpFilename[256] = {}; static char TmpWildcardPattern[] = "XXXXXX"; - auto E = internal_strncat(TmpFilename, flags()->xray_logfile_base, - sizeof(TmpFilename) - 10); - if (static_cast((E + 6) - TmpFilename) > (sizeof(TmpFilename) - 1)) { - Report("XRay log file base too long: %s\n", flags()->xray_logfile_base); + auto Argv = GetArgv(); + const char *Progname = Argv[0] == nullptr ? "unknown" : Argv[0]; + const char *LastSlash = internal_strrchr(Progname, '/'); + + if (LastSlash != nullptr) + Progname = LastSlash + 1; + + int Need = internal_snprintf(TmpFilename, sizeof(TmpFilename), "%.*s%.*s.%s", + 120, flags()->xray_logfile_base, + 120, Progname, + TmpWildcardPattern); + if (Need > int(sizeof(TmpFilename))) { + Report("XRay log file name too long (%d): %s\n", Need, TmpFilename); return -1; } - internal_strncat(TmpFilename, TmpWildcardPattern, - sizeof(TmpWildcardPattern) - 1); int Fd = mkstemp(TmpFilename); if (Fd == -1) { Report("XRay: Failed opening temporary file '%s'; not logging events.\n",