]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1913: if_python: undefined behaviour for function pointers v9.0.1913
authorYee Cheng Chin <ychin.git@gmail.com>
Tue, 19 Sep 2023 18:30:22 +0000 (20:30 +0200)
committerChristian Brabandt <cb@256bit.org>
Tue, 19 Sep 2023 18:30:22 +0000 (20:30 +0200)
Problem:  if_python: undefined behaviour for function pointers
Solution: Fix if_python undefined behavior for function pointer casts

Identified by clang 17 UBSAN (see #12745). Make sure to cast function
pointers with the same signature only.

closes: #13122

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
src/if_py_both.h
src/if_python.c
src/if_python3.c
src/version.c

index 6e2ef26e7dee9c4be94b71d3db76c78c48b41085..0723a5ff9b403092ecc9ec900f8032686d8eabcb 100644 (file)
@@ -5962,14 +5962,15 @@ static struct PyMethodDef CurrentMethods[] = {
 };
 
     static void
-init_range_cmd(exarg_T *eap)
+init_range_cmd(void *arg)
 {
+    exarg_T *eap = (exarg_T*)arg;
     RangeStart = eap->line1;
     RangeEnd = eap->line2;
 }
 
     static void
-init_range_eval(typval_T *rettv UNUSED)
+init_range_eval(void *rettv UNUSED)
 {
     RangeStart = (PyInt) curwin->w_cursor.lnum;
     RangeEnd = RangeStart;
index 863e9319df6c1b6c39bdee2e877223fbe07f1cc6..c6b14fec277104893f76a7f2f8dd59228db3c9bb 100644 (file)
@@ -1103,7 +1103,7 @@ ex_python(exarg_T *eap)
            p_pyx = 2;
 
        DoPyCommand(script == NULL ? (char *) eap->arg : (char *) script,
-               (rangeinitializer) init_range_cmd,
+               init_range_cmd,
                (runner) run_cmd,
                (void *) eap);
     }
@@ -1154,7 +1154,7 @@ ex_pyfile(exarg_T *eap)
 
     // Execute the file
     DoPyCommand(buffer,
-           (rangeinitializer) init_range_cmd,
+           init_range_cmd,
            (runner) run_cmd,
            (void *) eap);
 }
@@ -1166,7 +1166,7 @@ ex_pydo(exarg_T *eap)
        p_pyx = 2;
 
     DoPyCommand((char *)eap->arg,
-           (rangeinitializer) init_range_cmd,
+           init_range_cmd,
            (runner)run_do,
            (void *)eap);
 }
@@ -1524,7 +1524,7 @@ FunctionGetattr(PyObject *self, char *name)
 do_pyeval(char_u *str, typval_T *rettv)
 {
     DoPyCommand((char *) str,
-           (rangeinitializer) init_range_eval,
+           init_range_eval,
            (runner) run_eval,
            (void *) rettv);
     if (rettv->v_type == VAR_UNKNOWN)
index c6d1acc198c9bd0434cb7d991c44f0d9f0ec2765..d2ffada0c40988f2c9e93ae99ba4d3225dd0f182 100644 (file)
@@ -1425,7 +1425,7 @@ ex_py3(exarg_T *eap)
            p_pyx = 3;
 
        DoPyCommand(script == NULL ? (char *) eap->arg : (char *) script,
-               (rangeinitializer) init_range_cmd,
+               init_range_cmd,
                (runner) run_cmd,
                (void *) eap);
     }
@@ -1491,7 +1491,7 @@ ex_py3file(exarg_T *eap)
 
     // Execute the file
     DoPyCommand(buffer,
-           (rangeinitializer) init_range_cmd,
+           init_range_cmd,
            (runner) run_cmd,
            (void *) eap);
 }
@@ -1503,7 +1503,7 @@ ex_py3do(exarg_T *eap)
        p_pyx = 3;
 
     DoPyCommand((char *)eap->arg,
-           (rangeinitializer)init_range_cmd,
+           init_range_cmd,
            (runner)run_do,
            (void *)eap);
 }
@@ -2053,7 +2053,7 @@ LineToString(const char *str)
 do_py3eval(char_u *str, typval_T *rettv)
 {
     DoPyCommand((char *) str,
-           (rangeinitializer) init_range_eval,
+           init_range_eval,
            (runner) run_eval,
            (void *) rettv);
     if (rettv->v_type == VAR_UNKNOWN)
index 42ac8083b0d06c8b7f1cdb32a9c8d39a2755a4ce..c43b28f3732008fb6d25d1b8165c29299b1aa41b 100644 (file)
@@ -699,6 +699,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1913,
 /**/
     1912,
 /**/