To: vim-dev@vim.org Subject: Patch 7.2.149 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.2.149 Problem: Using return value of function that doesn't return a value results in reading uninitialized memory. Solution: Set the default to return zero. Make cursor() return -1 on failure. Let complete() return an empty string in case of an error. (partly by Dominique Pelle) Files: runtime/doc/eval.txt, src/eval.c *** ../vim-7.2.148/runtime/doc/eval.txt Tue Dec 9 10:56:50 2008 --- runtime/doc/eval.txt Sun Mar 22 14:28:49 2009 *************** *** 2414,2419 **** --- 2419,2425 ---- When 'virtualedit' is used {off} specifies the offset in screen columns from the start of the character. E.g., a position within a or after the last character. + Returns 0 when the position could be set, -1 otherwise. deepcopy({expr}[, {noref}]) *deepcopy()* *E698* *************** *** 4516,4521 **** --- 4526,4532 ---- should also work to move files across file systems. The result is a Number, which is 0 if the file was renamed successfully, and non-zero when the renaming failed. + NOTE: If {to} exists it is overwritten without warning. This function is not available in the |sandbox|. repeat({expr}, {count}) *repeat()* *** ../vim-7.2.148/src/eval.c Wed Feb 4 16:25:53 2009 --- src/eval.c Sun Mar 22 20:45:18 2009 *************** *** 1285,1291 **** --- 1285,1293 ---- typval_T tv; char_u *retval; garray_T ga; + #ifdef FEAT_FLOAT char_u numbuf[NUMBUFLEN]; + #endif if (eval0(arg, &tv, nextcmd, TRUE) == FAIL) retval = NULL; *************** *** 8018,8024 **** /* execute the function if no errors detected and executing */ if (evaluate && error == ERROR_NONE) { ! rettv->v_type = VAR_NUMBER; /* default is number rettv */ error = ERROR_UNKNOWN; if (!builtin_function(fname)) --- 8020,8027 ---- /* execute the function if no errors detected and executing */ if (evaluate && error == ERROR_NONE) { ! rettv->v_type = VAR_NUMBER; /* default rettv is number zero */ ! rettv->vval.v_number = 0; error = ERROR_UNKNOWN; if (!builtin_function(fname)) *************** *** 8268,8274 **** return; li = l->lv_first; } - rettv->vval.v_number = 0; /* Default: Success */ for (;;) { if (l == NULL) --- 8271,8276 ---- *************** *** 8728,8734 **** int dummy; dict_T *selfdict = NULL; - rettv->vval.v_number = 0; if (argvars[1].v_type != VAR_LIST) { EMSG(_(e_listreq)); --- 8730,8735 ---- *************** *** 9036,9048 **** if (buttons == NULL || *buttons == NUL) buttons = (char_u *)_("&Ok"); ! if (error) ! rettv->vval.v_number = 0; ! else rettv->vval.v_number = do_dialog(type, NULL, message, buttons, def, NULL); - #else - rettv->vval.v_number = 0; #endif } --- 9037,9045 ---- if (buttons == NULL || *buttons == NUL) buttons = (char_u *)_("&Ok"); ! if (!error) rettv->vval.v_number = do_dialog(type, NULL, message, buttons, def, NULL); #endif } *************** *** 9181,9195 **** } rettv->vval.v_number = cs_connection(num, dbpath, prepend); - #else - rettv->vval.v_number = 0; #endif } /* * "cursor(lnum, col)" function * ! * Moves the cursor to the specified line and column */ /*ARGSUSED*/ static void --- 9178,9191 ---- } rettv->vval.v_number = cs_connection(num, dbpath, prepend); #endif } /* * "cursor(lnum, col)" function * ! * Moves the cursor to the specified line and column. ! * Returns 0 when the position could be set, -1 otherwise. */ /*ARGSUSED*/ static void *************** *** 9202,9207 **** --- 9198,9204 ---- long coladd = 0; #endif + rettv->vval.v_number = -1; if (argvars[1].v_type == VAR_UNKNOWN) { pos_T pos; *************** *** 9246,9251 **** --- 9243,9249 ---- #endif curwin->w_set_curswant = TRUE; + rettv->vval.v_number = 0; } /* *************** *** 9291,9298 **** { #ifdef FEAT_AUTOCMD rettv->vval.v_number = did_filetype; - #else - rettv->vval.v_number = 0; #endif } --- 9289,9294 ---- *************** *** 9605,9611 **** typval_T *argvars; typval_T *rettv; { - rettv->vval.v_number = 0; if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST) { list_T *l1, *l2; --- 9601,9606 ---- *************** *** 9733,9739 **** if (check_secure()) return; - rettv->vval.v_number = 0; keys = get_tv_string(&argvars[0]); if (*keys != NUL) { --- 9728,9733 ---- *************** *** 9901,9907 **** char_u *ermsg = map ? (char_u *)"map()" : (char_u *)"filter()"; int save_did_emsg; - rettv->vval.v_number = 0; if (argvars[0].v_type == VAR_LIST) { if ((l = argvars[0].vval.v_list) == NULL --- 9895,9900 ---- *************** *** 10084,10091 **** else rettv->vval.v_number = (varnumber_T)f; } - else - rettv->vval.v_number = 0; } /* --- 10077,10082 ---- *************** *** 10219,10227 **** lnum = get_tv_lnum(argvars); if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count) rettv->vval.v_number = foldLevel(lnum); - else #endif - rettv->vval.v_number = 0; } /* --- 10210,10216 ---- *************** *** 10337,10343 **** typval_T *argvars; typval_T *rettv; { - rettv->vval.v_number = 0; #ifdef FEAT_GUI if (gui.in_use) gui_mch_set_foreground(); --- 10326,10331 ---- *************** *** 10359,10365 **** { char_u *s; - rettv->vval.v_number = 0; s = get_tv_string(&argvars[0]); if (s == NULL || *s == NUL || VIM_ISDIGIT(*s)) EMSG2(_(e_invarg2), s); --- 10347,10352 ---- *************** *** 10429,10437 **** if (tv == NULL) { ! if (argvars[2].v_type == VAR_UNKNOWN) ! rettv->vval.v_number = 0; ! else copy_tv(&argvars[2], rettv); } else --- 10416,10422 ---- if (tv == NULL) { ! if (argvars[2].v_type != VAR_UNKNOWN) copy_tv(&argvars[2], rettv); } else *************** *** 10456,10468 **** { char_u *p; ! if (retlist) ! { ! if (rettv_list_alloc(rettv) == FAIL) ! return; ! } ! else ! rettv->vval.v_number = 0; if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0) return; --- 10441,10448 ---- { char_u *p; ! if (retlist && rettv_list_alloc(rettv) == FAIL) ! return; if (buf == NULL || buf->b_ml.ml_mfp == NULL || start < 0) return; *************** *** 11009,11016 **** dict_T *dict; matchitem_T *cur = curwin->w_match_head; - rettv->vval.v_number = 0; - if (rettv_list_alloc(rettv) == OK) { while (cur != NULL) --- 10989,10994 ---- *************** *** 11089,11095 **** win_T *wp; #endif - rettv->vval.v_number = 0; #ifdef FEAT_QUICKFIX if (rettv_list_alloc(rettv) == OK) { --- 11067,11072 ---- *************** *** 11935,11941 **** typval_T *argvars; typval_T *rettv; { - rettv->vval.v_number = 0; if (argvars[0].v_type != VAR_DICT) { EMSG(_(e_dictreq)); --- 11912,11917 ---- *************** *** 12052,12059 **** n = del_history_entry(get_histtype(str), get_tv_string_buf(&argvars[1], buf)); rettv->vval.v_number = n; - #else - rettv->vval.v_number = 0; #endif } --- 12028,12033 ---- *************** *** 12415,12421 **** int selected; int mouse_used; - rettv->vval.v_number = 0; #ifdef NO_CONSOLE_INPUT /* While starting up, there is no place to enter text. */ if (no_console_input()) --- 12389,12394 ---- *************** *** 12464,12470 **** --ga_userinput.ga_len; restore_typeahead((tasave_T *)(ga_userinput.ga_data) + ga_userinput.ga_len); ! rettv->vval.v_number = 0; /* OK */ } else if (p_verbose > 1) { --- 12437,12443 ---- --ga_userinput.ga_len; restore_typeahead((tasave_T *)(ga_userinput.ga_data) + ga_userinput.ga_len); ! /* default return is zero == OK */ } else if (p_verbose > 1) { *************** *** 12488,12494 **** save_typeahead((tasave_T *)(ga_userinput.ga_data) + ga_userinput.ga_len); ++ga_userinput.ga_len; ! rettv->vval.v_number = 0; /* OK */ } else rettv->vval.v_number = 1; /* Failed */ --- 12461,12467 ---- save_typeahead((tasave_T *)(ga_userinput.ga_data) + ga_userinput.ga_len); ++ga_userinput.ga_len; ! /* default return is zero == OK */ } else rettv->vval.v_number = 1; /* Failed */ *************** *** 12522,12528 **** list_T *l; int error = FALSE; - rettv->vval.v_number = 0; if (argvars[0].v_type != VAR_LIST) EMSG2(_(e_listarg), "insert()"); else if ((l = argvars[0].vval.v_list) != NULL --- 12495,12500 ---- *************** *** 12641,12647 **** dict_T *d; int todo; - rettv->vval.v_number = 0; if (argvars[0].v_type != VAR_DICT) { EMSG(_(e_dictreq)); --- 12613,12618 ---- *************** *** 12729,12735 **** garray_T ga; char_u *sep; - rettv->vval.v_number = 0; if (argvars[0].v_type != VAR_LIST) { EMSG(_(e_listreq)); --- 12700,12705 ---- *************** *** 12827,12835 **** #endif rettv->v_type = type; ! if (type == VAR_NUMBER) ! rettv->vval.v_number = 0; ! else rettv->vval.v_string = NULL; if (check_restricted() || check_secure()) --- 12797,12803 ---- #endif rettv->v_type = type; ! if (type != VAR_NUMBER) rettv->vval.v_string = NULL; if (check_restricted() || check_secure()) *************** *** 13770,13776 **** typval_T *argvars; typval_T *rettv; { - rettv->vval.v_number = 0; #ifdef FEAT_INS_EXPAND if (pum_visible()) rettv->vval.v_number = 1; --- 13738,13743 ---- *************** *** 13804,13810 **** stride = get_tv_number_chk(&argvars[2], &error); } - rettv->vval.v_number = 0; if (error) return; /* type error; errmsg already given */ if (stride == 0) --- 13771,13776 ---- *************** *** 14193,14199 **** typval_T *argvars; typval_T *rettv; { - rettv->vval.v_number = 0; #ifdef FEAT_CLIENTSERVER # ifdef WIN32 /* On Win32 it's done in this application. */ --- 14159,14164 ---- *************** *** 14249,14255 **** rettv->vval.v_number = (s != NULL); } # else - rettv->vval.v_number = 0; if (check_connection() == FAIL) return; --- 14214,14219 ---- *************** *** 14338,14344 **** dict_T *d; dictitem_T *di; - rettv->vval.v_number = 0; if (argvars[0].v_type == VAR_DICT) { if (argvars[2].v_type != VAR_UNKNOWN) --- 14302,14307 ---- *************** *** 14696,14702 **** list_T *l; listitem_T *li, *ni; - rettv->vval.v_number = 0; if (argvars[0].v_type != VAR_LIST) EMSG2(_(e_listarg), "reverse()"); else if ((l = argvars[0].vval.v_list) != NULL --- 14659,14664 ---- *************** *** 15048,15055 **** int lnum = 0; int col = 0; - rettv->vval.v_number = 0; - if (rettv_list_alloc(rettv) == FAIL) return; --- 15010,15015 ---- *************** *** 15236,15243 **** int n; int flags = 0; - rettv->vval.v_number = 0; - if (rettv_list_alloc(rettv) == FAIL) return; --- 15196,15201 ---- *************** *** 15323,15330 **** typval_T *varp; char_u nbuf[NUMBUFLEN]; - rettv->vval.v_number = 0; - if (check_restricted() || check_secure()) return; (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ --- 15281,15286 ---- *************** *** 15404,15410 **** else line = get_tv_string_chk(&argvars[1]); ! rettv->vval.v_number = 0; /* OK */ for (;;) { if (l != NULL) --- 15360,15366 ---- else line = get_tv_string_chk(&argvars[1]); ! /* default result is zero == OK */ for (;;) { if (l != NULL) *************** *** 15717,15722 **** --- 15673,15679 ---- /* * "setwinvar()" and "settabwinvar()" functions */ + /*ARGSUSED*/ static void setwinvar(argvars, rettv, off) typval_T *argvars; *************** *** 15733,15740 **** char_u nbuf[NUMBUFLEN]; tabpage_T *tp; - rettv->vval.v_number = 0; - if (check_restricted() || check_secure()) return; --- 15690,15695 ---- *************** *** 15947,15953 **** long len; long i; - rettv->vval.v_number = 0; if (argvars[0].v_type != VAR_LIST) EMSG2(_(e_listarg), "sort()"); else --- 15902,15907 ---- *************** *** 16870,16878 **** typval_T *argvars; typval_T *rettv; { ! #ifndef FEAT_WINDOWS ! rettv->vval.v_number = 0; ! #else tabpage_T *tp; win_T *wp = NULL; --- 16824,16830 ---- typval_T *argvars; typval_T *rettv; { ! #ifdef FEAT_WINDOWS tabpage_T *tp; win_T *wp = NULL; *************** *** 16884,16902 **** if (tp != NULL) wp = (tp == curtab) ? firstwin : tp->tp_firstwin; } ! if (wp == NULL) ! rettv->vval.v_number = 0; ! else { ! if (rettv_list_alloc(rettv) == FAIL) ! rettv->vval.v_number = 0; ! else ! { ! for (; wp != NULL; wp = wp->w_next) ! if (list_append_number(rettv->vval.v_list, wp->w_buffer->b_fnum) == FAIL) ! break; ! } } #endif } --- 16836,16847 ---- if (tp != NULL) wp = (tp == curtab) ? firstwin : tp->tp_firstwin; } ! if (wp != NULL && rettv_list_alloc(rettv) != FAIL) { ! for (; wp != NULL; wp = wp->w_next) ! if (list_append_number(rettv->vval.v_list, wp->w_buffer->b_fnum) == FAIL) ! break; } #endif } *************** *** 17024,17033 **** int first; if (rettv_list_alloc(rettv) == FAIL) - { - rettv->vval.v_number = 0; return; - } for (first = TRUE; ; first = FALSE) if (get_tagfname(&tn, first, fname) == FAIL --- 16969,16975 ---- *************** *** 17401,17408 **** /* A non-zero number or non-empty string argument: reset mode. */ if (non_zero_arg(&argvars[0])) curbuf->b_visual_mode_eval = NUL; - #else - rettv->vval.v_number = 0; /* return anything, it won't work anyway */ #endif } --- 17343,17348 ---- *** ../vim-7.2.148/src/version.c Wed Mar 18 19:07:09 2009 --- src/version.c Wed Apr 22 12:44:05 2009 *************** *** 678,679 **** --- 678,681 ---- { /* Add new patch number below this line */ + /**/ + 149, /**/ -- WOMAN: Well, 'ow did you become king then? ARTHUR: The Lady of the Lake, [angels sing] her arm clad in the purest shimmering samite, held aloft Excalibur from the bosom of the water signifying by Divine Providence that I, Arthur, was to carry Excalibur. [singing stops] That is why I am your king! The Quest for the Holy Grail (Monty Python) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///