From f489f555f88dc05c30dfd7b9d4ca10a0c9c852f8 Mon Sep 17 00:00:00 2001 From: The Cheaterman Date: Mon, 16 Aug 2021 16:55:49 +0200 Subject: [PATCH 1/4] Fix assertion failure when calling strval("") --- source/amx/amxstring.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/amx/amxstring.c b/source/amx/amxstring.c index e1ff9a41..2d2d4734 100644 --- a/source/amx/amxstring.c +++ b/source/amx/amxstring.c @@ -570,6 +570,8 @@ static cell AMX_NATIVE_CALL n_strval(AMX *amx,const cell *params) /* get parameters */ amx_GetAddr(amx,params[1],&cstr); amx_StrLen(cstr,&len); + if (len == 0) + return 0; if ((unsigned)params[0]>=2*sizeof(cell)) offset=params[2]; if (offset<0) From f399a8fd35f370c1b1f7165e8578fb47fef3af71 Mon Sep 17 00:00:00 2001 From: The Cheaterman Date: Mon, 16 Aug 2021 19:57:23 +0200 Subject: [PATCH 2/4] Don't raise AMX error when amx_printstring() fails, return 0 instead Leave an opportunity for function users to handle errors. --- source/amx/amxcons.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/amx/amxcons.c b/source/amx/amxcons.c index 51cd3278..a99cca5a 100644 --- a/source/amx/amxcons.c +++ b/source/amx/amxcons.c @@ -866,7 +866,7 @@ int amx_printstring(AMX *amx,cell *cstr,AMX_FMTINFO *info) case 0: assert(info!=NULL && info->params!=NULL); if (paramidx>=info->numparams) /* insufficient parameters passed */ - amx_RaiseError(amx, AMX_ERR_NATIVE); + return 0; break; } /* switch */ if (j==0) @@ -889,7 +889,7 @@ int amx_printstring(AMX *amx,cell *cstr,AMX_FMTINFO *info) case 0: assert(info!=NULL && info->params!=NULL); if (paramidx>=info->numparams) /* insufficient parameters passed */ - amx_RaiseError(amx, AMX_ERR_NATIVE); + return 0; break; } /* switch */ } /* for */ From 5cc51dda84125bd083e1ea48be1ae10876057838 Mon Sep 17 00:00:00 2001 From: The Cheaterman Date: Mon, 16 Aug 2021 21:30:18 +0200 Subject: [PATCH 3/4] Amend f399a8 behavior to enable better error detection by users --- source/amx/amxcons.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/source/amx/amxcons.c b/source/amx/amxcons.c index a99cca5a..53357146 100644 --- a/source/amx/amxcons.c +++ b/source/amx/amxcons.c @@ -866,7 +866,7 @@ int amx_printstring(AMX *amx,cell *cstr,AMX_FMTINFO *info) case 0: assert(info!=NULL && info->params!=NULL); if (paramidx>=info->numparams) /* insufficient parameters passed */ - return 0; + return paramidx - 1; break; } /* switch */ if (j==0) @@ -889,7 +889,7 @@ int amx_printstring(AMX *amx,cell *cstr,AMX_FMTINFO *info) case 0: assert(info!=NULL && info->params!=NULL); if (paramidx>=info->numparams) /* insufficient parameters passed */ - return 0; + return paramidx - 1; break; } /* switch */ } /* for */ @@ -897,6 +897,11 @@ int amx_printstring(AMX *amx,cell *cstr,AMX_FMTINFO *info) } /* if (info==NULL || info->params==NULL) */ + if(info != NULL) { + if(paramidx < info->numparams) + return INT_MAX; + } + return paramidx; } From cf94c5ce58685e934a55105533984f0240515e5c Mon Sep 17 00:00:00 2001 From: The Cheaterman Date: Fri, 20 Aug 2021 19:22:00 +0200 Subject: [PATCH 4/4] As Y_Less said on Discord, we can STILL raise an AMX error Let's have our detailed error-reporting cake, and eat it too! --- source/amx/amxcons.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/source/amx/amxcons.c b/source/amx/amxcons.c index 53357146..0890907e 100644 --- a/source/amx/amxcons.c +++ b/source/amx/amxcons.c @@ -865,8 +865,10 @@ int amx_printstring(AMX *amx,cell *cstr,AMX_FMTINFO *info) break; case 0: assert(info!=NULL && info->params!=NULL); - if (paramidx>=info->numparams) /* insufficient parameters passed */ + if (paramidx>=info->numparams) { /* insufficient parameters passed */ + amx_RaiseError(amx, AMX_ERR_NATIVE); return paramidx - 1; + } break; } /* switch */ if (j==0) @@ -888,8 +890,10 @@ int amx_printstring(AMX *amx,cell *cstr,AMX_FMTINFO *info) break; case 0: assert(info!=NULL && info->params!=NULL); - if (paramidx>=info->numparams) /* insufficient parameters passed */ + if (paramidx>=info->numparams) { /* insufficient parameters passed */ + amx_RaiseError(amx, AMX_ERR_NATIVE); return paramidx - 1; + } break; } /* switch */ } /* for */ @@ -897,9 +901,12 @@ int amx_printstring(AMX *amx,cell *cstr,AMX_FMTINFO *info) } /* if (info==NULL || info->params==NULL) */ - if(info != NULL) { - if(paramidx < info->numparams) - return INT_MAX; + if( + info != NULL + && paramidx < info->numparams + ) { + amx_RaiseError(amx, AMX_ERR_NATIVE); + return INT_MAX; } return paramidx;