Always perform signature searches on an unaltered copy of the binary. This avoids signature mismatches if the same function is detoured twice and thus the first bytes of the function were replaced by the detour.
* Start using Github Actions
Build on windows and linux. Cannot build for macos,
since the builders only support xcode 10+ which dropped
x86 support.
* Build sourcepawn tooling as separate package
Upload build artifacts containing only spcomp and the includes.
This adds a new `--scripting-only` flag to configure.py which skips
everything and goes straight to building spcomp and packaging the
include folder with it.
* Only run the workflows for the master branch
* Split common operations into PackageHelpers file
Don't duplicate the code for packaging releases for the tooling-only packages. Instead use a common `PackageHelpers` class which provides the functionality common to both packages.
This replaces the explicit list of files to package with a directory scan, so we don't have to list them all.
The pgsql sql-init-scripts were missing from the release package before, so they were added here as well. Three scripts from the testsuite were missing from the explicit list (mapdisplayname, floats, findmap), so they're now included.
* Fix Python 2 compatibility
os.scandir is Python 3 only.
If lookup of the patch location failed, don't turn on responding to A2S_Rules queries. Otherwise we'll see the log getting spammed with too large packet sizes again. #1447
* Add PostgreSQL DBI extension
Bug #3849
This adds a postgresql database driver called "pgsql".
The ambuild script changes could be very wrong ;)
* Add pgsql support to clientprefs
This was originally made by Lyfe in bug 3849! Thanks for that.
PostgreSQL supports the 'IF NOT EXISTS' clause when creating tables
since version 9.1, so i've switched to use that.
* Added pgsql support to sql-admin-manager
* Add --pgsql-path to ambuild configure
* More ambuild fixes
* Compile libpq with ambuild
* Try to generate postgres configs
* Add dummy config file
* More ambuild fixes
* Get errorcode and readable error in preparequery
No need to stop getting the errorCode, if the error string should be
retrieved. Just return both!
* Fix indentation in AMBuilderPGSQL
* Try to patch and configure postgres through ambuild
* Revert "Try to patch and configure postgres through ambuild"
This reverts commit 68dfc82b8eb0ce11f621af67ec247b5f47e4a189.
* Update to use PostgreSQL 9.4
* Move postgres preparation into seperate script
Fetching, preparing and configuring of the postgresql sourcecode
is done in a seperate prepare_postgresql.sh script now.
People can use this script for their manual builds,
if they don't want to use checkout-deps.sh.
* Add patch to configure.in again
Remove the version check for autoconf in postgres 9.4 too.
* Nit: Support older objdirs for hasPgSql ambuild option
* Update to use PostgreSQL 9.4.6
* Use newer AMTL and PGSQL 9.6
* Fix threaded queries
When running the thread part of a query, it already gets the atomic
lock. Don't try to get it twice in that case.
Use a seperate lock to protect access to the lastInsertID and
lastAffectedRows variables.
* Fix SetCharacterSet racing with threaded queries
Same fix like in the mysql driver.
* Use ke::AutoLock for lastInsertID mutex
* Fix fetching one more row than available
Don't try to access a row that doesn't exist when iterating rows.
* Improve sanity checks on column access
Don't call libpq functions with out of bounds column indices.
* Let QuoteString return false if quoting failed
* Fix build for x64 support changes and update to PGSQL 9.6.9
* Fix linux build
* Fix building of connection options string
snprintf doesn't support overlapping buffers.
* Update to PostgreSQL 9.6.15
* Fix crash after freeing first IQuery object
* Fix code crunch
* Fix memory leak, cleanup
* Nuke MSVC project and Makefile
* Remove unsupported numeric error codes
* Use STL threads
* Add prebuilt libpq for Linux and Windows
* Restore and fix version.rc file
* Add PostgreSQL build instructions
* Add prebuilt libpq for Mac
* Add win64 libpq build
This is version 9.6.15 since that's what I still had laying around.
* Fix buildscript
* Fix x64 build on linux and mac
Co-authored-by: Erik Minekus <[email protected]>
* Harden plugin loading path requirements
Restrict loading of plugins to the `sourcemod/plugins` folder and require the `.smx` file extension.
Symlinks inside the `plugins` folder are fine.
This behavior was abused as part of justCTF 2020 in the PainterHell challenge by cypis. Thank you!
* Restrict extension loading to extensions folder
* Add NULL file extension check in LoadExtension
hi @KyleS
* Prefer python3 over python(2) in checkout-deps
We require Python 3 and don't want to accidentally use Python 2 if both are available.
* Use python3 in travis build
* Install python3-pip package on travis trusty image
* Fix pip detection in checkout-deps.sh
This bug was found as part of justCTF 2020 in the PainterHell challenge by cypis. Thank you!
Admins with the root flag could inject their own queries towards the admin database connection.
The sql-admin-manager plugin is disabled by default.
* Add basic Insurgency support on Windows x64
This allows SourceMod to load on x64 Insurgency. There are still a lot of variable truncation warnings that have to be dealt with.
* Fix 32bit builds
* Compile MySQL extension as well
The hack for __iob_func being removed from the core runtime, but required by the old mysql we're building against can be simplified a lot due to the `_ReturnAddress` intrinsic available since MSVC 2015.
* Don't include the offset we want to extract in the signature
SourceMod doesn't support Source 1 Dota 2 anymore and neither Source 2. Speed up CI by only cloning the hl2sdks that are tested.
This adds a `-s sdk1,sdk2` parameter to the checkout-deps.sh script similar to the `-SDKs` option of the powershell script to select specific sdks to update instead of all.
When creating our own "owned and local" protobuf message in `StartProtobufMessage`, `m_FakeEngineBuffer` is used to track that message. In `EndMessage` the message is optionally converted to a "private" one with the right abi on osx and passed to the engine's `SendUserMessage`. On linux and windows the same message as in the `m_FakeEngineBuffer` is passed though without conversion. `engine->SendUserMessage` has a vtable hook which sets `m_FakeEngineBuffer` to the passed argument.
`m_FakeEngineBuffer` frees the message it previously held, since it's "owned" from `StartProtobufMessage`, but that's the same one that's passed in as argument so a use-after-free in the engine happens when the now-freed message pointer is forwarded to the real `SendUserMessage` in the engine.
The message created in `StartProtobufMessage` wasn't free'd at all when hooks are blocked too. This fix moves the message buffer into a local variable which is destroyed at the end of the function.
Fixes#1286 and #1296
The allocation size was still updated to the bigger size even if memory allocation failed. Trying to write to the supposedly available new space would overflow the heap and crash. Fixes#1233
In #705 SourceMod received support for x64 binaries. The `IBinTools` interface was updated to call functions in 64bit binaries. The `PassInfo` struct's size was increased and the `Create(V)Call()` functions signatures changed, thus making the interface incompatible for consumers which were compiled against an earlier version.
`SMInterface::IsVersionCompatible` wasn't adjusted to that fact, so extensions compiled against pre SM 1.10 could request an `IBinTools` interface pointer, but crash when they try to use it.
This change makes requests to older interface versions invalid, thus letting `RequestInterface` return `NULL` for older extensions. It doesn't fix the backwards incompatibility, but at least makes the problem more blatant, so extensions can handle it themselves.
When lookup of a more specialized entry in the maplists.cfg failed, it wouldn't fallback to the "default" section, but just try to parse the same section again.
The `TopMenu` methodmap natives weren't marked as optional if the extension was optional like the other normal natives.
The `Regex` natives weren't marked as optional at all before if the regex extension was included optionally.
This makes the error message cleaner in case topmenus aren't loaded.
```
adminmenu.smx (Admin Menu): Required extension "TopMenus" file("topmenus.ext") not running
basebans.smx (Basic Ban Commands): Native "TopMenu.Display" was not found
```
Prepared statements can return multiple result sets since MySQL 5.5. That can happen when calling stored procedures using `CALL x();`.
This change removes the previous caching of result bindings, since the number of fields in a result can differ from result set to result set. This could potentially have a negative impact on prepared statements always only returning one result set, since the result binding buffers are recreated everytime the statement is executed instead of once. That difference should be negligible.
Fixes#823.
MySQL defines its own timespec_t. Official mysql builds are built using VS2013, so you still need to compile the client library yourself to be able to link it, but this change makes the dbi extension compatible with future versions already.
This adds support for platform specific custom key values in the `Keys` section in game config files. Now you can have different values for the same key per platform.
Previously you could only add general key values in gamedata files that were the same on all platforms like
```
"Keys"
{
"key" "value"
}
```
This patch allows you to set the value per platform in a subsection like
```
"Keys"
{
"key"
{
"windows" "value1"
"linux" "value2"
"mac" "value3"
}
}
```
Looking up the `key` will return the value matching the host platform.
Valid core config options aren't cached to be retrieved using `GetCoreConfigValue` after they've been loaded from core.cfg or set through the `sm config` root console menu.
E.g. `sm config ServerLang` would return `[SM] No such config option "ServerLang" exists.` all the time.
Stop notifying other listeners if the config key was consumed, but don't skip adding it to the cache.
Also fix `FollowCSGOServerGuidelines` always showing as unhandled command when being changed through `sm config FollowCSGOServerGuidelines yes`.
Be able to push NULL_[VECTOR|STRING] to a forward or direct function call.
The callee can check the parameter using the IsNullVector/IsNullString natives.
* Add OnPlayerRunCmdPost forward
Allow plugins to catch the values that are actually used by the game
after some eventual changes by other plugins.
* Add |const| qualifier to arrays in OnPlayerRunCmdPost forward
Be able to push NULL_[VECTOR|STRING] to a forward or direct function call.
The callee can check the parameter using the IsNullVector/IsNullString natives.
Add GetArrayBlockSize and GetStackBlockSize and equivalent properties to
the methodmaps to get the blocksize the array or stack was created with.
Useful when getting array handles from other plugins you didn't create
yourself.
Regression in #583
The `CBaseHandle *` was compared to a `IHandleEntity **` always failing
instead of comparing the actual base handles.
Fixes a small typo in MatchTypeDescAsInteger too, where a FIELD_CUSTOM
could fall through badly.
If one of the queries fails in a transaction, the DBI system would only allocate an array of the size of the amount of all the successful queries before the failed one. It writes data for all the queries though effectively writing past the array bounds leading to heap corruption.
Create the right sized array!
Plugins were able to close the results handle in the threaded query
callback causing a double free crash. The access rights are setup right
before the handle is created, but weren't used.
Round end reasons in CS:GO are +1 from the ones in CS:S. The
CSRoundEnd_GameStart reason for when the OnMapTimeLeftChanged forward
should be called should be one higher than in CS:S.
SourceMod itself and thirdparty extensions call functions in plugins
without making sure it is runnable. The plugin pausing feature isn't
supported anymore and is set to get nuked #438 which will reduce the
amount of not-runnable error reports.
We can't fix every third party extension, so suppressing the error from
the logs will stop the spam until pausing is removed.
#489 can be reverted after this.
When the server crashed and the process got terminated, the SqDriver
instance was killed first (e.g. by atexit). SqDatabase tries to access
SqDriver in its destructor.
This patch tells SqDatabase to not use anything from SqDriver anymore
after SqDriver got destroyed.
Next to that, the clientprefs extension relied on the IDatabase pointer
being valid to get the driver pointer. Cache the pointer, so the dbi
system still knows the IDBThreadOperation belonged to the now gone
driver, even after the database object is gone.
Add an ICellArray interface to expose the adt_array CellArray class from
logic to core.
Add methods to ISourceMod to create and delete ICellArray instances in
logic.
Bug 6518
Starting from no plugins loaded, after the final step of the following,
basetriggers will be marked as errored because mapchooser is missing:
Load basetriggers
Load mapchooser
Unload mapchooser
Load mapchooser
Unload mapchooser
We lose the SP_NTVFLAG_OPTIONAL when removing a WeakNative. The
__pl_mapchooser_SetNTVOptional() is only called in basetriggers when it
is loaded. It adds the OPTIONAL flag to the mapchooser natives the
basetrigger plugin uses.
When mapchooser is loaded, the native is overwritten and the OPTIONAL
flag consumed (WeakNative registered), but not preserved. Later when
mapchooser is unloaded the WeakNative is removed in
CNativeOwner::UnbindWeakRef, but the OPTIONAL flag isn't added again.
The next time mapchooser is loaded, the natives aren't optional anymore
and will cause a real dependency.
The change in ShareSys isn't needed to fix the error, but is included to
keep the SP_NTVFLAG_OPTIONAL flag consistent.
The buffer for menu options was 64 chars. That limit can easily be
reached by some utf8 string which would get truncated. Double the buffer
size to 128 chars.
This avoids spam of "Plugin not runnable" exceptions on shutdown or
plugin unload.
When re/unloading a plugin which has other ones depending on it, like
the adminmenu, It pauses the depending plugins putting them in an
"Depends on plugin: %s" error state. ForwardSys doesn't remove them from
the forward lists on pause, specially the global forwards, and still
tries to call all the global forwards like OnPlayerRunCmd and
OnLibraryAdded etc. on the paused plugins. Executing functions in paused
runtimes has been ignored in the VM before introducing the "Exception"
mechanism, but now they're all logged.
This adds checks to make sure the plugin is runnable before calling a
function. (Stolen from #438)
When unloading a plugin no plugin is allowed to execute code. There's
been some flawed logic in the scheduling, leading it to bail out if the
plugin was marked for scheduled unloading..
Also change the "error" message of `sm plugins unload` to something
nice.
Fix regression in ad7d920
GetMenuStyleHandle(MenuStyle_Radio) crashes games, which don't support
the radio menu style. The style is never added to the menu manager, if
it's not supported, so GetMenuStyleHandle tries to call IsSupported on a
nullptr
Looks like the |weapon| parameter went missing during the switch to the
transitional syntax.
There was no -Post typedef including the |damagecustom| bit at all too.
I doubt we're interested in the filename of every single file
contained in the mysql archive when it's decompressed.
It bloats up the travis build log.
Change the meaning of Plugin_Failed status to indicate, that the plugin
can't recover from the error.
Make sure those previously loaded plugins are shown correctly in sm
plugins info x.
When a plugin calls SetFailState it is paused and all natives it
registered are unavailable. Other plugins, which depend on those natives
keep running and error whenever they try to call those natives.
This correctly sets the dependent plugins to an error state as if the
plugin which called SetFailState was unloaded.
Adds type safety to CDataPack. Cells can't be read as Float anymore. Now
you're able to store a function pointer in a datapack and be sure the
pointer can't be read as a cell and a cell can't be read as a function
pointer.
commit cd0d31805c
Author: Peace-Maker <[email protected]>
Date: Wed May 28 03:07:25 2014 +0200
Ignore \ ctrlchar in lexing
commit cf617a4d20
Author: Peace-Maker <[email protected]>
Date: Tue May 27 13:32:59 2014 +0200
Add string literal concatenation using ellipses "..." (bug 4261)
Backported the changes CompuPhase did to the compiler to support string
literal concatenation including all fixes in later commits from r30 on.
http://code.google.com/p/pawnscript/source/detail?r=30
Pawn uses ellipses "..." to concatenate so it looks like this:
#define PROJECT_AUTHOR "Greyscale"
#define PROJECT_COPYRIGHT "Copyright (C) 2010 " ... PROJECT_AUTHOR
This would result in PROJECT_COPYRIGHT being defined as
"Copyright (C) 2010 Greyscale"
While i've been at it, that stringizing a macro parameter feature was
ported too.
From the changelog for version 3.3.4026
(http://www.compuphase.com/pawn/pawnhistory.htm):
The macro substition processor now recognizes the "#" character for
"stringizing" a parameter. For example, if you have the definition
#define log(%1) #%1
Then the expression log(test) will result in "test".
Note that concatenation of literal strings requires an ellipsis in pawn
(which is different than C/C++). So to combine the parameter with
literal strings, use a syntax like:
#define log(%1) "logging: " ... #%1 ... "\n"
The stringize operator is only available in the replacement text of a
macro.
Doing
PrintToServer(log(hello));
would print
logging: hello\n
commit c1b064c9232553045f6f5bfaf7df0feb6ceb4571
Author: Peace-Maker <[email protected]>
Date: Wed May 28 03:16:22 2014 +0200
Coding style adjustments
commit 37a16dbba24cc2035fb8838be8729067cb9bc13a
Author: Peace-Maker <[email protected]>
Date: Wed May 28 03:03:25 2014 +0200
Load core.phrases before calling OnLibraryAdded
commit 676ac951111c7e8f565debbd4316850a4c4a8d00
Author: Peace-Maker <[email protected]>
Date: Tue May 27 13:18:48 2014 +0200
Call OnLibraryAdded for all available librarys (bug 5925)
When loading multiple plugins at once (on server start or mapchange)
OnLibraryAdded is only called for libraries which are loaded after the
current plugin. The plugin isn't informed about the libraries that were
added before its OnPluginStart forward was called.
This patch calls OnLibraryAdded for all already registered libraries the
current plugin has missed.
Backported the changes CompuPhase did to the compiler to support string
literal concatenation including all fixes in later commits from r30 on.
http://code.google.com/p/pawnscript/source/detail?r=30
Pawn uses ellipses "..." to concatenate so it looks like this:
#define PROJECT_AUTHOR "Greyscale"
#define PROJECT_COPYRIGHT "Copyright (C) 2010 " ... PROJECT_AUTHOR
This would result in PROJECT_COPYRIGHT being defined as
"Copyright (C) 2010 Greyscale"
While i've been at it, that stringizing a macro parameter feature was
ported too.
From the changelog for version 3.3.4026
(http://www.compuphase.com/pawn/pawnhistory.htm):
The macro substition processor now recognizes the "#" character for
"stringizing" a parameter. For example, if you have the definition
#define log(%1) #%1
Then the expression log(test) will result in "test".
Note that concatenation of literal strings requires an ellipsis in pawn
(which is different than C/C++). So to combine the parameter with
literal strings, use a syntax like:
#define log(%1) "logging: " ... #%1 ... "\n"
The stringize operator is only available in the replacement text of a
macro.
Doing
PrintToServer(log(hello));
would print
logging: hello\n