From fc933d4a371b22c6d62ab9fa58f12843963abe41 Mon Sep 17 00:00:00 2001 From: jpff Date: Sun, 20 May 2018 15:22:25 +0100 Subject: [PATCH] Correct cases where there ould be fpt overflow related to NOT_AN_INSTRUMENT --- Engine/linevent.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/Engine/linevent.c b/Engine/linevent.c index 0444843f079..821bd677eef 100644 --- a/Engine/linevent.c +++ b/Engine/linevent.c @@ -464,18 +464,21 @@ int eventOpcode_(CSOUND *csound, LINEVENT *p, int insname, char p1) /* IV - Oct 31 2002: allow string argument */ if (evt.pcnt > 0) { if (insname) { + int res; if (UNLIKELY(evt.opcod != 'i' && evt.opcod != 'q' && opcod != 'd')) return csound->PerfError(csound, p->h.insdshead, "%s", Str(errmsg_2)); - evt.p[1] = csound->strarg2insno(csound, - ((STRINGDAT*) p->args[1])->data, 1); - if (UNLIKELY(evt.p[1] == NOT_AN_INSTRUMENT)) return NOTOK; + res = csound->strarg2insno(csound, ((STRINGDAT*) p->args[1])->data, 1); + if (UNLIKELY(res == NOT_AN_INSTRUMENT)) return NOTOK; + evt.p[1] = (MYFLT) res; evt.strarg = NULL; evt.scnt = 0; } else { + int res; if (csound->ISSTRCOD(*p->args[1])) { - evt.p[1] = csound->strarg2insno(csound, - get_arg_string(csound, *p->args[1]), 1); - if (UNLIKELY(evt.p[1] != NOT_AN_INSTRUMENT)) return NOTOK; + res = csound->strarg2insno(csound, + get_arg_string(csound, *p->args[1]), 1); + if (UNLIKELY(res == NOT_AN_INSTRUMENT)) return NOTOK; + evt.p[1] = (MYFLT)res; } else evt.p[1] = *p->args[1]; evt.strarg = NULL; evt.scnt = 0; } @@ -531,10 +534,12 @@ int eventOpcodeI_(CSOUND *csound, LINEVENT *p, int insname, char p1) /* IV - Oct 31 2002: allow string argument */ if (evt.pcnt > 0) { if (insname) { + int res; if (UNLIKELY(evt.opcod != 'i' && evt.opcod != 'q' && opcod != 'd')) return csound->InitError(csound, "%s", Str(errmsg_2)); - evt.p[1] = csound->strarg2insno(csound,((STRINGDAT *)p->args[1])->data, 1); - if (UNLIKELY(evt.p[1] == NOT_AN_INSTRUMENT)) return NOTOK; + res = csound->strarg2insno(csound,((STRINGDAT *)p->args[1])->data, 1); + if (UNLIKELY(res == NOT_AN_INSTRUMENT)) return NOTOK; + evt.p[1] = (MYFLT)res; evt.strarg = NULL; evt.scnt = 0; for (i = 2; i <= evt.pcnt; i++) evt.p[i] = *p->args[i]; @@ -542,9 +547,10 @@ int eventOpcodeI_(CSOUND *csound, LINEVENT *p, int insname, char p1) else { evt.strarg = NULL; evt.scnt = 0; if (csound->ISSTRCOD(*p->args[1])) { - evt.p[1] = csound->strarg2insno(csound, - get_arg_string(csound, *p->args[1]), 1); + int res = csound->strarg2insno(csound, + get_arg_string(csound, *p->args[1]), 1); if (UNLIKELY(evt.p[1] == NOT_AN_INSTRUMENT)) return NOTOK; + evt.p[1] = (MYFLT)res; } else evt.p[1] = *p->args[1]; for (i = 2; i <= evt.pcnt; i++) evt.p[i] = *p->args[i]; @@ -591,17 +597,20 @@ int instanceOpcode_(CSOUND *csound, LINEVENT2 *p, int insname) /* IV - Oct 31 2002: allow string argument */ if (evt.pcnt > 0) { + int res; if (insname) { - evt.p[1] = csound->strarg2insno(csound, - ((STRINGDAT*) p->args[0])->data, 1); + res = csound->strarg2insno(csound, + ((STRINGDAT*) p->args[0])->data, 1); if (UNLIKELY(evt.p[1] == NOT_AN_INSTRUMENT)) return NOTOK; + evt.p[1] = (MYFLT)res; evt.strarg = NULL; evt.scnt = 0; } else { if (csound->ISSTRCOD(*p->args[0])) { - evt.p[1] = csound->strarg2insno(csound, - get_arg_string(csound, *p->args[0]), 1); + res = csound->strarg2insno(csound, + get_arg_string(csound, *p->args[0]), 1); if (UNLIKELY(evt.p[1] == NOT_AN_INSTRUMENT)) return NOTOK; + evt.p[1] = (MYFLT)res; } else evt.p[1] = *p->args[0]; evt.strarg = NULL; evt.scnt = 0; }