comparison src/evalfunc.c @ 32321:b9a8d1c453e1 v9.0.1492

patch 9.0.1492: using uninitialized memory when argument is missing Commit: https://github.com/vim/vim/commit/b7f2270bab102d68f83a6300699b7f98efad81f2 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Apr 27 16:24:07 2023 +0100 patch 9.0.1492: using uninitialized memory when argument is missing Problem: Using uninitialized memory when argument is missing. Solution: Check there are sufficient arguments before the base. (closes #12302)
author Bram Moolenaar <Bram@vim.org>
date Thu, 27 Apr 2023 17:30:05 +0200
parents 8d6f53a07ffd
children 3c2c1cb61004
comparison
equal deleted inserted replaced
32320:45c1a530fa76 32321:b9a8d1c453e1
3132 if (argcount + 1 > global_functions[fi].f_max_argc) 3132 if (argcount + 1 > global_functions[fi].f_max_argc)
3133 return FCERR_TOOMANY; 3133 return FCERR_TOOMANY;
3134 3134
3135 if (global_functions[fi].f_argtype == FEARG_2) 3135 if (global_functions[fi].f_argtype == FEARG_2)
3136 { 3136 {
3137 if (argcount < 1)
3138 return FCERR_TOOFEW;
3139
3137 // base value goes second 3140 // base value goes second
3138 argv[0] = argvars[0]; 3141 argv[0] = argvars[0];
3139 argv[1] = *basetv; 3142 argv[1] = *basetv;
3140 for (int i = 1; i < argcount; ++i) 3143 for (int i = 1; i < argcount; ++i)
3141 argv[i + 1] = argvars[i]; 3144 argv[i + 1] = argvars[i];
3142 } 3145 }
3143 else if (global_functions[fi].f_argtype == FEARG_3) 3146 else if (global_functions[fi].f_argtype == FEARG_3)
3144 { 3147 {
3148 if (argcount < 2)
3149 return FCERR_TOOFEW;
3150
3145 // base value goes third 3151 // base value goes third
3146 argv[0] = argvars[0]; 3152 argv[0] = argvars[0];
3147 argv[1] = argvars[1]; 3153 argv[1] = argvars[1];
3148 argv[2] = *basetv; 3154 argv[2] = *basetv;
3149 for (int i = 2; i < argcount; ++i) 3155 for (int i = 2; i < argcount; ++i)
3150 argv[i + 1] = argvars[i]; 3156 argv[i + 1] = argvars[i];
3151 } 3157 }
3152 else if (global_functions[fi].f_argtype == FEARG_4) 3158 else if (global_functions[fi].f_argtype == FEARG_4)
3153 { 3159 {
3160 if (argcount < 3)
3161 return FCERR_TOOFEW;
3162
3154 // base value goes fourth 3163 // base value goes fourth
3155 argv[0] = argvars[0]; 3164 argv[0] = argvars[0];
3156 argv[1] = argvars[1]; 3165 argv[1] = argvars[1];
3157 argv[2] = argvars[2]; 3166 argv[2] = argvars[2];
3158 argv[3] = *basetv; 3167 argv[3] = *basetv;